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.
openapi: 3.2.0
info:
title: Tvarka Sign Files 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: Files
paths:
/v1/files:
post:
tags:
- Files
operationId: uploadFile
summary: Store a document once for reuse across signings
description: 'Returns a `fileToken` a later signing may reference instead of
carrying base64 again. The same intake as a posted document, so a
file that would be refused inline is refused here rather than at the
signing that uses it.
The bytes are **copied** into each signing that uses the token, never
shared by reference: deleting a file, or letting it expire, can never
reach backwards into a signing that already used it.'
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
name:
type: string
content:
type: string
format: byte
required:
- name
- content
additionalProperties: false
responses:
'429':
$ref: '#/components/responses/Problem'
'201':
description: The stored file.
content:
application/json:
schema:
$ref: '#/components/schemas/StoredFile'
'400':
$ref: '#/components/responses/Problem'
'401':
$ref: '#/components/responses/Problem'
/v1/files/{fileToken}:
get:
tags:
- Files
operationId: getFile
summary: Inspect a stored file
parameters:
- $ref: '#/components/parameters/FileToken'
responses:
'401':
$ref: '#/components/responses/Problem'
'429':
$ref: '#/components/responses/Problem'
'200':
description: The stored file.
content:
application/json:
schema:
$ref: '#/components/schemas/StoredFile'
'404':
$ref: '#/components/responses/Problem'
delete:
tags:
- Files
operationId: deleteFile
summary: Purge a stored file
description: 'Drops the bytes. Signings that already referenced the token are
untouched, because they hold their own copy.'
parameters:
- $ref: '#/components/parameters/FileToken'
responses:
'401':
$ref: '#/components/responses/Problem'
'429':
$ref: '#/components/responses/Problem'
'200':
description: The file, now purged.
content:
application/json:
schema:
$ref: '#/components/schemas/StoredFile'
'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.
'
StoredFile:
type: object
properties:
fileToken:
type: string
format: uuid
name:
type: string
mediaType:
type: string
sha256:
type: string
bytes:
type: integer
createdAt:
type: string
format: date-time
expiresAt:
type: string
format: date-time
description: 'An unreferenced upload is not kept forever just because nobody
deleted it. Re-upload after this, or post the bytes inline.
'
usedCount:
type: integer
description: How many signings have copied these bytes.
responses:
Problem:
description: An RFC 9457 problem document.
content:
application/problem+json:
schema:
$ref: '#/components/schemas/Problem'
parameters:
FileToken:
name: fileToken
in: path
required: true
schema:
type: string
format: uuid
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.
'