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

# List all documents

> Retrieve a paginated list of all documents in your workspace.

Documents can be filtered and sorted. The response includes basic document information and metadata. Use the 'getDocument' endpoint to retrieve full document details including parties and fields.

**Page-based pagination:** `page` and `perPage` (max 100). The response carries `total` and `totalPages`.

**Cursor pagination (recommended for sync):** pass `nextCursor` from the previous response as `cursor`. Cursor pages are stable while documents change underneath, which page numbers are not. Requires `orderBy` createdAt or updatedAt (the default). `page` is ignored when `cursor` is set.

**Incremental sync:** filter with `updatedAfter` set to the newest `updatedAt` you have stored, order by updatedAt ascending, and walk the cursor until `hasNextPage` is false.

<Warning>You're viewing API version `2026-09`, which is deprecated and stops working on October 1, 2027. To see the current version, select **2026-10** in the menu at the top of the sidebar. To move your integration, see [Upgrading to 2026-10](/upgrading/2026-10).</Warning>


## OpenAPI

````yaml /api/openapi-2026-09.json get /api/v1/documents
openapi: 3.0.2
info:
  title: sajn API
  version: 1.0.0
  description: >-
    # sajn - API v1


    Welcome to the sajn API documentation. This RESTful API allows you to
    integrate digital document signing capabilities into your applications.


    ## Overview


    sajn is a Swedish digital document signing platform that enables you to:

    - Create and manage digital documents

    - Add signers and participants to documents

    - Send documents for signing via email or SMS

    - Track document status and signatures

    - Manage contacts and companies

    - Organize documents with tags and custom fields

    - Perform identity verification with sajn ID (BankID integration)


    ## Authentication


    Every endpoint (except the health check) requires a bearer token in the
    Authorization header:


    ```

    Authorization: Bearer YOUR_TOKEN

    ```


    Two kinds of token are accepted:


    - **Personal API key** (`sajn_sk_...`) — generated from your workspace
    developer settings. Acts as the issuing user; can reach any endpoint the
    user's workspace role permits.

    - **OAuth 2.0 access token** — issued via the authorization-code flow (PKCE
    for public clients) to a connected application. Bound to one workspace and
    limited to the **scopes** the user granted at consent — effective access is
    *workspace role ∩ granted scopes*.


    Each operation below lists the OAuth scope(s) it requires under its security
    section. The scopes are coarse and resource-oriented (e.g. `documents:read`,
    `documents:write`, `documents:delete`, `contacts:read`). Personal API keys
    are not scope-limited; OAuth tokens are.


    ## Rate Limiting


    Limits apply per organization and scale with the plan:


    | Plan | Per minute | Per day |

    |---|---|---|

    | Basic | 60 | 2 000 |

    | Solo | 120 | 10 000 |

    | Team | 600 | 100 000 |

    | Enterprise | 2 000 | 2 000 000 |

    | Sandbox | 60 | 2 000 |


    Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining` and
    `X-RateLimit-Reset` for the minute window, and `X-RateLimit-Daily-Limit`,
    `X-RateLimit-Daily-Remaining` and `X-RateLimit-Daily-Reset` for the daily
    quota. A `429` response includes `Retry-After` in seconds.


    ## Pagination


    List endpoints accept `page` (default 1) and `perPage` (default 10, max 100)
    and return `totalPages`. The documents, templates and contacts lists also
    return `total`.


    The documents list additionally supports cursor pagination: pass the
    `nextCursor` from a response as `cursor` on the next request. Cursors stay
    correct while documents are created and updated between requests, which page
    numbers do not, so use them when mirroring documents into your own system
    together with the `updatedAfter` filter.


    ## Idempotent requests


    Send an `Idempotency-Key` header (any unique string up to 255 characters,
    for example a UUID) on `POST`, `PATCH` or `DELETE` requests to make retries
    safe. The first request runs normally and its response is stored for 24
    hours. A retry with the same key and the same method, path and body returns
    the stored response with the header `Idempotent-Replayed: true`. Reusing a
    key with a different request returns `400`; retrying while the first request
    is still running returns `409`. Responses with a `5xx` status are not
    stored, so the retry runs again. Keys are scoped to the workspace.


    ## Webhooks


    Configure webhooks to receive real-time notifications about document events:

    - `DOCUMENT_CREATED` - When a document is created

    - `DOCUMENT_SENT` - When a document is sent for signing

    - `DOCUMENT_OPENED` - When a signer opens a document

    - `DOCUMENT_SIGNED` - When a signer signs a document

    - `DOCUMENT_COMPLETED` - When all signers have signed

    - `DOCUMENT_REJECTED` - When a signer rejects a document


    ## Error Handling


    The API uses standard HTTP status codes and returns error details in JSON
    format:


    ```json

    {
      "message": "Error description",
      "code": "NOT_FOUND",
      "errorId": "..."
    }

    ```


    `code` is a stable machine-readable identifier; `errorId` identifies the
    occurrence when you contact support.


    A `400` for an invalid request lists every problem in `issues` (`[{ "path":
    "signers.0.email", "message": "..." }]`). A `403` for a missing OAuth scope
    includes `requiredScopes` and `grantedScopes`.


    Common status codes:

    - 200: Success

    - 400: Bad Request - Invalid parameters

    - 401: Unauthorized - Invalid or missing API key

    - 404: Not Found - Resource doesn't exist

    - 409: Conflict - Resource already exists

    - 429: Too Many Requests - Rate limit exceeded

    - 500: Internal Server Error


    ## Support


    For API support, documentation, or questions:

    - Email: dev@sajn.se

    - Documentation: https://docs.sajn.se

    - Status: https://status.sajn.se
  contact:
    name: sajn Support
    email: hej@sajn.se
    url: https://www.sajn.se/support
  license:
    name: Policy
    url: https://www.sajn.se/allmanna-villkor
servers:
  - url: https://app.sajn.se
    description: Production server
security: []
tags:
  - name: Health
    description: API health and version information
  - name: Documents
    description: Create, manage, and send documents for signing
  - name: Templates
    description: Create and manage templates that can be used to spin up new documents
  - name: Parties
    description: Manage document parties (signers and other participants)
  - name: Signers
    description: >-
      [DEPRECATED] Legacy endpoints for document signers. Will stop working in
      API v2 — use the Parties endpoints instead.
  - name: Contacts
    description: Manage contacts and contact information
  - name: Companies
    description: Manage companies and organizations
  - name: Fields
    description: Manage document fields and sections
  - name: Tags
    description: Organize documents with tags
  - name: Custom Fields
    description: Define and manage custom fields for documents
  - name: sajn ID
    description: Identity verification with Swedish BankID
  - name: Files
    description: >-
      Upload and manage files. File uploads are handled by a dedicated upload
      server (upload.sajn.se).
  - name: Folders
    description: Organize documents and templates into hierarchical folders
  - name: Comments
    description: Thread-based discussion on documents
  - name: Reminders
    description: Send and inspect signing reminders on a document
  - name: Helpers
    description: 'Reference data: languages, countries, currencies, timezones'
  - name: Organization
    description: Authenticated organization metadata and branding
  - name: Webhook Deliveries
    description: Inspect and replay past webhook deliveries
  - name: Delegations
    description: Read-only access to signer delegation events on a document
  - name: Blocks
    description: Reusable library blocks for templates
paths:
  /api/v1/documents:
    get:
      summary: List all documents
      description: >-
        Retrieve a paginated list of all documents in your workspace.


        Documents can be filtered and sorted. The response includes basic
        document information and metadata. Use the 'getDocument' endpoint to
        retrieve full document details including parties and fields.


        **Page-based pagination:** `page` and `perPage` (max 100). The response
        carries `total` and `totalPages`.


        **Cursor pagination (recommended for sync):** pass `nextCursor` from the
        previous response as `cursor`. Cursor pages are stable while documents
        change underneath, which page numbers are not. Requires `orderBy`
        createdAt or updatedAt (the default). `page` is ignored when `cursor` is
        set.


        **Incremental sync:** filter with `updatedAfter` set to the newest
        `updatedAt` you have stored, order by updatedAt ascending, and walk the
        cursor until `hasNextPage` is false.
      operationId: getDocuments
      parameters:
        - name: authorization
          in: header
          description: Bearer token for API authentication
          required: true
          schema:
            type: string
        - name: page
          in: query
          description: 'Page number for pagination (default: 1)'
          required: true
          content:
            application/json:
              schema:
                default: 1
                type: number
                minimum: 1
                maximum: 10000
        - name: perPage
          in: query
          description: 'Number of items per page (default: 10, max: 100)'
          required: true
          content:
            application/json:
              schema:
                default: 10
                type: number
                minimum: 1
                maximum: 100
        - name: status
          in: query
          description: >-
            Filter by document status. Comma-separated or repeated query param:
            DRAFT, PENDING, COMPLETED, EXPIRED, CANCELLED, REJECTED, SENDING,
            PENDING_APPROVAL, IMPORTED
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        - name: tagId
          in: query
          description: Filter by one or more tag IDs (comma-separated or repeated)
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        - name: folderId
          in: query
          description: >-
            Filter by folder. Pass an empty string to include only top-level
            documents.
          content:
            application/json:
              schema:
                type: string
                nullable: true
        - name: externalId
          in: query
          description: Substring match on the externalId field
          content:
            application/json:
              schema:
                type: string
        - name: responsibleUserId
          in: query
          description: Filter by responsible user IDs (comma-separated or repeated)
          content:
            application/json:
              schema:
                type: array
                items:
                  type: string
        - name: createdAfter
          in: query
          description: Only return documents created at or after this ISO date/time
          content:
            application/json:
              schema: {}
        - name: createdBefore
          in: query
          description: Only return documents created at or before this ISO date/time
          content:
            application/json:
              schema: {}
        - name: updatedAfter
          in: query
          description: >-
            Only return documents updated at or after this ISO date/time. Use
            this for incremental sync.
          content:
            application/json:
              schema: {}
        - name: updatedBefore
          in: query
          description: Only return documents updated at or before this ISO date/time
          content:
            application/json:
              schema: {}
        - name: completedAfter
          in: query
          description: Only return documents completed at or after this ISO date/time
          content:
            application/json:
              schema: {}
        - name: completedBefore
          in: query
          description: Only return documents completed at or before this ISO date/time
          content:
            application/json:
              schema: {}
        - name: cursor
          in: query
          description: >-
            Keyset pagination cursor: pass the `nextCursor` from the previous
            response. Replaces `page`. Only valid with `orderBy` createdAt or
            updatedAt.
          content:
            application/json:
              schema:
                type: string
        - name: query
          in: query
          description: >-
            Free-text search across name, externalId, signer name, and signer
            email
          content:
            application/json:
              schema:
                type: string
        - name: archived
          in: query
          description: >-
            When true, only archived documents are returned. When false
            (default), only non-archived.
          content:
            application/json:
              schema:
                type: boolean
        - name: orderBy
          in: query
          description: Field to sort by
          required: true
          content:
            application/json:
              schema:
                default: updatedAt
                type: string
                enum:
                  - createdAt
                  - updatedAt
                  - name
                  - completedAt
                  - expiresAt
        - name: orderDirection
          in: query
          description: Sort direction
          required: true
          content:
            application/json:
              schema:
                default: desc
                type: string
                enum:
                  - asc
                  - desc
      responses:
        '200':
          description: Paginated list of documents
          content:
            application/json:
              schema:
                type: object
                properties:
                  documents:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: Unique document identifier
                        externalId:
                          description: Your external reference ID for this document
                          type: string
                          nullable: true
                        expiresAt:
                          description: Date and time when the document expires
                          nullable: true
                          type: string
                          format: date-time
                        name:
                          type: string
                          description: Document name/title
                        status:
                          type: string
                          description: >-
                            Document status: DRAFT, SENDING, PENDING, COMPLETED,
                            EXPIRED, CANCELLED, or IMPORTED
                        documentMeta:
                          description: >-
                            Document metadata including subject, message,
                            signing order, etc.
                          type: object
                          properties:
                            subject:
                              description: Email subject line when sending document
                              type: string
                              nullable: true
                            message:
                              description: Custom message included in signing invitation
                              type: string
                              nullable: true
                            signingOrder:
                              description: >-
                                Signing order: PARALLEL (all signers can sign
                                simultaneously) or SEQUENTIAL (signers must sign
                                in order)
                              type: string
                              enum:
                                - PARALLEL
                                - SEQUENTIAL
                              nullable: true
                            forceReadFullDocument:
                              description: >-
                                Whether signers must read the entire document
                                before signing
                              type: boolean
                              nullable: true
                            showChatToSigners:
                              description: Whether to show document chat to signers
                              type: boolean
                              nullable: true
                            preferredLanguage:
                              description: >-
                                Preferred language for the signing interface: sv
                                (Swedish), en (English), no (Norwegian), da
                                (Danish), or fi (Finnish)
                              type: string
                              enum:
                                - sv
                                - en
                                - 'no'
                                - da
                                - fi
                                - de
                                - is
                                - es
                                - fr
                                - it
                              nullable: true
                            value:
                              description: Monetary value of the document (for contracts)
                              type: string
                              nullable: true
                            redirectUrl:
                              description: >-
                                URL to redirect signers to after signing is
                                complete. New values must be http(s); legacy
                                values are returned as stored.
                              type: string
                              nullable: true
                            redirectEnabled:
                              description: Whether redirect after signing is enabled
                              type: boolean
                              nullable: true
                            internalRecipients:
                              description: >-
                                Email addresses that receive a copy of the
                                sealed PDF once the document is completed
                              type: array
                              items:
                                type: string
                              nullable: true
                            signableAfterExpired:
                              description: >-
                                Whether the document remains signable after its
                                expiration date
                              type: boolean
                              nullable: true
                            sendPlainTextEmailOnly:
                              description: >-
                                Send plain text email invitations only (no
                                HTML). null inherits the workspace default.
                              type: boolean
                              nullable: true
                            reminderIntervalDays:
                              description: Days between automatic reminders
                              type: string
                              nullable: true
                            allowDelegation:
                              description: >-
                                Whether signers may delegate signing to another
                                person
                              type: boolean
                              nullable: true
                            accessVerification:
                              description: >-
                                Document-wide verification required to open the
                                document
                              type: string
                              enum:
                                - NONE
                                - PIN_BEFORE_SIGNING
                                - SMS_BEFORE_SIGNING
                                - EMAIL_BEFORE_SIGNING
                                - BANKID_BEFORE_SIGNING
                                - NO_BANKID_BIOMETRIC_BEFORE_SIGNING
                                - NO_BANKID_HIGH_BEFORE_SIGNING
                                - DK_MITID_BEFORE_SIGNING
                                - DK_MITID_ERHVERV_BEFORE_SIGNING
                                - FI_FTN_BEFORE_SIGNING
                                - NL_IDIN_BEFORE_SIGNING
                              nullable: true
                            aiChatEnabled:
                              description: >-
                                Whether the signer-facing AI chat is enabled.
                                null inherits the workspace default.
                              type: boolean
                              nullable: true
                            ssnDisplayMode:
                              description: >-
                                How personal numbers are displayed to signers:
                                FULL, PARTIAL, or NONE. null inherits the
                                workspace default.
                              type: string
                              enum:
                                - FULL
                                - PARTIAL
                                - NONE
                              nullable: true
                            sameDeviceSigning:
                              description: >-
                                Whether all parties sign in sequence on one
                                device
                              type: boolean
                              nullable: true
                            documentCategoryId:
                              description: >-
                                Document category (Dokumenttyp) scoping which
                                custom fields apply. See GET
                                /api/v1/document-categories.
                              type: string
                              nullable: true
                          additionalProperties: false
                          nullable: true
                        createdAt:
                          description: Date and time when the document was created
                          type: string
                          format: date-time
                        updatedAt:
                          description: Date and time when the document was last updated
                          type: string
                          format: date-time
                        completedAt:
                          description: Date and time when all signers completed signing
                          nullable: true
                          type: string
                          format: date-time
                      required:
                        - id
                        - name
                        - status
                        - createdAt
                        - updatedAt
                      additionalProperties: false
                    description: Array of documents
                  total:
                    type: number
                    description: Total number of documents matching the filters
                  totalPages:
                    type: number
                    description: Total number of pages available (page-based pagination)
                  hasNextPage:
                    type: boolean
                    description: Whether more documents exist after this page
                  nextCursor:
                    description: >-
                      Cursor for the next page, or null on the last page. Pass
                      it as `cursor` on the next request.
                    type: string
                    nullable: true
                required:
                  - documents
                  - total
                  - totalPages
                  - hasNextPage
                  - nextCursor
                additionalProperties: false
                description: Paginated list of documents
        '401':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error message describing what went wrong
                  code:
                    description: Machine-readable error code (e.g. APPROVAL_REQUIRED)
                    type: string
                  errorId:
                    description: >-
                      Identifier for this occurrence — quote it to support when
                      reporting a 500
                    type: string
                  issues:
                    description: Every validation issue, on a 400 for an invalid request
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, e.g.
                            `signers.0.email`; empty for the root
                        message:
                          type: string
                      required:
                        - path
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403 for a missing
                      scope
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403 for a missing
                      scope
                    type: array
                    items:
                      type: string
                required:
                  - message
                additionalProperties: false
                description: Error response
        '404':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Error message describing what went wrong
                  code:
                    description: Machine-readable error code (e.g. APPROVAL_REQUIRED)
                    type: string
                  errorId:
                    description: >-
                      Identifier for this occurrence — quote it to support when
                      reporting a 500
                    type: string
                  issues:
                    description: Every validation issue, on a 400 for an invalid request
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, e.g.
                            `signers.0.email`; empty for the root
                        message:
                          type: string
                      required:
                        - path
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403 for a missing
                      scope
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403 for a missing
                      scope
                    type: array
                    items:
                      type: string
                required:
                  - message
                additionalProperties: false
                description: Error response
      security:
        - bearerAuth: []
        - oauth2:
            - documents:read
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        Personal API key, e.g. `Authorization: Bearer sajn_sk_...`. Not
        scope-limited — acts as the issuing user.
    oauth2:
      type: oauth2
      description: >-
        OAuth 2.0 access token for a connected application. Limited to the
        scopes granted at consent.
      flows:
        authorizationCode:
          authorizationUrl: https://app.sajn.se/oauth/authorize
          tokenUrl: https://app.sajn.se/api/oauth/token
          refreshUrl: https://app.sajn.se/api/oauth/token
          scopes:
            profile:read: >-
              Läsa din profilinformation, inklusive namn, telefonnummer och
              e-postadress
            documents:read: Tillgång till att läsa dina dokument
            documents:write: >-
              Tillgång till att skapa nya dokument och redigera dokument som du
              har skapat
            documents:delete: >-
              Tillgång till att ta bort dokument och tillhörande filer, mappar,
              datafält och kommentarer
            forms:read: Tillgång till att läsa formulär och inställningar
            forms:write: Tillgång till att skapa, redigera och publicera formulär
            forms:delete: Tillgång till att ta bort formulär och svar permanent
            forms:submissions:read: >-
              Tillgång till att läsa formulärsvar och respondenternas
              kontaktuppgifter
            templates:read: Tillgång till att läsa dina mallar
            templates:write: Tillgång till att skapa och redigera mallar
            contacts:read: Tillgång till att läsa dina kontakter
            contacts:write: Tillgång till att skapa och redigera dina kontakter
            contacts:delete: Tillgång till att ta bort dina kontakter
            organization:read: Tillgång till att läsa information om din organisation
            audit:read: Tillgång till att läsa dokumentaktivitet och händelseloggar
            signatures:read: >-
              Tillgång till att läsa vilken identitet e-legitimationen
              verifierade vid signering, inklusive personnummer
            sajnid:read: Tillgång till att läsa sajn-id-verifieringar
            sajnid:write: Tillgång till att skapa sajn-id-verifieringar
            login:read: Tillgång till att läsa resultatet av inloggningar via sajn Login
            login:write: Tillgång till att starta inloggningar via sajn Login
            webhooks:read: Tillgång till att läsa webhooks och deras leveranser
            webhooks:write: Tillgång till att skapa, redigera och ta bort webhooks
            actions:read: Tillgång till att läsa föreslagna åtgärder och vad de skulle göra
            actions:write: >-
              Tillgång till att godkänna, avfärda och skjuta upp föreslagna
              åtgärder — ett godkännande kan skicka påminnelser till motparter,
              säga upp avtal och skapa bevakningar
            members:read: Tillgång till att läsa arbetsytans medlemmar
            members:write: Tillgång till att bjuda in och hantera medlemmar
            roles:read: Tillgång till att läsa arbetsytans roller och behörigheter
            roles:write: Tillgång till att skapa, redigera och ta bort arbetsytans roller

````

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