Scribe Documents API

The Documents API from Scribe — 2 operation(s) for documents.

OpenAPI Specification

scribe-documents-api-openapi.yml Raw ↑
openapi: 3.1.0
info:
  title: Scribe Search & Retrieval Documents API
  version: 1.0.0
  description: '

    ## Scribe Search & Retrieval API


    The Scribe Search & Retrieval API provides programmatic, read-only access to the documents in your organization''s knowledge base. It is designed for developers who want to integrate Scribe content — Scribe Documents and Knowledge Pages — into their own applications.


    ### Authentication

    All endpoints require an API key sent in the `X-API-Key` header. Each key is scoped to one or more teams; every response is restricted to content those teams can access.


    ### Endpoints

    - **Search documents** (`POST /v1/search/`) — full-text search across document name and description, with type, team, and date-range filters. Returns up to 20 results per request and is not paginated.

    - **List documents** (`GET /v1/documents/`) — paginated listing of every document accessible to the API key, ordered newest-first, with the same type, team, and date-range filters.

    - **Retrieve a document** (`GET /v1/documents/{id}/`) — fetch a single document by UUID, including per-action screenshot URLs (Scribe Documents) or structured Editor.js content (Knowledge Pages).

    - **List teams** (`GET /v1/teams/`) — every team accessible to the API key. Use the returned `id` values as `team_ids` filters on the other endpoints.


    ### Getting Started

    1. Generate an API key from the [Settings](https://scribehow.com/settings?tab=developerAccess) page. The full key is shown only once.

    2. Send it on every request as `X-API-Key: sc_1234567890abcdefg.hijklmnopqrstuvwx`.

    3. Call `GET /v1/teams/` to discover the team IDs your key can use, then call any of the document endpoints.


    ### Document Types

    - **Scribe Documents** (`type: scribe`) — step-by-step process documentation. The `actions` array contains the steps; each action may include a `screenshot_url`.

    - **Knowledge Pages** (`type: page`) — long-form reference content. The `content` field on the list and retrieve endpoints returns the page body as Editor.js JSON; `actions` is always empty.


    ### Rate Limits

    - **Per-minute limits**: a combined 300 requests/minute shared across `search` and `teams`; a combined 60 requests/minute shared across the document endpoints. Tracked per API key per source IP — clients calling from multiple egress IPs get an independent bucket on each one.

    - **Monthly limits**: vary by subscription plan and apply across all endpoints except `teams`.

    - When a limit is exceeded the API returns `429 Too Many Requests`.

    '
servers:
- url: https://public-api.scribehow.com
tags:
- name: Documents
paths:
  /v1/documents/:
    get:
      operationId: v1_get_documents
      description: Paginated list of every document accessible to your API key, ordered by creation date (newest first). Supports filtering by type, team, and creation/update date ranges. The default page size is 100 and the maximum is 100; use the `limit` and `offset` query parameters to paginate.
      summary: List documents
      parameters:
      - in: query
        name: created__gte
        schema:
          type: string
          format: date-time
        description: Created at or after (ISO-8601)
      - in: query
        name: created__lte
        schema:
          type: string
          format: date-time
        description: Created at or before (ISO-8601)
      - name: limit
        required: false
        in: query
        description: Number of results to return per page.
        schema:
          type: integer
      - name: offset
        required: false
        in: query
        description: The initial index from which to return the results.
        schema:
          type: integer
      - in: query
        name: team_ids
        schema:
          type: array
          items:
            type: string
            format: uuid
        explode: true
        style: form
      - in: query
        name: type
        schema:
          type: string
          enum:
          - page
          - scribe
        description: 'Restrict results to a single document type.


          * `page` - Knowledge Page

          * `scribe` - Scribe Document'
      - in: query
        name: updated__gte
        schema:
          type: string
          format: date-time
        description: Last meaningful user edit at or after (ISO-8601). Targets a separate column from the response `updated_at` field, which is bumped on every save.
      - in: query
        name: updated__lte
        schema:
          type: string
          format: date-time
        description: Last meaningful user edit at or before (ISO-8601). Targets a separate column from the response `updated_at` field, which is bumped on every save.
      tags:
      - Documents
      security:
      - APIKey: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaginatedDocumentDetailDBList'
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                ValidationError:
                  value:
                    field_name:
                    - Enter a valid value.
                  summary: Validation Error
                InvalidRequestData:
                  value:
                    detail: Invalid input provided.
                  summary: Invalid Request Data
          description: Bad request - invalid request data or parameters.
        '401':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                MissingAuthentication:
                  value:
                    detail: Authentication credentials were not provided.
                  summary: Missing Authentication
                InvalidAPIKey:
                  value:
                    detail: Invalid API key.
                  summary: Invalid API Key
          description: Authentication credentials were not provided or are invalid.
        '403':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                PlanNotSupported:
                  value:
                    detail: Your plan does not support Public API access.
                  summary: Plan Not Supported
          description: Access denied - your plan does not support Public API access.
        '429':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                MonthlyLimitExceeded:
                  value:
                    detail: You have exceeded your monthly limit of API calls.
                  summary: Monthly Limit Exceeded
                RateLimitExceeded:
                  value:
                    detail: Request was throttled. Expected available in 46 seconds.
                  summary: Rate Limit Exceeded
          description: Rate limit exceeded - either per-minute or monthly limit reached.
  /v1/documents/{id}/:
    get:
      operationId: v1_retrieve_document
      description: Fetch a single document by its UUID. The response includes per-action screenshot URLs for Scribe Documents and structured `content` for Knowledge Pages.
      summary: Retrieve a document
      parameters:
      - in: path
        name: id
        schema:
          type: string
          format: uuid
        required: true
      tags:
      - Documents
      security:
      - APIKey: []
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DocumentDetailDB'
          description: ''
        '400':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                ValidationError:
                  value:
                    field_name:
                    - Enter a valid value.
                  summary: Validation Error
                InvalidRequestData:
                  value:
                    detail: Invalid input provided.
                  summary: Invalid Request Data
          description: Bad request - invalid request data or parameters.
        '401':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                MissingAuthentication:
                  value:
                    detail: Authentication credentials were not provided.
                  summary: Missing Authentication
                InvalidAPIKey:
                  value:
                    detail: Invalid API key.
                  summary: Invalid API Key
          description: Authentication credentials were not provided or are invalid.
        '403':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                PlanNotSupported:
                  value:
                    detail: Your plan does not support Public API access.
                  summary: Plan Not Supported
          description: Access denied - your plan does not support Public API access.
        '429':
          content:
            application/json:
              schema:
                type: object
                additionalProperties: {}
              examples:
                MonthlyLimitExceeded:
                  value:
                    detail: You have exceeded your monthly limit of API calls.
                  summary: Monthly Limit Exceeded
                RateLimitExceeded:
                  value:
                    detail: Request was throttled. Expected available in 46 seconds.
                  summary: Rate Limit Exceeded
          description: Rate limit exceeded - either per-minute or monthly limit reached.
components:
  schemas:
    DocumentDetailDB:
      type: object
      description: A document with its full body — actions for Scribe Documents and structured content for Knowledge Pages.
      properties:
        actions:
          type: array
          items:
            $ref: '#/components/schemas/ActionDB'
          readOnly: true
          description: Steps for Scribe Documents. Always an empty array for Knowledge Pages.
        content:
          type:
          - object
          - 'null'
          additionalProperties: {}
          readOnly: true
          description: Structured Editor.js content for Knowledge Pages. `null` for Scribe Documents — use `actions` to read their step content.
        created_at:
          type: string
          format: date-time
          description: ISO-8601 timestamp of when the document was created.
        description:
          type: string
          description: Short description of the document.
        id:
          type: string
          format: uuid
          description: UUID of the document.
        link:
          type: string
          format: uri
          readOnly: true
          description: Public URL where the document can be viewed on scribehow.com.
        name:
          type: string
          description: Display name of the document.
        team:
          allOf:
          - $ref: '#/components/schemas/Team'
          description: Team that owns the document.
        type:
          allOf:
          - $ref: '#/components/schemas/TypeEnum'
          description: '`scribe` for Scribe Documents, `page` for Knowledge Pages.'
          readOnly: true
        updated_at:
          type: string
          format: date-time
          description: ISO-8601 timestamp of the last update to the document record.
        user_owner:
          oneOf:
          - $ref: '#/components/schemas/UserDB'
          - type: 'null'
          description: User who owns the document. `null` when the owner has been deleted.
      required:
      - actions
      - content
      - created_at
      - description
      - id
      - link
      - name
      - team
      - type
      - updated_at
    TypeEnum:
      enum:
      - page
      - scribe
      type: string
    PaginatedDocumentDetailDBList:
      type: object
      required:
      - count
      - results
      properties:
        count:
          type: integer
          example: 123
        next:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=400&limit=100
        previous:
          type: string
          nullable: true
          format: uri
          example: http://api.example.org/accounts/?offset=200&limit=100
        results:
          type: array
          items:
            $ref: '#/components/schemas/DocumentDetailDB'
    ActionDB:
      type: object
      properties:
        description:
          type: string
          description: Human-readable description of the action.
        id:
          type: string
          format: uuid
          description: UUID of the action (Scribe Document step).
        screenshot_url:
          type:
          - string
          - 'null'
          format: uri
          readOnly: true
          description: URL of the screenshot captured for this action. `null` when the action has no externally visible screenshot.
      required:
      - description
      - id
      - screenshot_url
    Team:
      type: object
      description: A team — used both as the owner of a document and as a filter target.
      properties:
        id:
          type: string
          format: uuid
          readOnly: true
          description: UUID of the team. Pass this as a `team_ids` filter on other endpoints.
        name:
          type: string
          readOnly: true
          description: Display name of the team.
      required:
      - id
      - name
    UserDB:
      type: object
      properties:
        email:
          type: string
          format: email
          description: Email address of the user.
        id:
          type: string
          format: uuid
          description: UUID of the user.
        name:
          type: string
          description: Full name of the user.
      required:
      - email
      - id
      - name
  securitySchemes:
    APIKey:
      type: apiKey
      in: header
      name: X-API-Key
      description: 'API key authentication. Add your API key as the header value. Example: `X-API-Key: sc_1234567890abcdefg.hijklmnopqrstuvwx`'