> ## 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 bundles

> Lists the workspace's bundles in every status, newest first. A bundle is listed only if you can read every document in it.

To list the documents of one bundle with their full details, call `GET /api/v1/documents?bundleId={id}`.



## OpenAPI

````yaml /api/openapi.json get /api/v1/bundles
openapi: 3.1.0
info:
  title: sajn API
  version: 2026-10
  description: >-
    # sajn - API v1


    With the sajn REST API, you can add digital document signing to your own
    applications.


    ## Overview


    sajn is a Swedish digital document signing platform. With the API, you can:

    - Create and manage documents and templates

    - Add the parties who sign, review, or organize a document

    - Send documents for signing by email or SMS

    - Track document status and signatures

    - Manage contacts and companies

    - Organize documents with tags and custom fields

    - Verify identities with sajn ID, through BankID and other eIDs


    ## 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:


    - **API key** — generated in the developer settings. A key belongs to a
    service account (`sajn_svc_...`), a non-human account the organization owns,
    or to the person who created it (`sajn_usr_...`). It can reach any endpoint
    its owner's workspace role permits, and holds no organization permissions.
    Service-account keys keep working when the person who created them leaves.
    Older keys start with `sajn_sk_` and keep working.

    - **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*.


    An API key acts in its default workspace. To act in another workspace the
    key's account is a member of, send its ID in the `Sajn-Workspace` header:


    ```

    Sajn-Workspace: WORKSPACE_ID

    ```


    `GET /api/v1/workspaces` lists the workspaces the token can reach. A
    workspace that doesn't exist and one the key can't reach both return `403
    WORKSPACE_ACCESS_DENIED`, and a header that isn't a single workspace ID
    returns `400 VALIDATION_FAILED`; the key's default workspace is never used
    instead.


    Each operation lists the OAuth scopes it requires in 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 |

    |---|---|

    | Basic | 60 |

    | Solo | 120 |

    | Team | 600 |

    | Enterprise | 2 000 |

    | Sandbox | 60 |


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


    ## Query parameters


    Query parameters are plain strings, such as
    `?externalId=12345&archived=false`:

    - Booleans are `true` or `false`.

    - Dates are ISO 8601 dates (`2026-10-01`) or date-times
    (`2026-10-01T08:00:00Z`). A date-time without an offset is UTC.

    - Filters that take several values accept a comma-separated list
    (`status=PENDING,COMPLETED`) or a repeated parameter
    (`status=PENDING&status=COMPLETED`).


    An unknown query parameter returns `400`, so a misspelled filter never
    silently returns everything.


    ## Pagination


    Every list returns `{ data, hasMore, nextCursor }`. To walk a list, pass
    `nextCursor` as `cursor` on the next request, keep the other parameters
    unchanged, and stop when `hasMore` is `false`. `limit` sets the page size,
    from 1 to 100, with a default of 25. To get the number of items that match
    the filters, pass `include=total`, and the response adds `total`.


    Lists sort newest first. To sort another way, pass `orderBy` and
    `orderDirection` where the list takes them. A list bounded by its parent,
    such as a document's parties, returns every item in one response, with
    `hasMore` set to `false` and `nextCursor` set to `null`.


    On the documents list, the cursor is keyset-based: it stays correct while
    documents are created and updated between requests. To mirror documents into
    your own system, sort by `updatedAt` and use 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, errors included. 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
    IDEMPOTENCY_KEY_REUSED`; retrying while the first request is still running
    returns `409 IDEMPOTENCY_KEY_IN_USE` with `Retry-After`. Responses with a
    `429` or `5xx` status aren't stored, so the retry runs again. Keys are
    scoped to the workspace.


    ## Versioning


    The API is versioned by date (`YYYY-MM`), and this reference documents
    version `2026-10`. To choose the version for a request, send the
    `Sajn-Version` header:


    ```

    Sajn-Version: 2026-10

    ```


    Without the header, a request uses your organization's default version. An
    organization without a default is pinned to the latest version by its first
    request. Every response returns the version that served it in
    `Sajn-Version`. On a deprecated version, responses also carry `Deprecation`
    and `Sunset` headers, and from the sunset date its requests return `400`.
    For details, see https://docs.sajn.se/api-reference/versioning.


    ## Webhooks


    Each webhook endpoint has its own API version, set when you create it, that
    decides the payload shape. Deliveries carry it in the `Sajn-Version` header.


    The delivery body is the event, `{ id, type, createdAt, apiVersion,
    workspaceId, environment, actor, data }`, signed according to [Standard
    Webhooks](https://www.standardwebhooks.com) in the `webhook-id`,
    `webhook-timestamp` and `webhook-signature` headers. Common document events:

    - `document.created` - A document is created.

    - `document.sent` - A document is sent for signing.

    - `document.party.opened` - A party opens the document.

    - `document.party.signed` - A party signs the document.

    - `document.fully_signed` - Every signer has signed, before the document is
    sealed.

    - `document.completed` - The document is sealed and complete.

    - `document.rejected` - A party rejects the document.


    For every event type, see `POST /api/v1/webhooks`.


    ## Error Handling


    Every error response has the same JSON shape:


    ```json

    {
      "code": "NOT_FOUND",
      "message": "Document not found",
      "userMessage": "Dokumentet hittades inte.",
      "requestId": "req_V1StGXR8Z5jdHi6BmyT2",
      "resource": "document"
    }

    ```


    - `code` is always present and comes from the closed list in the following
    table. Branch on it, not on the status or the message.

    - `message` is English text for developers. When the operation has no more
    specific text, it's the meaning of `code` from the following table. Its
    wording can change, so don't parse it.

    - `userMessage` is always present. It's text that is safe to show your
    users, usually in Swedish.

    - `requestId` identifies the request and matches the `Sajn-Request-Id`
    header, which every response carries. Quote it when you contact support. On
    a replayed idempotent response, it identifies the original request.


    A `400 VALIDATION_FAILED` lists every problem in `issues`: `[{ "path":
    "parties.0.email", "code": "INVALID_FORMAT", "message": "Invalid email
    address" }]`. An issue `code` is one of `INVALID_TYPE`, `INVALID_FORMAT`,
    `INVALID_VALUE`, `TOO_SMALL`, `TOO_BIG` or `UNRECOGNIZED_KEY`, and an issue
    that no single input caused has an empty `path`. A `404 NOT_FOUND` names the
    type of the missing resource in `resource`, such as `document` or `party`,
    or `null` when the API can't tell. A `403 INSUFFICIENT_SCOPE` includes
    `requiredScopes` and `grantedScopes`.


    A `401` always means the credential itself is the problem: `UNAUTHORIZED`
    when it's missing, invalid or revoked, `API_KEY_EXPIRED` when the key has
    expired. A valid token that isn't allowed to do something gets a `403`. A
    `409 INVALID_STATE` means the resource's state doesn't allow the operation;
    change the state first, then retry. A `503 UPSTREAM_UNAVAILABLE` is safe to
    retry with exponential backoff, and so is a `429` after `Retry-After`
    seconds.


    The API returns the following codes:


    | Code | Status | Meaning |

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

    | `VALIDATION_FAILED` | 400 | The request failed validation. `issues` lists
    every problem. |

    | `INVALID_JSON` | 400 | The request body isn't valid JSON. |

    | `EXPIRED` | 400 | The link, code or resource has expired. |

    | `IDEMPOTENCY_KEY_REUSED` | 400 | The `Idempotency-Key` was already used
    with a different request. |

    | `WORKSPACE_REQUIRED` | 400 | The API key has no default workspace. Name
    one with the `Sajn-Workspace` header. |

    | `INVALID_API_VERSION` | 400 | The `Sajn-Version` header names a version
    that doesn't exist. |

    | `API_VERSION_SUNSET` | 400 | The requested version, or your organization's
    default, is past its sunset date. |

    | `UNAUTHORIZED` | 401 | The API token is missing, invalid or revoked. |

    | `API_KEY_EXPIRED` | 401 | The API key has passed its expiry date. Create a
    new key. |

    | `PERMISSION_DENIED` | 403 | The token's user isn't allowed to perform the
    operation, for example because their workspace role lacks a permission. |

    | `WORKSPACE_ACCESS_DENIED` | 403 | The workspace named by the
    `Sajn-Workspace` header doesn't exist, or the token can't act in it. |

    | `INSUFFICIENT_SCOPE` | 403 | The OAuth token wasn't granted a scope the
    operation requires. See `requiredScopes` and `grantedScopes`. |

    | `PLAN_REQUIRED` | 403 | The organization's plan doesn't include API access
    or the feature. |

    | `ACCOUNT_INACTIVE` | 403 | The organization, user or membership behind the
    token is deactivated or suspended. |

    | `ACCOUNT_SETUP_REQUIRED` | 403 | The organization must finish its setup,
    such as verifying an accountable person, first. |

    | `LIMIT_EXCEEDED` | 403 | A plan limit was reached, such as the monthly
    number of sent documents. |

    | `DOCUMENT_NOT_READY` | 409 | The document can't be sent yet. `readiness`
    lists what blocks it, the same list `GET /api/v1/documents/:id/readiness`
    returns. |

    | `APPROVAL_REQUIRED` | 409 | The operation needs an approval first, such as
    sending a document that the workspace requires an approval for. Request one
    with `POST /api/v1/approval-requests`. |

    | `NOT_FOUND` | 404 | The resource doesn't exist, or the token can't access
    it. `resource` names its type, such as `document`, or is `null` when the API
    can't tell. |

    | `ROUTE_NOT_FOUND` | 404 | No endpoint matches the method and path in the
    requested API version. |

    | `INVALID_STATE` | 409 | The resource's current state doesn't allow the
    operation, such as editing a document that was already sent or downloading a
    file that isn't produced yet. |

    | `BUNDLE_OWNS_SETTING` | 409 | The document is in a bundle, and the bundle
    owns what the operation changes: the parties, the send settings, sending,
    and withdrawing. Make the change on the bundle, through
    `/api/v1/bundles/{id}`. The document's `bundleId` names it. |

    | `ALREADY_EXISTS` | 409 | A resource with the same unique value, such as
    `externalId`, already exists. |

    | `IDEMPOTENCY_KEY_IN_USE` | 409 | A request with the same `Idempotency-Key`
    is still running. Retry after `Retry-After` seconds. |

    | `RATE_LIMITED` | 429 | The per-minute rate limit was reached. Retry after
    `Retry-After` seconds. |

    | `INTERNAL_ERROR` | 500 | Something went wrong on sajn's side. Quote
    `requestId` when you contact support. |

    | `UPSTREAM_UNAVAILABLE` | 503 | A service the operation depends on, such as
    an eID provider or a connected integration, failed or is unavailable. Retry
    with exponential backoff. |


    ## 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: dev@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: Bundles
    description: >-
      Send several documents as one invitation, so each person signs all of
      theirs in one action
  - 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. `POST /api/v1/files` returns a presigned URL that
      you upload the bytes to.
  - 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 retry 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/bundles:
    get:
      summary: List bundles
      description: >-
        Lists the workspace's bundles in every status, newest first. A bundle is
        listed only if you can read every document in it.


        To list the documents of one bundle with their full details, call `GET
        /api/v1/documents?bundleId={id}`.
      operationId: getBundles
      parameters:
        - name: limit
          in: query
          description: 'Maximum number of items to return, from 1 to 100. Default: 25.'
          schema:
            default: 25
            type: integer
            minimum: 1
            maximum: 100
        - name: cursor
          in: query
          description: >-
            The `nextCursor` from the previous response, to get the next page.
            Keep the other parameters unchanged.
          schema:
            type: string
            minLength: 1
            maxLength: 2048
        - name: include
          in: query
          description: >-
            `total` adds the number of items that match the filters. Counting
            takes time, so ask for it only when you need it.
          schema:
            type: array
            items:
              type: string
              enum:
                - total
        - name: Sajn-Version
          in: header
          required: false
          schema:
            type: string
            enum:
              - 2026-09
              - 2026-10
          description: >-
            API version for this request. Without it, the request uses the
            organization's default version; an organization without a default is
            pinned to the latest version by its first request.
        - name: Sajn-Workspace
          in: header
          required: false
          schema:
            type: string
          description: >-
            ID of the workspace this request acts in, from `GET
            /api/v1/workspaces`. Without it, an API key acts in its default
            workspace. The token's user must be a member of the workspace; an
            OAuth token only accepts the workspace it was granted for. A
            workspace that doesn't exist or can't be reached returns `403
            WORKSPACE_ACCESS_DENIED`.
      responses:
        '200':
          description: Bundles, newest first
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        id:
                          type: string
                          description: The bundle ID.
                        name:
                          description: >-
                            The bundle name, shown as the heading of the bundle
                            page and in the invitation.
                          type:
                            - string
                            - 'null'
                        status:
                          type: string
                          enum:
                            - DRAFT
                            - OPEN
                            - COMPLETED
                            - CANCELED
                          description: >-
                            `DRAFT` while you build it, and again after a
                            withdraw. `OPEN` from the send until every document
                            is resolved, then `COMPLETED`. `CANCELED` after a
                            cancel.
                        subject:
                          description: The subject line of the invitation email.
                          type:
                            - string
                            - 'null'
                        message:
                          description: A message included in every invitation.
                          type:
                            - string
                            - 'null'
                        expiresAt:
                          description: >-
                            The expiry date of the bundle. Every document in it
                            gets the same one.
                          type:
                            - string
                            - 'null'
                          format: date-time
                        signingMode:
                          type: string
                          enum:
                            - PARALLEL
                            - SEQUENTIAL
                          description: >-
                            How the parties sign: `PARALLEL`, all at once, or
                            `SEQUENTIAL`, one at a time in the order of each
                            party's `signingOrder`. The order runs across every
                            document in the bundle.
                        language:
                          type: string
                          enum:
                            - sv
                            - en
                            - 'no'
                            - da
                            - fi
                            - de
                            - is
                            - es
                            - fr
                            - it
                          description: >-
                            Language of the bundle page and the emails to the
                            parties, an ISO 639-1 code such as `sv`.
                        reminderIntervalDays:
                          description: >-
                            Days between automatic reminders. `0` turns them
                            off, and null uses the default of 3.
                          type:
                            - integer
                            - 'null'
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                        signableAfterExpired:
                          type: boolean
                          description: >-
                            Whether the documents can still be signed after
                            `expiresAt`.
                        internalRecipients:
                          type: array
                          items:
                            type: string
                          description: >-
                            Email addresses that receive a copy of each sealed
                            PDF once its document is completed.
                        nationalIdDisplayMode:
                          description: >-
                            How national identity numbers are displayed to
                            signers: `FULL`, `PARTIAL`, or `NONE`. null keeps
                            each document's own setting.
                          type:
                            - string
                            - 'null'
                          enum:
                            - FULL
                            - PARTIAL
                            - NONE
                            - null
                        openVerification:
                          description: >-
                            Verification every party passes before the document
                            opens: `PIN`, `SMS`, `EMAIL`, or an eID such as
                            `SE_BANKID`. null means none. A party's own
                            `openVerification` overrides it.
                          type:
                            - string
                            - 'null'
                          enum:
                            - PIN
                            - SMS
                            - EMAIL
                            - SE_BANKID
                            - NO_BANKID_BIOMETRIC
                            - NO_BANKID_HIGH
                            - DK_MITID
                            - DK_MITID_ERHVERV
                            - FI_FTN
                            - NL_IDIN
                            - null
                        sendPlainTextEmailOnly:
                          description: >-
                            Send plain text invitations only, without HTML. null
                            inherits the workspace default.
                          type:
                            - boolean
                            - 'null'
                        redirectUrl:
                          description: URL to send a party to once they have signed.
                          type:
                            - string
                            - 'null'
                        redirectEnabled:
                          type: boolean
                          description: Whether `redirectUrl` is used.
                        documentCount:
                          type: integer
                          minimum: -9007199254740991
                          maximum: 9007199254740991
                          description: The number of documents in `documents`.
                        createdAt:
                          type: string
                          format: date-time
                          description: When the bundle was created.
                        updatedAt:
                          type: string
                          format: date-time
                          description: When the bundle was last updated.
                        documents:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                                description: The document ID.
                              name:
                                type: string
                              status:
                                type: string
                                enum:
                                  - DRAFT
                                  - PENDING_APPROVAL
                                  - PENDING
                                  - COMPLETED
                                  - EXPIRED
                                  - CANCELLED
                                  - REJECTED
                                  - IMPORTED
                              parties:
                                type: array
                                items:
                                  type: object
                                  properties:
                                    id:
                                      type: string
                                      description: >-
                                        The party ID on this document, for the
                                        document and party endpoints.
                                    bundlePartyId:
                                      description: >-
                                        The bundle party this document party
                                        belongs to, from `parties`.
                                      type:
                                        - string
                                        - 'null'
                                    name:
                                      type: string
                                    email:
                                      type:
                                        - string
                                        - 'null'
                                      format: email
                                      pattern: >-
                                        ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                                    role:
                                      type: string
                                      enum:
                                        - SIGNER
                                        - ORGANIZER
                                        - REVIEWER
                                    signingStatus:
                                      type: string
                                      enum:
                                        - NOT_SIGNED
                                        - SIGNED
                                        - REJECTED
                                    signedAt:
                                      type:
                                        - string
                                        - 'null'
                                      format: date-time
                                  required:
                                    - id
                                    - bundlePartyId
                                    - name
                                    - email
                                    - role
                                    - signingStatus
                                    - signedAt
                                  additionalProperties: false
                            required:
                              - id
                              - name
                              - status
                              - parties
                            additionalProperties: false
                          description: The documents in the bundle, oldest first.
                        parties:
                          type: array
                          items:
                            type: object
                            properties:
                              id:
                                type: string
                                description: >-
                                  The party ID. To get the party's signing URL,
                                  pass it to `GET
                                  /api/v1/bundles/{id}/parties/{partyId}`.
                              name:
                                type: string
                              email:
                                type: string
                                format: email
                                pattern: >-
                                  ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
                                description: >-
                                  The email address the party gets the
                                  invitation at. A bundle has one party per
                                  email address.
                              phone:
                                type:
                                  - string
                                  - 'null'
                              role:
                                type: string
                                enum:
                                  - SIGNER
                                  - ORGANIZER
                                  - REVIEWER
                              signingOrder:
                                description: The party's step for `SEQUENTIAL` signing.
                                type:
                                  - integer
                                  - 'null'
                                minimum: -9007199254740991
                                maximum: 9007199254740991
                              delivery:
                                type: array
                                items:
                                  type: string
                                  enum:
                                    - EMAIL
                                    - SMS
                                    - IN_APP
                                description: >-
                                  How the party gets the invitation:
                                  `["EMAIL"]`, `["SMS"]`, `["EMAIL", "SMS"]` for
                                  both, or `["IN_APP"]` to sign in person on
                                  your device. `[]` sends nothing, so you share
                                  the signing URL yourself. Each channel needs
                                  the matching contact detail.
                              signatureMethod:
                                description: >-
                                  How the party signs: `DRAWING`, `SE_BANKID`,
                                  `CLICK_TO_SIGN`, or another eID.
                                type:
                                  - string
                                  - 'null'
                                enum:
                                  - NONE
                                  - DRAWING
                                  - SE_BANKID
                                  - MANUAL
                                  - CLICK_TO_SIGN
                                  - NO_BANKID_BIOMETRIC
                                  - NO_BANKID_HIGH
                                  - NO_QES
                                  - DK_MITID
                                  - DK_MITID_ERHVERV
                                  - FI_FTN
                                  - NL_IDIN
                                  - ZEALID_QES
                                  - null
                              signVerification:
                                description: >-
                                  Verification the party passes before signing:
                                  `PIN`, `SMS`, `EMAIL`, or an eID such as
                                  `SE_BANKID`. null means none. Call `GET
                                  /api/v1/helpers/two-step-verifications` for
                                  the methods your account can use.
                                type:
                                  - string
                                  - 'null'
                                enum:
                                  - PIN
                                  - SMS
                                  - EMAIL
                                  - SE_BANKID
                                  - NO_BANKID_BIOMETRIC
                                  - NO_BANKID_HIGH
                                  - DK_MITID
                                  - DK_MITID_ERHVERV
                                  - FI_FTN
                                  - NL_IDIN
                                  - null
                              openVerification:
                                description: >-
                                  Verification this party passes before the
                                  documents open, in place of the bundle's
                                  `openVerification`. null uses the bundle's.
                                type:
                                  - string
                                  - 'null'
                                enum:
                                  - PIN
                                  - SMS
                                  - EMAIL
                                  - SE_BANKID
                                  - NO_BANKID_BIOMETRIC
                                  - NO_BANKID_HIGH
                                  - DK_MITID
                                  - DK_MITID_ERHVERV
                                  - FI_FTN
                                  - NL_IDIN
                                  - null
                              status:
                                description: >-
                                  `SIGNED` when the party has signed every one
                                  of their documents, `REJECTED` when they
                                  rejected any of them, otherwise `PENDING`.
                                  null for a party that doesn't sign, an
                                  `ORGANIZER` or `REVIEWER`.
                                type:
                                  - string
                                  - 'null'
                                enum:
                                  - PENDING
                                  - SIGNED
                                  - REJECTED
                                  - null
                              documentIds:
                                type: array
                                items:
                                  type: string
                                description: The documents in the bundle the party is on.
                            required:
                              - id
                              - name
                              - email
                              - phone
                              - role
                              - signingOrder
                              - delivery
                              - signatureMethod
                              - signVerification
                              - openVerification
                              - status
                              - documentIds
                            additionalProperties: false
                          description: The bundle's parties, in signing order.
                      required:
                        - id
                        - name
                        - status
                        - subject
                        - message
                        - expiresAt
                        - signingMode
                        - language
                        - reminderIntervalDays
                        - signableAfterExpired
                        - internalRecipients
                        - nationalIdDisplayMode
                        - openVerification
                        - sendPlainTextEmailOnly
                        - redirectUrl
                        - redirectEnabled
                        - documentCount
                        - createdAt
                        - updatedAt
                        - documents
                        - parties
                      additionalProperties: false
                  hasMore:
                    type: boolean
                    description: True if more items follow this page.
                  nextCursor:
                    description: >-
                      Pass this as `cursor` to get the next page. Null on the
                      last page.
                    type:
                      - string
                      - 'null'
                  total:
                    description: >-
                      The number of items that match the filters. Present only
                      with `include=total`.
                    type: integer
                    minimum: -9007199254740991
                    maximum: 9007199254740991
                required:
                  - data
                  - hasMore
                  - nextCursor
                additionalProperties: false
                description: Bundles, newest first
              example:
                data:
                  - id: cm4k2x9p10044abcd1234efgh
                    name: Kai Lindqvist
                    status: DRAFT
                    subject: Ditt anställningsavtal från Exempelbolaget AB
                    message: >-
                      Hej Kai! Här är ditt anställningsavtal. Signera det med
                      BankID senast den 28 oktober.
                    expiresAt: '2026-10-28T22:00:00.000Z'
                    signingMode: PARALLEL
                    language: sv
                    reminderIntervalDays: 3
                    signableAfterExpired: false
                    internalRecipients:
                      - hr@example.com
                    nationalIdDisplayMode: FULL
                    openVerification: PIN
                    sendPlainTextEmailOnly: false
                    redirectUrl: null
                    redirectEnabled: true
                    documentCount: 1
                    createdAt: '2026-09-28T09:12:00.000Z'
                    updatedAt: '2026-09-28T09:15:00.000Z'
                    documents:
                      - id: cm4k2x9p10003abcd1234efgh
                        name: Anställningsavtal – Kai Lindqvist
                        status: COMPLETED
                        parties:
                          - id: cm4k2x9p10004abcd1234efgh
                            bundlePartyId: cm4k2x9p10004abcd1234efgh
                            name: Kai Lindqvist
                            email: kai@example.com
                            role: SIGNER
                            signingStatus: SIGNED
                            signedAt: '2026-09-29T07:41:00.000Z'
                    parties:
                      - id: cm4k2x9p10004abcd1234efgh
                        name: Kai Lindqvist
                        email: kai@example.com
                        phone: '+46701740605'
                        role: SIGNER
                        signingOrder: 1
                        delivery:
                          - EMAIL
                        signatureMethod: SE_BANKID
                        signVerification: PIN
                        openVerification: PIN
                        status: PENDING
                        documentIds:
                          - cm4k2x9p10003abcd1234efgh
                hasMore: false
                nextCursor: null
                total: 1
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
        '400':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: VALIDATION_FAILED
                message: 'Unrecognized key: "limit"'
                userMessage: Förfrågan innehåller ogiltiga värden.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
                issues:
                  - path: ''
                    code: UNRECOGNIZED_KEY
                    message: 'Unrecognized key: "limit"'
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
        '401':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: UNAUTHORIZED
                message: Invalid API token
                userMessage: Ogiltig API-nyckel
                requestId: req_V1StGXR8Z5jdHi6BmyT2
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
        '403':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: INSUFFICIENT_SCOPE
                message: 'Insufficient OAuth scope: requires documents:read'
                userMessage: Applikationen saknar behörighet (scope) för denna åtgärd.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
                requiredScopes:
                  - documents:read
                grantedScopes:
                  - profile:read
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
        '404':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: NOT_FOUND
                message: Bundle not found
                userMessage: Resursen hittades inte.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
                resource: bundle
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
        '409':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: INVALID_STATE
                message: >-
                  The resource's current state doesn't allow the operation, such
                  as editing a document that was already sent or downloading a
                  file that isn't produced yet.
                userMessage: Åtgärden är inte möjlig i resursens nuvarande status.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
            Retry-After:
              description: Seconds to wait before you retry.
              schema:
                type: integer
        '429':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: RATE_LIMITED
                message: API rate limit exceeded
                userMessage: För många förfrågningar. Försök igen om en stund.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
            Retry-After:
              description: Seconds to wait before you retry.
              schema:
                type: integer
        '500':
          description: Error response
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: INTERNAL_ERROR
                message: Internal server error
                userMessage: Något gick fel.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
        '503':
          description: >-
            `UPSTREAM_UNAVAILABLE`: a service the operation depends on failed.
            Retry with exponential backoff.
          content:
            application/json:
              schema:
                type: object
                properties:
                  code:
                    type: string
                    enum:
                      - VALIDATION_FAILED
                      - INVALID_JSON
                      - EXPIRED
                      - IDEMPOTENCY_KEY_REUSED
                      - WORKSPACE_REQUIRED
                      - INVALID_API_VERSION
                      - API_VERSION_SUNSET
                      - UNAUTHORIZED
                      - API_KEY_EXPIRED
                      - PERMISSION_DENIED
                      - WORKSPACE_ACCESS_DENIED
                      - INSUFFICIENT_SCOPE
                      - PLAN_REQUIRED
                      - ACCOUNT_INACTIVE
                      - ACCOUNT_SETUP_REQUIRED
                      - LIMIT_EXCEEDED
                      - DOCUMENT_NOT_READY
                      - APPROVAL_REQUIRED
                      - NOT_FOUND
                      - ROUTE_NOT_FOUND
                      - INVALID_STATE
                      - BUNDLE_OWNS_SETTING
                      - ALREADY_EXISTS
                      - IDEMPOTENCY_KEY_IN_USE
                      - RATE_LIMITED
                      - INTERNAL_ERROR
                      - UPSTREAM_UNAVAILABLE
                    description: >-
                      Machine-readable error code from a closed list. Branch on
                      it, never on `message`.
                  message:
                    type: string
                    description: >-
                      What went wrong, in English, for developers. Its wording
                      can change; don't parse it.
                  userMessage:
                    type: string
                    description: >-
                      Text that is safe to show to an end user, usually in
                      Swedish
                  requestId:
                    type: string
                    description: >-
                      Identifier of the request, the same value as the
                      `Sajn-Request-Id` header. Quote it when you contact
                      support.
                  resource:
                    description: >-
                      On a 404 `NOT_FOUND`, the type of the missing resource,
                      such as `document` or `party`; `null` when the API can't
                      tell
                    type:
                      - string
                      - 'null'
                  issues:
                    description: Every validation issue, on a 400 `VALIDATION_FAILED`
                    type: array
                    items:
                      type: object
                      properties:
                        path:
                          type: string
                          description: >-
                            Dotted path to the invalid value, such as
                            `parties.0.email`; empty when no single input caused
                            the issue
                        code:
                          type: string
                          enum:
                            - INVALID_TYPE
                            - INVALID_FORMAT
                            - INVALID_VALUE
                            - TOO_SMALL
                            - TOO_BIG
                            - UNRECOGNIZED_KEY
                        message:
                          type: string
                          description: What is wrong with the value, in English
                      required:
                        - path
                        - code
                        - message
                      additionalProperties: false
                  requiredScopes:
                    description: >-
                      OAuth scopes the endpoint requires, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  grantedScopes:
                    description: >-
                      OAuth scopes the token was granted, on a 403
                      `INSUFFICIENT_SCOPE`
                    type: array
                    items:
                      type: string
                  readiness:
                    description: >-
                      What blocks sending the document, on a 409
                      `DOCUMENT_NOT_READY`
                    type: array
                    items:
                      type: object
                      properties:
                        code:
                          type: string
                          description: >-
                            What is wrong, such as `MISSING_EMAIL` or
                            `NO_EXPIRATION`. New codes can be added.
                        severity:
                          type: string
                          enum:
                            - BLOCKER
                            - WARNING
                          description: '`BLOCKER` stops the send; `WARNING` doesn''t.'
                        message:
                          type: string
                          description: What is wrong, in English
                        userMessage:
                          type: string
                          description: >-
                            The same, naming the party or field, in Swedish, for
                            showing to a user
                      required:
                        - code
                        - severity
                        - message
                        - userMessage
                      additionalProperties: false
                required:
                  - code
                  - message
                  - userMessage
                  - requestId
                additionalProperties: {}
                description: Error response
              example:
                code: UPSTREAM_UNAVAILABLE
                message: >-
                  A service the operation depends on, such as an eID provider or
                  a connected integration, failed or is unavailable. Retry with
                  exponential backoff.
                userMessage: En extern tjänst svarar inte just nu. Försök igen om en stund.
                requestId: req_V1StGXR8Z5jdHi6BmyT2
          headers:
            Sajn-Version:
              description: API version that served the request.
              schema:
                type: string
            Deprecation:
              description: >-
                Present only when the version is deprecated: when it was
                deprecated, as `@<unix seconds>`.
              schema:
                type: string
            Sunset:
              description: >-
                Present only when the version is deprecated: the HTTP date from
                which requests on this version return 400 `API_VERSION_SUNSET`.
              schema:
                type: string
            Sajn-Request-Id:
              description: >-
                Identifier of the request. Error bodies repeat it as
                `requestId`; quote it when you contact support.
              schema:
                type: string
            X-RateLimit-Limit:
              description: Requests allowed per minute.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests left in the current minute.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: When the minute window resets, in Unix seconds.
              schema:
                type: integer
      security:
        - bearerAuth: []
        - oauth2:
            - documents:read
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        API key, e.g. `Authorization: Bearer sajn_svc_...`. Not scope-limited:
        acts with its owner's workspace role.
    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: >-
              Read the user's profile, including name, phone number and email
              address.
            documents:read: Read documents.
            documents:write: Create documents and edit the documents the user created.
            documents:delete: >-
              Delete documents, files, folders, custom fields and comment
              threads.
            forms:read: Read forms and their settings.
            forms:write: Create, edit and publish forms.
            forms:delete: Permanently delete forms and their submissions.
            forms:submissions:read: Read form submissions and the respondents' contact details.
            templates:read: Read templates.
            templates:write: Create and edit templates.
            contacts:read: Read contacts.
            contacts:write: Create and edit contacts.
            contacts:delete: Delete contacts.
            organization:read: Read information about the organization.
            audit:read: Read document activity and event logs.
            signatures:read: >-
              Read the identity the eID verified at signing, including the
              national identity number.
            sajnid:read: Read sajn ID verifications.
            sajnid:write: Create sajn ID verifications.
            login:read: Read the result of sajn Login sessions.
            login:write: Start sajn Login sessions.
            webhooks:read: Read webhooks and their deliveries.
            webhooks:write: Create, edit and delete webhooks.
            actions:read: Read suggested actions and what each one does.
            actions:write: >-
              Approve, dismiss and snooze suggested actions. An approval can
              send reminders to counterparties, terminate agreements and create
              follow-ups.
            members:read: Read the workspace's members.
            members:write: Invite and manage workspace members.
            roles:read: Read the workspace's roles and permissions.
            roles:write: Create, edit and delete workspace roles.
            sajn:read: >-
              MCP only. Read everything the user's role can read in the
              workspace.
            sajn:write: >-
              MCP only. Includes sajn:read, and create, change and send within
              the user's role.
            sajn:admin: >-
              MCP only. Includes sajn:write, and manage members, roles and
              settings within the user's role.

````

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