Tvarka ATK API Batches API

The Batches API from Tvarka ATK API — 2 operation(s) for batches.

Operations 2

POST /v1/batches Raise one signing per document for one set of parties #
GET /v1/batches/{batchId} Poll a batch and every signing in it #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/tvarka-batches-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

tvarka-batches-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Tvarka Sign Batches API
  version: 1.2.1
  x-status: 'Live and publicly reachable at https://sign-api.tvarka.pro since 2026-08-27, on both production boxes and behind Cloudflare. The first production tenant was onboarded 2026-08-28 and the launch gate ceremony ran the same day: a production signing ordered through this API was signed with a real eID (Mobile-ID) and validated QUALIFIED_VALID, and webhook delivery was exercised the same day against an external production receiver with the HMAC signature and idempotency key verified on arrival.'
  description: 'Machine channel for Tvarka Sign: post a document and a list of signers,

    and Tvarka runs its ordinary qualified signing ceremony for each of them.'
  contact:
    name: Tvarka
    email: info@tvarka.pro
    url: https://tvarka.pro
servers:
- url: https://sign-api.tvarka.pro
  description: Production and sandbox (selected by the key)
security:
- bearerAuth: []
tags:
- name: Batches
paths:
  /v1/batches:
    post:
      tags:
      - Batches
      operationId: createBatch
      summary: Raise one signing per document for one set of parties
      description: 'A batch is a **grouping, not a single signing act**. Every document

        keeps its own ceremony and its own signature, because that is what

        happens: the Lithuanian ID card produces one signature per document,

        and the external ceremony has no USB door where the product''s batch

        signing lives. This buys one call instead of N and one identifier to

        poll. It does not buy one PIN for many documents, and nothing here

        should be read as promising that.


        Creation is atomic: either every signing in the batch is raised, or

        the error response means none was.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                title:
                  type: string
                  maxLength: 255
                documents:
                  type: array
                  minItems: 1
                  maxItems: 20
                  items:
                    type: object
                    properties:
                      name:
                        type: string
                      content:
                        type: string
                        format: byte
                      fileToken:
                        type: string
                        format: uuid
                      flatten:
                        type: boolean
                    required:
                    - name
                    additionalProperties: false
                signers:
                  type: array
                  minItems: 1
                  items:
                    $ref: '#/components/schemas/SignerRequest'
                delivery:
                  type: string
                  enum:
                  - link
                  - email
                signingOrder:
                  type: string
                  enum:
                  - parallel
                  - sequential
                webhookUrl:
                  type: string
                  format: uri
                externalId:
                  type: string
                  maxLength: 120
                expiresInDays:
                  type: integer
                  minimum: 1
                softDeadlineInDays:
                  type: integer
                  minimum: 1
                  description: Applied to every signing the batch raises.
              required:
              - title
              - documents
              - signers
              additionalProperties: false
      responses:
        '401':
          $ref: '#/components/responses/Problem'
        '429':
          $ref: '#/components/responses/Problem'
        '201':
          description: The batch and every signing it raised.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Batch'
        '400':
          $ref: '#/components/responses/Problem'
        '402':
          $ref: '#/components/responses/Problem'
  /v1/batches/{batchId}:
    get:
      tags:
      - Batches
      operationId: getBatch
      summary: Poll a batch and every signing in it
      parameters:
      - $ref: '#/components/parameters/BatchId'
      responses:
        '401':
          $ref: '#/components/responses/Problem'
        '429':
          $ref: '#/components/responses/Problem'
        '200':
          description: The batch.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Batch'
        '404':
          $ref: '#/components/responses/Problem'
components:
  schemas:
    ProblemFieldError:
      type: object
      description: One rejected field.
      properties:
        pointer:
          type: string
          description: 'RFC 6901 JSON Pointer into the request body, for example

            `/signers/0/email` or `/container/files/2/content`.

            '
        detail:
          type: string
      required:
      - pointer
      - detail
    Problem:
      type: object
      description: RFC 9457.
      properties:
        type:
          type: string
          format: uri
        title:
          type: string
        status:
          type: integer
        detail:
          type: string
        errors:
          type: array
          description: 'Present on `validation-failed`, and on the single-fault problems

            that name a field. Request-body validation collects rather than

            failing fast, so a caller who got three fields wrong learns all

            three from one response.

            '
          items:
            $ref: '#/components/schemas/ProblemFieldError'
        recoveryUrl:
          type: string
          format: uri-reference
          description: 'Present on the payment-required refusal when a web page exists

            that fixes it: the tenant''s payment setup, reached with an

            ordinary browser login. Show it to your operator; it is not an

            API endpoint.

            '
    SignerStatus:
      type: string
      enum:
      - pending
      - signed
      - declined
      - cancelled
      - expired
      - simulated
      - waiting
      - recorded
      description: '`waiting` - a sequential signer whose turn has not come; their

        ceremony link answers 404 until it does.

        `recorded` - a viewer. Never invited, never blocks completion.

        '
    SignerRequest:
      type: object
      properties:
        role:
          type: string
          enum:
          - signer
          - viewer
          default: signer
          description: 'A `viewer` is recorded but never invited, never gets a ceremony

            link, and never holds up completion. Tvarka sends them nothing.

            At least one signer is required.

            '
        email:
          type: string
          format: email
        name:
          type: string
          maxLength: 500
        language:
          type: string
          enum:
          - lt
          - en
          default: lt
          description: Per signer, for their email and ceremony page.
        personalCode:
          type: string
          pattern: ^[0-9]{11}$
          description: 'Optional Lithuanian identity lock. Tvarka stores a keyed hash

            and encrypted value, never returns the code, and refuses a

            different authenticated signer.

            '
        methods:
          type: array
          minItems: 1
          uniqueItems: true
          default:
          - nfc
          - smart_id
          - mobile_id
          items:
            $ref: '#/components/schemas/SigningMethod'
          description: 'Per-signer allow-list. `nfc` uses the Tvarka Sign mobile app;

            Smart-ID and Mobile-ID use the hosted page or mobile app.

            '
      required:
      - email
      additionalProperties: false
    Signing:
      type: object
      properties:
        signingId:
          type: string
          format: uuid
        status:
          $ref: '#/components/schemas/SigningStatus'
        title:
          type: string
        delivery:
          type: string
          enum:
          - link
          - email
        signingOrder:
          type: string
          enum:
          - parallel
          - sequential
          description: '`sequential` releases one signer at a time in the order they were

            posted. The signers who are waiting hold a ceremony link that

            answers 404 until their turn, so the ordering is enforced rather

            than merely unsent. A decline stops the workflow at the

            decliner''s turn: the signing settles `declined` and the signers

            still waiting are cancelled.

            '
        softDeadlineAt:
          type: string
          format: date-time
          nullable: true
          description: 'The date the signing is wanted by, as opposed to `expiresAt`,

            which is the date it dies on. Nothing expires here; it is when the

            one automatic reminder goes out.

            '
        externalId:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        expiresAt:
          type: string
          format: date-time
          nullable: true
        completedAt:
          type: string
          format: date-time
          nullable: true
        completionMode:
          type: string
          enum:
          - qes_ceremony
          - sandbox_simulation
          nullable: true
          description: '`qes_ceremony` means human eID signing. `sandbox_simulation`

            exercises lifecycle/webhook integration and creates no

            signature; its artifact is flagged `sandbox: true`.

            '
        erasedAt:
          type: string
          format: date-time
          nullable: true
        detail:
          type: string
          description: Present when the status needs a sentence of explanation.
        signers:
          type: array
          items:
            $ref: '#/components/schemas/Signer'
        document:
          $ref: '#/components/schemas/SignedDocument'
      additionalProperties: false
    SigningStatus:
      type: string
      enum:
      - pending
      - completed
      - declined
      - cancelled
      - expired
      - failed
      description: '`pending` - at least one signer can still sign.

        `completed` - every signer signed.

        `declined` - somebody declined and nobody else can still sign.

        `expired` - the window closed first.

        `cancelled` - you retracted it.

        `failed` - the signing could not be prepared.

        '
    Signer:
      type: object
      properties:
        signerId:
          type: string
          format: uuid
        role:
          type: string
          enum:
          - signer
          - viewer
          description: 'A `viewer` is a recorded non-signing party: no invitation is

            raised, no ceremony link exists, and they never hold up

            completion. Tvarka sends them nothing - you hold the webhook and

            the download, and distribute. At least one signer is required.

            '
        email:
          type: string
          format: email
          nullable: true
        name:
          type: string
          nullable: true
        language:
          type: string
          enum:
          - lt
          - en
        status:
          $ref: '#/components/schemas/SignerStatus'
        ceremonyUrl:
          type: string
          format: uri
          description: 'Present only while this signer can still sign. A finished or

            retracted invitation has no live URL.

            '
        signedAt:
          type: string
          format: date-time
          nullable: true
        declinedAt:
          type: string
          format: date-time
          nullable: true
        declineReason:
          type: string
        methodsAllowed:
          type: array
          items:
            $ref: '#/components/schemas/SigningMethod'
        actualMethod:
          allOf:
          - $ref: '#/components/schemas/SigningMethod'
          nullable: true
          description: Present after a real signature; contains no identity data.
        identityLocked:
          type: boolean
        identityMatched:
          type: boolean
          nullable: true
          description: True only after a locked signer completes the real ceremony.
        simulatedAt:
          type: string
          format: date-time
          nullable: true
      additionalProperties: false
    SignedDocument:
      type: object
      description: 'The newest signed output. Absent until somebody signs, except on a

        sandbox simulation, where it describes the unsigned artifact.

        '
      properties:
        sha256:
          type: string
        bytes:
          type: integer
        mimeType:
          type: string
        sandbox:
          type: boolean
          description: 'Present and true only on a sandbox simulation. The bytes are a

            real file to which no signature was added.

            '
        signed:
          type: boolean
          description: 'Present and false only on a sandbox simulation. Absent on a real

            signing, where the output is signed by definition.

            '
    SigningMethod:
      type: string
      enum:
      - nfc
      - smart_id
      - mobile_id
      description: 'The orchestration methods. For direct LT ATK reader, USB, raw CAdES

        and lower-level NFC integration, use the ATK API.

        '
    Batch:
      type: object
      properties:
        batchId:
          type: string
          format: uuid
        title:
          type: string
        externalId:
          type: string
          nullable: true
        createdAt:
          type: string
          format: date-time
        signings:
          type: array
          items:
            $ref: '#/components/schemas/Signing'
  parameters:
    BatchId:
      name: batchId
      in: path
      required: true
      schema:
        type: string
        format: uuid
  responses:
    Problem:
      description: An RFC 9457 problem document.
      content:
        application/problem+json:
          schema:
            $ref: '#/components/schemas/Problem'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: '`Authorization: Bearer <key>`. Keys are provisioned by Tvarka during

        onboarding and shown once. A `tsk_live_` key acts on production; a

        `tsk_test_` key is the sandbox.


        The key acts as a named workspace user. If that person''s role is

        revoked, or the workspace is suspended, the key stops working.

        '