> ## Documentation Index
> Fetch the complete documentation index at: https://www.usenotra.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Set the author page layout

> Sets blog.authorPage, the layout of every author page. Changes are saved as unpublished Design changes to the site's blog.json, the same draft the dashboard's Design tab shows, and go live when published with POST /v1/sites/{siteId}/publish or from the dashboard.



## OpenAPI

````yaml https://api.usenotra.com/openapi.json patch /v1/sites/{siteId}/author-page
openapi: 3.1.1
info:
  title: Notra API
  version: 1.0.0
  description: >-
    OpenAPI schema for Notra content endpoints. Use GET /v1/status for public
    reachability. Error responses include recovery guidance. Breaking changes
    ship under a new major path; deprecated operations send Deprecation and
    Sunset headers at least 90 days before removal.
servers:
  - url: https://api.usenotra.com
    description: Production
  - url: https://demo-api.usenotra.com
    description: >-
      Sandbox with sample data. Get a free sandbox key at demo.usenotra.com, no
      signup needed
security:
  - BearerAuth: []
tags:
  - name: Webhooks
    description: Manage outbound webhook subscriptions and delivery history.
  - name: Discovery
    description: Public API status and authenticated workspace discovery.
  - name: Content
    description: >-
      Manage posts, brand identities, and GitHub or Linear integrations, and
      queue content generation. Organization is inferred from the API key
      (identity.externalId).
  - name: Schedules
    description: >-
      Manage scheduled content generation. Organization is inferred from the API
      key (identity.externalId).
  - name: Event Triggers
    description: >-
      Manage event-based content generation triggered by GitHub webhooks.
      Organization is inferred from the API key (identity.externalId).
  - name: Chats
    description: >-
      Manage chat sessions. Organization is inferred from the API key
      (identity.externalId).
  - name: Skills
    description: >-
      Manage reusable writing skills. Organization is inferred from the API key
      (identity.externalId).
  - name: Feedback
    description: >-
      Collect and triage feedback submitted by AI agents. Agents post to the
      organization's feedback URL without credentials; reading and triage
      require an API key with feedback.read or feedback.write.
  - name: GEO
    description: >-
      Manage generative engine optimization: projects, tracking settings,
      prompts, prompt sequences, competitors, scans, visibility reads, content
      gaps and briefs, agent readiness and AI traffic. Project-scoped endpoints
      require the GEO plan entitlement in addition to their scope;
      organization-level ingest endpoints require only the traffic scope.
  - name: Sites
    description: >-
      Notra Sites are hosted blogs and changelogs built from a GitHub
      repository. Read Sites and their deployments, start builds, preview posts
      on a Site, open pull requests that publish posts to it, and manage
      blog.json authors and the author page through staged Design changes.
      Domains, settings, rollbacks and deletion stay in the dashboard.
externalDocs:
  description: Notra API versioning and deprecation policy
  url: https://www.usenotra.com/docs/api/versioning
paths:
  /v1/sites/{siteId}/author-page:
    patch:
      tags:
        - Sites
      summary: Set the author page layout
      description: >-
        Sets blog.authorPage, the layout of every author page. Changes are saved
        as unpublished Design changes to the site's blog.json, the same draft
        the dashboard's Design tab shows, and go live when published with POST
        /v1/sites/{siteId}/publish or from the dashboard.
      operationId: updateSiteAuthorPage
      parameters:
        - schema:
            type: string
            minLength: 1
            pattern: ^[A-Za-z0-9_-]{1,100}$
            example: site_8f2kq1
          required: true
          in: path
          name: siteId
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PatchSiteAuthorPageRequest'
      responses:
        '200':
          description: Layout saved as an unpublished change
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SiteAuthors'
        '400':
          description: Invalid path params or request body
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '403':
          description: Forbidden
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: Site or author not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '409':
          description: >-
            The site has no blog, blog.json can't be edited as it is, another
            editor changed it meanwhile, or the author is in use (code
            SITE_AUTHOR_IN_USE)
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '429':
          description: >-
            Rate limit exceeded. This endpoint allows 60 requests per 1 minute
            per API key.
          headers:
            RateLimit-Limit:
              description: Maximum requests allowed in the current window.
              schema:
                type: integer
            RateLimit-Remaining:
              description: Requests remaining in the current window.
              schema:
                type: integer
            RateLimit-Reset:
              description: Seconds until the current window resets.
              schema:
                type: integer
            Retry-After:
              description: Seconds the client should wait before retrying.
              schema:
                type: integer
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitErrorResponse'
        '503':
          description: Notra Sites or authentication is unavailable
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '504':
          description: The site's repository didn't answer in time
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  schemas:
    PatchSiteAuthorPageRequest:
      type: object
      properties:
        layout:
          type: string
          enum:
            - inline
            - stacked
      required:
        - layout
      example:
        layout: stacked
    SiteAuthors:
      type: object
      properties:
        site:
          type: object
          properties:
            id:
              type: string
            name:
              type: string
          required:
            - id
            - name
        authors:
          type: array
          items:
            $ref: '#/components/schemas/SiteAuthor'
          description: Authors in blog.json order, including unpublished changes.
        authorPage:
          type: string
          enum:
            - inline
            - stacked
          description: >-
            Layout of every author page: inline puts the avatar beside the name,
            stacked puts it above.
          example: inline
        hasUnpublishedChanges:
          type: boolean
          description: >-
            blog.json has staged Design changes that are not live yet. Publish
            them with POST /v1/sites/{siteId}/publish or from the dashboard.
          example: true
      required:
        - site
        - authors
        - authorPage
        - hasUnpublishedChanges
    ErrorResponse:
      type: object
      properties:
        error:
          type: string
        code:
          type: string
        recovery:
          type: string
      required:
        - error
    RateLimitErrorResponse:
      type: object
      properties:
        error:
          type: string
        limit:
          type: integer
          minimum: 1
        remaining:
          type: integer
          minimum: 0
        reset:
          type: integer
      required:
        - error
        - limit
        - remaining
        - reset
    SiteAuthor:
      type: object
      properties:
        id:
          type: string
          example: jane-doe
        ref:
          type: string
          description: >-
            Pass this in metadata.authorIds of PATCH /v1/posts/{postId} to
            credit the author on a blog post that publishes to this site.
          example: site:jane-doe
        name:
          type: string
          example: Jane Doe
        title:
          type:
            - string
            - 'null'
          example: Head of Product
        bio:
          type:
            - string
            - 'null'
        avatar:
          type:
            - string
            - 'null'
          description: >-
            As written in blog.json: a site path such as /images/jane.png or an
            https URL.
          example: /images/jane.png
        avatarUrl:
          type:
            - string
            - 'null'
          description: The avatar as a full URL on the live site.
          example: https://acme.notra.site/blog/images/jane.png
        url:
          type:
            - string
            - 'null'
          example: https://janedoe.dev
        x:
          type:
            - string
            - 'null'
          example: https://x.com/janedoe
        linkedin:
          type:
            - string
            - 'null'
        github:
          type:
            - string
            - 'null'
        youtube:
          type:
            - string
            - 'null'
        bluesky:
          type:
            - string
            - 'null'
        mastodon:
          type:
            - string
            - 'null'
        threads:
          type:
            - string
            - 'null'
        instagram:
          type:
            - string
            - 'null'
        live:
          type: boolean
          description: >-
            The author is in the published blog.json. False while it only exists
            in unpublished changes.
          example: true
        posts:
          type: integer
          description: Notra blog posts on this site that credit the author.
          example: 3
      required:
        - id
        - ref
        - name
        - title
        - bio
        - avatar
        - avatarUrl
        - url
        - x
        - linkedin
        - github
        - youtube
        - bluesky
        - mastodon
        - threads
        - instagram
        - live
        - posts
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API Key
      description: >-
        Send your API key in the Authorization header as Bearer API_KEY. Account
        API keys work in every workspace you belong to: send
        X-Notra-Organization-Id with the workspace id or slug to choose one.
        Workspace endpoints require it when you belong to more than one
        workspace; GET /v1/me/workspaces works without it. Organization keys
        only accept their own workspace there.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.