Outline Collections API

`Collections` represent grouping of documents in the knowledge base, they offer a way to structure information in a nested hierarchy and a level at which read and write permissions can be granted to individual users or groups of users.

OpenAPI Specification

outline-collections-api-openapi.yml Raw ↑
openapi: 3.0.0
info:
  title: Outline AccessRequests Collections API
  description: "# Introduction\n\nThe Outline API is structured in an RPC style. It enables you to\nprogramatically interact with all aspects of Outline’s data – in fact, the\nmain application is built on exactly the same API.\n\nThe API structure is available as an\n[openapi specification](https://github.com/outline/openapi) if that’s your\njam – it can be used to generate clients for most programming languages.\n\n# Making requests\n\nOutline’s API follows simple RPC style conventions where each API endpoint is\na `POST` method on `https://app.getoutline.com/api/:method`. Only HTTPS is\nsupported and all response payloads are JSON.\n\nWhen making `POST` requests, request parameters are parsed depending on\nContent-Type header. To make a call using JSON payload, you must pass\nContent-Type: application/json header, here’s an example using CURL:\n\n```\ncurl https://app.getoutline.com/api/documents.info \\\n-X 'POST' \\\n-H 'authorization: Bearer MY_API_KEY' \\\n-H 'content-type: application/json' \\\n-H 'accept: application/json' \\\n-d '{\"id\": \"outline-api-NTpezNwhUP\"}'\n```\n\nOr, with JavaScript:\n\n```javascript\nconst response = await fetch(\"https://app.getoutline.com/api/documents.info\", {\n  method: \"POST\",\n  headers: {\n    Accept: \"application/json\",\n    \"Content-Type\": \"application/json\",\n    Authorization: \"Bearer MY_API_KEY\"\n  }\n})\n\nconst body = await response.json();\nconst document = body.data;\n```\n\n# Authentication\n\n## API key\n\nYou can create new API keys under **Settings => API & Apps**. Be\ncareful when handling your keys as they allow full access to your data,\nyou should treat them like passwords and they should never be committed to\nsource control.\n\n### Usage\n\nTo authenticate with API, you should supply the API key as a \"Bearer\" token in the `Authorization` header\n(`Authorization: Bearer YOUR_API_KEY`).\n\nAPI keys can be revoked at any time by the creating user or an administrator of the workspace. If an API\nkey is revoked, any requests made with that key will return a `401 Unauthenticated` response.\n\n### Format\n\nAll API keys always begin with `ol_api_` followed by a random string of 38 letters and numbers.\n\n## OAuth 2.0\n\nOAuth 2.0 is a widely used protocol for authorization and authentication. It allows users\nto grant third-party _or_ internal applications access to their resources without sharing\ntheir credentials. To use OAuth 2.0 you need to follow these steps:\n\n1. Register your application under **Settings => Applications**\n2. Obtain an access token by exchanging the client credentials for an access token\n3. Use the access token to authenticate requests to the API\n\nSome API endpoints allow unauthenticated requests for public resources and\nthey can be called without authentication.\n\n# Scopes\n\nScopes are used to limit the access of an API key or application to specific resources. For example,\nan application may only need access to read documents, but not write them. Scopes can be global in\nthe case of `read` and `write` scopes, scoped to a namespace, scoped to an API endpoint, or use\nwildcard scopes like `documents.*`. Some examples of scopes that can be used are:\n\n## Global\n\n- `read`: Allows all read actions\n- `write`: Allows all read and write actions\n\n## Namespaced\n\n- `documents:read`: Allows all document read actions\n- `collections:write`: Allows all collection write actions\n\n## Endpoints\n\n- `documents.info`: Allows only one specific API method\n- `documents.*`: Allows all document API methods\n- `users.*`: Allows all user API methods\n\n# Errors\n\nAll successful API requests will be returned with a 200 or 201 status code\nand `ok: true` in the response payload. If there’s an error while making the\nrequest, the appropriate status code is returned with the error message:\n\n```\n{\n  \"ok\": false,\n  \"error\": \"Not Found\"\n}\n```\n\n# Pagination\n\nMost top-level API resources have support for \"list\" API methods. For instance,\nyou can list users, documents, and collections. These list methods share\ncommon parameters, taking both `limit` and `offset`.\n\nResponses will echo these parameters in the root `pagination` key, and also\ninclude a `nextPath` key which can be used as a handy shortcut to fetch the\nnext page of results. For example:\n\n```\n{\n  ok: true,\n  status: 200,\n  data: […],\n  pagination: {\n    limit: 25,\n    offset: 0,\n    nextPath: \"/api/documents.list?limit=25&offset=25\"\n  }\n}\n```\n\n# Rate limits\n\nLike most APIs, Outline has rate limits in place to prevent abuse. Endpoints\nthat mutate data are more restrictive than read-only endpoints. If you exceed\nthe rate limit for a given endpoint, you will receive a `429 Too Many Requests`\nstatus code.\n\nThe response will include a `Retry-After` header that indicates how many seconds\nyou should wait before making another request.\n\n# Policies\n\nMost API resources have associated \"policies\", these objects describe the\ncurrent authentications authorized actions related to an individual resource. It\nshould be noted that the policy \"id\" is identical to the resource it is\nrelated to, policies themselves do not have unique identifiers.\n\nFor most usecases of the API, policies can be safely ignored. Calling\nunauthorized methods will result in the appropriate response code – these can\nbe used in an interface to adjust which elements are visible.\n"
  version: 0.1.0
  contact:
    email: hello@getoutline.com
  license:
    name: BSD-3-Clause
    url: https://github.com/outline/openapi/blob/main/LICENSE
servers:
- url: https://app.getoutline.com/api
  description: Cloud hosted
- url: https://{domain}/api
  description: Self-hosted on your own server
  variables:
    domain:
      default: example.com
security:
- BearerAuth: []
- OAuth2:
  - read
  - write
tags:
- name: Collections
  description: '`Collections` represent grouping of documents in the knowledge base, they

    offer a way to structure information in a nested hierarchy and a level

    at which read and write permissions can be granted to individual users or

    groups of users.

    '
paths:
  /collections.info:
    post:
      tags:
      - Collections
      summary: Retrieve a collection
      description: Retrieve the details of a collection by its unique identifier.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: Unique identifier for the collection.
                  format: uuid
              required:
              - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Collection'
                  policies:
                    type: array
                    items:
                      $ref: '#/components/schemas/Policy'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsInfo
  /collections.documents:
    post:
      tags:
      - Collections
      summary: Retrieve a collections document structure
      description: Returns the document structure of a collection as a tree of navigation nodes, representing the hierarchy of documents within the collection.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: Unique identifier for the collection.
                  format: uuid
              required:
              - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/NavigationNode'
                    example: []
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsDocuments
  /collections.list:
    post:
      tags:
      - Collections
      summary: List all collections
      description: List all collections that the authenticated user has access to.
      requestBody:
        content:
          application/json:
            schema:
              allOf:
              - $ref: '#/components/schemas/Pagination'
              - $ref: '#/components/schemas/Sorting'
              - type: object
                properties:
                  query:
                    type: string
                    description: If set, will filter the results by collection name.
                  statusFilter:
                    type: array
                    items:
                      $ref: '#/components/schemas/CollectionStatus'
                    description: An optional array of statuses to filter by.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      $ref: '#/components/schemas/Collection'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
                  policies:
                    type: array
                    items:
                      $ref: '#/components/schemas/Policy'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsList
  /collections.create:
    post:
      tags:
      - Collections
      summary: Create a collection
      description: Create a new collection with the specified name, description, icon, color, and permission settings. Collections are used to organize documents.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  example: Human Resources
                description:
                  type: string
                  description: A brief description of the collection, markdown supported. Only one of `description` or `data` may be provided.
                  example: HR documentation is confidential and should be handled with care.
                data:
                  type: object
                  description: The collection description as a rich-text ProseMirror JSON document. Only one of `description` or `data` may be provided.
                permission:
                  $ref: '#/components/schemas/Permission'
                icon:
                  type: string
                  description: A string that represents an icon in the outline-icons package or an emoji
                color:
                  type: string
                  description: A hex color code for the collection icon
                  example: '#123123'
                sharing:
                  type: boolean
                  description: Whether public sharing of documents is allowed
                  example: false
              required:
              - name
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Collection'
                  policies:
                    type: array
                    items:
                      $ref: '#/components/schemas/Policy'
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsCreate
  /collections.update:
    post:
      tags:
      - Collections
      summary: Update a collection
      description: Update an existing collection's properties such as name, description, icon, color, sharing settings, or permission level.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  format: uuid
                name:
                  type: string
                  example: Human Resources
                description:
                  type: string
                  description: A brief description of the collection, markdown supported. Only one of `description` or `data` may be provided.
                  example: HR documentation is confidential and should be handled with care.
                data:
                  type: object
                  description: The collection description as a rich-text ProseMirror JSON document. Only one of `description` or `data` may be provided.
                permission:
                  $ref: '#/components/schemas/Permission'
                icon:
                  type: string
                  description: A string that represents an icon in the outline-icons package or an emoji
                color:
                  type: string
                  description: A hex color code for the collection icon
                  example: '#123123'
                sharing:
                  type: boolean
                  description: Whether public sharing of documents is allowed
                  example: false
              required:
              - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Collection'
                  policies:
                    type: array
                    items:
                      $ref: '#/components/schemas/Policy'
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsUpdate
  /collections.add_user:
    post:
      tags:
      - Collections
      summary: Add a collection user
      description: This method allows you to add a user membership to the specified collection.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: Identifier for the collection
                  format: uuid
                userId:
                  type: string
                  description: Identifier for the user to add to the collection
                  format: uuid
                permission:
                  $ref: '#/components/schemas/Permission'
              required:
              - id
              - userId
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      users:
                        type: array
                        items:
                          $ref: '#/components/schemas/User'
                      memberships:
                        type: array
                        items:
                          $ref: '#/components/schemas/Membership'
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsAddUser
  /collections.remove_user:
    post:
      tags:
      - Collections
      summary: Remove a collection user
      description: This method allows you to remove a user from the specified collection.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: Identifier for the collection
                  format: uuid
                userId:
                  type: string
                  description: Identifier for the user to remove from the collection
                  format: uuid
              required:
              - id
              - userId
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsRemoveUser
  /collections.memberships:
    post:
      tags:
      - Collections
      summary: List all collection memberships
      description: This method allows you to list a collections individual memberships. It's important to note that memberships returned from this endpoint do not include group memberships.
      requestBody:
        content:
          application/json:
            schema:
              allOf:
              - $ref: '#/components/schemas/Pagination'
              - type: object
                properties:
                  id:
                    type: string
                    description: Identifier for the collection
                    format: uuid
                  query:
                    type: string
                    description: Filter memberships by user names
                    example: jenny
                  permission:
                    $ref: '#/components/schemas/Permission'
                required:
                - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      users:
                        type: array
                        items:
                          $ref: '#/components/schemas/User'
                      memberships:
                        type: array
                        items:
                          $ref: '#/components/schemas/Membership'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsMemberships
  /collections.add_group:
    post:
      tags:
      - Collections
      summary: Add a group to a collection
      description: This method allows you to give all members in a group access to a collection.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  format: uuid
                groupId:
                  type: string
                  format: uuid
                permission:
                  $ref: '#/components/schemas/Permission'
              required:
              - id
              - groupId
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      collectionGroupMemberships:
                        type: array
                        items:
                          $ref: '#/components/schemas/CollectionGroupMembership'
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsAddGroup
  /collections.remove_group:
    post:
      tags:
      - Collections
      summary: Remove a collection group
      description: This method allows you to revoke all members in a group access to a collection. Note that members of the group may still retain access through other groups or individual memberships.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  description: Identifier for the collection
                  format: uuid
                groupId:
                  type: string
                  format: uuid
              required:
              - id
              - groupId
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsRemoveGroup
  /collections.group_memberships:
    post:
      tags:
      - Collections
      summary: List all collection group members
      description: This method allows you to list a collections group memberships. This is the list of groups that have been given access to the collection.
      requestBody:
        content:
          application/json:
            schema:
              allOf:
              - $ref: '#/components/schemas/Pagination'
              - type: object
                properties:
                  id:
                    type: string
                    description: Identifier for the collection
                    format: uuid
                  query:
                    type: string
                    description: Filter memberships by group names
                    example: developers
                  permission:
                    $ref: '#/components/schemas/Permission'
                required:
                - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      groups:
                        type: array
                        items:
                          $ref: '#/components/schemas/Group'
                      collectionGroupMemberships:
                        type: array
                        items:
                          $ref: '#/components/schemas/CollectionGroupMembership'
                  pagination:
                    $ref: '#/components/schemas/Pagination'
        '400':
          $ref: '#/components/responses/Validation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsGroupMemberships
  /collections.delete:
    post:
      tags:
      - Collections
      summary: Delete a collection
      description: Delete a collection and all of its documents. This action can’t be undone so please be careful.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                id:
                  type: string
                  format: uuid
              required:
              - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  success:
                    type: boolean
                    example: true
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsDelete
  /collections.export:
    post:
      tags:
      - Collections
      summary: Export a collection
      description: Triggers a bulk export of the collection in markdown format and their attachments. If documents are nested then they will be nested in folders inside the zip file. The endpoint returns a `FileOperation` that can be queried to track the progress of the export and get the url for the final file.
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                format:
                  type: string
                  enum:
                  - outline-markdown
                  - json
                  - html
                id:
                  type: string
                  format: uuid
              required:
              - id
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      fileOperation:
                        $ref: '#/components/schemas/FileOperation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsExport
  /collections.export_all:
    post:
      tags:
      - Collections
      summary: Export all collections
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                format:
                  type: string
                  enum:
                  - outline-markdown
                  - json
                  - html
                includeAttachments:
                  type: boolean
                  description: Whether to include attachments in the export.
                  default: true
                includePrivate:
                  type: boolean
                  description: Whether to include private collections in the export.
                  default: true
      description: Triggers a bulk export of multiple collections and their documents. The endpoint returns a `FileOperation` that can be queried through the fileOperations endpoint to track the progress of the export and get the url for the final file.
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    properties:
                      fileOperation:
                        $ref: '#/components/schemas/FileOperation'
        '401':
          $ref: '#/components/responses/Unauthenticated'
        '403':
          $ref: '#/components/responses/Unauthorized'
        '404':
          $ref: '#/components/responses/NotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
      operationId: collectionsExportAll
components:
  responses:
    RateLimited:
      description: The request was rate limited.
      headers:
        Retry-After:
          $ref: '#/components/headers/Retry-After'
        RateLimit-Limit:
          $ref: '#/components/headers/RateLimit-Limit'
        RateLimit-Remaining:
          $ref: '#/components/headers/RateLimit-Remaining'
        RateLimit-Reset:
          $ref: '#/components/headers/RateLimit-Reset'
      content:
        application/json:
          schema:
            type: object
            properties:
              ok:
                type: boolean
                example: false
              error:
                type: string
                example: rate_limit_exceeded
              status:
                type: number
                example: 429
    Validation:
      description: The request failed one or more validations.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    NotFound:
      description: The specified resource was not found.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthenticated:
      description: The API key is missing or otherwise invalid.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
    Unauthorized:
      description: The current API key is not authorized to perform this action.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
  schemas:
    Ability:
      description: A single permission granted by a policy
      example: true
      oneOf:
      - type: array
        items:
          type: string
      - type: boolean
    FileOperation:
      type: object
      properties:
        id:
          type: string
          description: Unique identifier for the object.
          readOnly: true
          format: uuid
        type:
          type: string
          example: export
          description: The type of file operation.
          readOnly: true
          enum:
          - import
          - export
        format:
          type: string
          description: The file format of the resulting file.
          example: outline-markdown
          readOnly: true
        name:
          type: string
          description: The name of the file operation, derived from the collection name, document title, or file name.
          readOnly: true
        state:
          type: string
          description: The state of the file operation.
          example: complete
          readOnly: true
          enum:
          - creating
          - uploading
          - complete
          - error
          - expired
        error:
          type: string
          nullable: true
          description: An error message if the file operation failed.
          readOnly: true
        size:
          type: string
          description: The size of the resulting file in bytes. Returned as a string as the value may exceed the safe integer range.
          readOnly: true
          example: '2048'
        collectionId:
       

# --- truncated at 32 KB (44 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/outline/refs/heads/main/openapi/outline-collections-api-openapi.yml