Skip to content
KovaPDF API

Build signatures into your own software

Send PDFs for signature and follow every step with webhooks. Sign PDFs with your own certificate. Check the signatures in any PDF. One REST API, JSON over HTTPS, running the same signature tools as the KovaPDF website.

10 free tasks within 14 daysNo cardTest emails go only to you

Send a PDF for signatureTest mode
curl https://api.kovapdf.com/api/v1/sign-requests \
  -H "Authorization: Bearer kova_test_YOUR_KEY" \
  -H "Idempotency-Key: 6f1c2a8e-3d4b-4f7a-9a51-2b8f0c9e7d13" \
  -F "file=@lease.pdf" -F "spec=<lease.json"
HTTP/1.1 201 Created
KovaPDF-Mode: test
KovaPDF-Test-Tasks-Left: 9

{ "id": "4f0c2b7e-…", "status": "IN_PROGRESS", "mode": "test" }
  • REST, JSON over HTTPS
  • OpenAPI 3.1 file
  • Webhooks signed with HMAC-SHA256
  • Safe retries with Idempotency-Key
What you can build

Four jobs your software can hand over

Each one is a few lines of code. Every call is checked, limited and recorded exactly like the same action on the website.

Send contracts for signature from your app

Upload a PDF, name the people and place the fields. Each person gets an email with a private link and signs in the browser, in order or all at once. You get the sealed PDF back with its certificate of completion. Reminders, access codes, approvers, witnesses and people who only get a copy all work as on the website.

POST /sign-requestsGET /sign-requests/{id}See the code

Know the moment something changes

A webhook tells your server when a request is sent, viewed, signed, approved, declined, reassigned, completed, expired or cancelled. Each delivery is signed, and if your server is down we try again over about eight and a half hours.

9 eventsKovaPDF-SignatureSee the code

Sign PDFs with your own certificate

Send a PDF with your .pfx or .p12 file and its password, and get back a PDF signed in the PAdES format, with a trusted timestamp and long term validation data when you ask for them. The certificate and password are used once, in memory, and never stored.

POST /digital-signSee the code

Check the signatures in any PDF

Upload a signed PDF and get a report for each signature: whether the document changed after signing, and whether the certificate is valid, trusted, revoked or expired, with its chain and timestamp. It is the same check the Verify tool on our website runs.

POST /verifySee the code
Code for each job

Copy, paste, run

Pick a job and a language. Each sample runs as it is once your key is in it, and each response shows the headers a test key gets back. All endpoints live under https://api.kovapdf.com/api/v1.

Send a PDF for signature

Upload the PDF and say who signs where. Send an Idempotency-Key with it, and keep it: if the network drops and you send the same request again, you get the first answer back, never a second request or a second email. With a test key the signing email comes to you, not to the signer.

curl https://api.kovapdf.com/api/v1/sign-requests \
  -H "Authorization: Bearer kova_test_YOUR_KEY" \
  -H "Idempotency-Key: 6f1c2a8e-3d4b-4f7a-9a51-2b8f0c9e7d13" \
  -F "file=@lease.pdf" \
  -F 'spec={
    "title": "Lease agreement",
    "sequential": false,
    "expiresInDays": 14,
    "signers": [{ "name": "Emily Carter", "email": "emily@example.com", "order": 1 }],
    "fields": [{ "signer": 0, "kind": "SIGNATURE", "page": 1, "x": 72, "y": 90, "width": 180, "height": 48 }]
  }'
ResponseTest mode
HTTP/1.1 201 Created
Content-Type: application/json
KovaPDF-Mode: test
KovaPDF-Test-Tasks-Left: 9
RateLimit-Limit: 60
RateLimit-Remaining: 59

{
  "id": "4f0c2b7e-…",
  "title": "Lease agreement",
  "status": "IN_PROGRESS",
  "sequential": false,
  "hasFinal": false,
  "signers": [
    { "id": "aa57…", "name": "Emily Carter", "email": "emily@example.com", "order": 1,
      "status": "SENT", "isTurn": true, "link": "https://www.kovapdf.com/sign/…" }
  ],
  "mode": "test"
}

Make your test key in your account and it appears here.

All endpoints

Every endpoint at a glance

Every key sends Authorization: Bearer followed by the key. Files go as multipart/form-data, everything else is JSON.

EndpointWhat it doesScopeTask
GET/meWho am IAny keyFree
POST/sign-requestsSend a document for signaturesign-requests:write1 task
GET/sign-requestsList signature requestssign-requests:readFree
GET/sign-requests/{id}Get one signature requestsign-requests:readFree
POST/sign-requests/{id}/remindRemind signerssign-requests:writeFree
POST/sign-requests/{id}/cancelCancel a signature requestsign-requests:writeFree
GET/sign-requests/{id}/documentDownload the documentsign-requests:readFree
POST/verifyVerify the signatures in a PDFverify1 task
POST/digital-signSign a PDF with your certificatedigital-sign1 task
POST/filesUpload a filetoolsFree
GET/files/{id}A file's detailstoolsFree
POST/jobsStart a jobtoolsFree
GET/jobs/{id}A job's state and resulttoolsFree
GET/toolsThe toolsAny keyFree
GET/downloads/{token}Download a resultAny keyFree
GET/openapi.jsonThis descriptionNo key neededFree

Full referenceEvery error codeDownload the OpenAPI file

Free to try

How the free test key works

Try every part of the API with your own documents before you talk to anyone. The test is built so that nothing you try can reach a real person.

Test keyTEST
kova_test_••••••••••••••••••••

This is a test key. It runs 10 tasks within 14 days. Every email it sends goes only to your own address, never to anyone else, and every file is marked TEST.

Tasks used3 of 10

What you see in your account when you make a test key. The numbers here are an example.

  • You make it yourself

    Sign in, confirm your email address, and make the key in your account under Developer API. No card, no call. You can hold one test key at a time.

  • Ten tasks, defined

    One task is one signature request made, one verification or one digital signing. Reading, listing, downloading and status calls are not tasks, and a call that fails is not counted.

  • Test mail only reaches you

    Whatever addresses a test request names, every signing email goes to the verified address on your account, with TEST in the subject. A test can never reach a real customer by mistake.

  • Every file says TEST

    Every page of a PDF made with a test key carries a TEST stamp and a line saying it is not for real agreements. With digital signing the stamp goes on first, so the signature covers it.

  • Deleted after 7 days

    Signature requests made with a test key are deleted 7 days after they were made, whatever state they are in.

  • Easy to tell apart

    Test keys start with kova_test_. Every answer carries the headers KovaPDF-Mode: test and KovaPDF-Test-Tasks-Left, and its JSON says "mode": "test". After 10 tasks, or 14 days from your first test key, calls get 401 test_key_used_up or test_key_expired.

Ready for real documents?

Tell us what you will build on the request form. Once we turn API access on for your account, you make a live key, which starts with kova_live_, in the same place as your test key. The email that tells you access is on never contains a key. Accounts with API access also get test tasks every month that never count against their limit.

Talk to us about API access
Security

Controls you can check for yourself

Everything here is how the API behaves today, and you can see each one in the responses. More on how we protect files and accounts is in the Trust Center.

Keys stored hashed, shown once

We keep only a SHA-256 hash of each key. You see the full key once, when you make it. Lost it? Revoke it, which takes effect on the next call, and make a new one.

Scopes for each key

Give each key only what it needs, from the four scopes below. A call outside them gets 403 insufficient_scope, naming the scope it needed.

Keys that expire

Choose when a key stops working: after 1 to 366 days, or never. Its holder gets an email 7 days before. An expired key gets 401 expired_api_key.

IP allow list

Limit a key to your servers' addresses or ranges, IPv4 or IPv6, such as 203.0.113.0/24. A call from anywhere else gets 403 ip_not_allowed.

Signed webhooks

Every delivery carries KovaPDF-Signature: t=…,v1=…, an HMAC-SHA256 of the timestamp and the raw body under your endpoint's own secret. Reject anything that does not match or is more than five minutes old.

Files deleted on a schedule

Finished signature requests are deleted 30 days after they finish, test requests after 7 days, and answers kept for Idempotency-Key after 24 hours. Certificates and passwords are never stored.

A key that pauses itself

A key pauses itself when it runs far more tasks in 10 minutes than an integration normally does, or when too many of its signing emails bounce. It then gets 403 key_paused until we look at it with you.

Safe retries

Send an Idempotency-Key with every POST. A repeat of the same request within 24 hours gets the first answer back, with Idempotency-Replayed: true, and runs nothing twice.

Workspace keys

In a Team or Business workspace, a key works on the workspace's requests. A member's key stops the moment they leave; a key that belongs to the workspace keeps working.

Scopes

A call outside a key's scopes gets 403 insufficient_scope, with the scope it needed in required and the key's scopes in granted. GET /me works with any key.

ScopeWhat it allowsEndpoints
sign-requests:readRead signature requests. List your signature requests, read one with its signers and audit trail, and download its documents.GET /sign-requests
GET /sign-requests/:id

GET /sign-requests/:id/document
sign-requests:writeSend and manage signature requests. Send new signature requests, remind signers and cancel requests.POST /sign-requests
POST /sign-requests/:id/remind

POST /sign-requests/:id/cancel
verifyVerify signatures. Check the digital signatures in a PDF and get the report.POST /verify
digital-signSign with a certificate. Sign a PDF with your own .pfx or .p12 certificate.POST /digital-sign
toolsWork on files. Upload files and run tools on them: compress, merge, split, organize, convert, read text from scans, redact and convert Bangla or Hindi text.POST /files
GET /files/:id

POST /jobs

GET /jobs/:id
Limits

Limits, and what happens at each one

Every limited call gets an answer your code can act on: a status, a stable code, a plain sentence in error and, where waiting helps, a Retry-After header in seconds.

LimitWhat happens when you reach it
60 calls a minute per key429 rate_limited with Retry-After in seconds. Every answer carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset.
30 signature requests sent an hour per key429 rate_limited with Retry-After. Reminders count as sends.
A daily cap per key, in UTC daysThe lower of the cap you set on the key and your plan's cap. At the cap: 429 daily_limit until midnight UTC. Refused calls do not count.
Your monthly task limit (live access)429 monthly_limit with Retry-After until the 1st of next month. Nothing is charged on top. You get an email at 80 percent and at 100 percent.
A pack of tasks (live access)429 credits_used once the pack is used. Write to us for more.
The free test: 10 tasks within 14 days401 test_key_used_up or test_key_expired, with the link to ask for access.
File sizeUp to 15 MB for a signature request. Signing and verifying take the same files as the website.

Limits in the referenceThe limit codes

Pricing

How pricing works

API access is not included in the website plans. It is priced for how you will use it: tell us what you will build and roughly how many documents a month, and we send you a written offer by email.

What an offer states

  • One unit, defined once. You pay for tasks, and nothing else is counted.
  • Monthly, yearly or a one time pack. A monthly task allowance, billed monthly or yearly, or a pack of tasks to use within 12 months.
  • No hidden overage. At your limit, calls stop with a clear 429 and nothing is charged on top. We email you at 80 percent and at 100 percent.
  • Dates in writing. When access starts and when it ends. We email you 7 days before the end date.
  • Your keys and addresses. How many live keys you may have, and the server addresses they may be called from, if you want a list.

One task is one signature request made, one verification or one digital signing. Reading, listing, downloading and status calls are not tasks, and a call that fails is not counted.

Talk to us

The request form asks what you will build, which parts of the API you need, how many documents you expect, and where your signers are. We read every request and answer it by email.

  • No sales call needed. Everything can happen by email.
  • Keep testing meanwhile. Your test key keeps working within its 10 tasks and 14 days.
Downloads

OpenAPI file and Postman collection

No SDK to install. Import either file into the tools you already use, or generate a client from the OpenAPI file in the language you work in.

OpenAPI 3.1 file

Every endpoint, the key header, the scope each endpoint needs, which calls are tasks, the errors, the limits and examples. The API serves the same file at https://api.kovapdf.com/api/v1/openapi.json, no key needed.

kovapdf.com/developers/openapi.json

Postman collection

One request for every endpoint, with the variables baseUrl and apiKey and a fresh Idempotency-Key on every POST. Import it, put your test key in apiKey, and send.

kovapdf.com/developers/kovapdf.postman_collection.json
Questions

Questions developers ask

What can I do with a free test key?

Everything the API does: send signature requests and follow them with webhooks, sign PDFs with your own certificate, and verify the signatures in PDFs. A test key runs 10 tasks within 14 days. Every signing email it sends goes only to you, and every file it makes is stamped TEST.

What counts as a task?

One task is one signature request made, one verification or one digital signing. Reading, listing, downloading and status calls are not tasks, and a call that fails is not counted.

How does test mail work?

A test request can name any signers, but every signing email goes to the verified address on your account, with TEST in the subject. You open each link yourself and sign as each person, so you can try the whole flow without bothering anyone, and a test can never reach a real customer by mistake.

What happens when I reach a limit?

The call is refused with HTTP 429 and a code that names the limit: rate_limited, daily_limit, monthly_limit or credits_used. Where waiting helps, a Retry-After header says how many seconds. Refused calls are not counted, and nothing is ever charged on top of your limit.

How does pricing work?

Live access is priced for how you will use it. Tell us what you will build and roughly how many documents a month, and we send you a written offer: a monthly task allowance billed monthly or yearly, or a one time pack of tasks. At the limit, calls stop with a clear answer. There is no hidden overage.

Do the people who sign need an account?

No. Signers open a private link from their email and sign in the browser. Only you, the sender, need a KovaPDF account.

Can people sign inside my own app?

Not yet. Today signers open a secure link from their email. Each signer in the API's answer has their own link, so you can show it in your app as well. If signing inside your app matters to you, tick it on the request form so we know.

Is there an SDK?

Not yet. The API is plain JSON over HTTPS, so any HTTP client works, and the OpenAPI 3.1 file lets you generate a client in most languages. The Postman collection has every endpoint ready to try.

How do I retry without sending twice?

Send an Idempotency-Key header with every POST, for example a UUID. If the network drops and you send the same request again with the same key, you get the first answer back: no second signature request, no second email and no second task. Answers are kept for 24 hours.

How long are files kept?

Finished signature requests are deleted 30 days after they finish, and test requests 7 days after they were made. PDFs you sign or verify are not kept, except that the answer to a POST with an Idempotency-Key is kept for 24 hours so a retry gets it back. Certificates and passwords are never stored.

Try the whole API before you talk to anyone

Make a free test key, send yourself a signature request, and open the TEST stamped PDF in your own inbox. When it works, tell us what you are building.

Questions first? Write to support@kovapdf.com.