Basics
What the Scadenzario API is
An HTTP JSON interface at https://www.scadenzario.app/api/v1 for managing personal deadlines: list, create, update, complete, mark as paid and delete. Built for programs, not browsers: it sets no CORS, so the token must never live in a web page.
Paying never completes and completing never pays. Paying one instalment of a recurring deadline never closes the series; completing or moving a recurring deadline happens in the app only.
Authentication
One key for API and MCP
- 1
Open Settings in Scadenzario.
- 2
Open Analyze with AI.
- 3
Choose API and MCP access key.
- 4
Tap Generate and copy it now: it is shown once only.
Every request carries Authorization: Bearer <key>. Never put the key in the URL: it would land in logs.
curl -H "Authorization: Bearer $SCADENZARIO_TOKEN" https://www.scadenzario.app/api/v1/meReference
Endpoints
All examples use $SCADENZARIO_TOKEN as the environment variable holding the key.
List deadlines
curl -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
"https://www.scadenzario.app/api/v1/deadlines?status=active&limit=50"Filters: status=active|completed|all, from, to, q, repeatable label_id (OR), paid, recurring, overdue. Paged answer: {data, next_cursor, truncated}.
curl -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
"https://www.scadenzario.app/api/v1/deadlines/abc123"Create a deadline
curl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: insurance-2026" \
-d '{ "title": "Car insurance", "due_at": "2026-11-15", "amount": 120.50, "transaction_type": "expense" }' \
https://www.scadenzario.app/api/v1/deadlines201 with a Location header. Retrying with the same Idempotency-Key returns the original deadline, no duplicates.
curl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "deadlines": [ {"title": "Tax", "due_at": "2026-11-15"}, {"title": "Insurance", "due_at": "2026-12-01"} ] }' \
https://www.scadenzario.app/api/v1/deadlines/batchUp to 20 deadlines per call; the answer lists created and failed.
Update a deadline
curl -X PATCH -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "title": "Car insurance 2026", "amount": 125.00 }' \
https://www.scadenzario.app/api/v1/deadlines/abc123On recurring deadlines only metadata (title, notes, amount, payment, labels): the date moves in the app.
Complete and reopen
curl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
https://www.scadenzario.app/api/v1/deadlines/abc123/completecurl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
https://www.scadenzario.app/api/v1/deadlines/abc123/reopenOne-shot deadlines only, never recurring ones. Reopening re-checks the plan quota.
Pay without completing
curl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "paid_at": "2026-10-10T10:00:00Z", "amount": 120.50 }' \
https://www.scadenzario.app/api/v1/deadlines/abc123/paycurl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
https://www.scadenzario.app/api/v1/deadlines/abc123/unpayWorks on recurring deadlines too: paying one instalment never closes the series. Paid deadlines stop sending email reminders.
Delete a deadline
curl -X DELETE -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
https://www.scadenzario.app/api/v1/deadlines/abc123204 answer. Writes the sync tombstone: the deadline drops from every device. On a recurring deadline it ends the series.
Labels and summary
curl -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
https://www.scadenzario.app/api/v1/labelscurl -X POST -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "Car" }' \
https://www.scadenzario.app/api/v1/labelscurl -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
https://www.scadenzario.app/api/v1/summary/summary answers with overdue, next 7 and 30 days, and the unpaid total: the "how much do I owe this month?" question.
Long lists
Cursor pagination
GET /deadlines returns at most limit items (default 50, max 200). When next_cursor is not null there are more pages: repeat the same request with&cursor=.... When truncated is true the scan hit its internal cap: keep going with next_cursor so nothing is lost.
curl -H "Authorization: Bearer $SCADENZARIO_TOKEN" \
"https://www.scadenzario.app/api/v1/deadlines?limit=200&cursor=eyJkdWVBdE1pbGxpcyI6MTc5MjAwMDAwMDAwMCwiaWQiOiJhYmMifQ"Diagnostics
Errors
Body is always {error: {code, message}}. Full detail in openapi.json.
401 unauthenticatedMissing or invalid key. Carries WWW-Authenticate: Bearer.
400 invalid_inputMalformed JSON, invalid field, unreadable cursor.
404 not_foundUnknown or deleted id.
409 unsupported_for_recurringOperation forbidden on recurring deadlines: do it in the app.
409 sync_limit_reachedPlan quota exhausted, with details: {count, limit}.
429 rate_limitedToo many requests, with a Retry-After header.
Quotas
Limits
- 60 requests per minute per account, then
429; - 256 KB max body;
- plan cloud quota: 20 active deadlines on Free, 5,000 on PRO — enforced inside every write;
- personal deadlines only, no teams in v1;
- attachments stay in the app: the API only reports whether they exist.
Automations
Using it from n8n and Make
n8n — HTTP Request node
- 1
Add an HTTP Request node, POST method, URL
https://www.scadenzario.app/api/v1/deadlines. - 2
Under Authentication pick Generic Credential Type → HttpHeaderAuth: name
Authorization, valueBearer <key>. - 3
JSON body with
titleanddue_at. Add anIdempotency-Keyheader with a stable ID when the flow can re-run.
Make — HTTP module
- 1
Add the HTTP → Make a request module, POST method, URL
https://www.scadenzario.app/api/v1/deadlines. - 2
In Headers add
Authorization: Bearer <key>andContent-Type: application/json. - 3
Body with ISO
titleanddue_at.
Recipe
Create a deadline from a new spreadsheet row
Typical case: a Google Sheet collects bills to pay. In n8n theGoogle Sheets Trigger → Row Added trigger feeds an HTTP Request node toPOST /deadlines with a body built from the columns:
{
"title": "Invoice {{ $json.Supplier - {$json.Number} }}",
"due_at": "{{ $json.Due }}",
"amount": "{{ $json.Amount }}",
"transaction_type": "expense",
"client_request_id": "bills-sheet-{{ $json.ID }}"
}A stable client_request_id on the row ID makes the flow re-runnable without duplicates. Permanent two-way sync needs the external-ID upsert (after v1).
FAQ
Frequently asked questions
Do I need PRO to use the API?
No. The same rule as MCP applies: the API is available on every plan within the cloud quota (20 active deadlines on Free, 5,000 on PRO). PRO stays worthwhile for quota, teams and future features.
API or MCP, which one?
MCP when an AI assistant does the work (Claude, Codex, Cursor). API when a program does it: scripts, n8n, Make, back-office tools. Same token, same operations, same quota.
Can I read or change team deadlines?
No: v1 covers personal deadlines only. Shared team deadlines stay out until a Business customer uses them through the API.
Why cannot I complete a recurring deadline?
Completing one also creates the next occurrence under the app rules (series end, monthly days, custom dates). Moving that flow server-side without divergence is dedicated work: planned as API v1.1, only if API users ask for it. Paying one instalment already works.
How do I avoid duplicates when syncing a back-office tool?
Today with the Idempotency-Key header on retried requests. A permanent external-ID link (upsert) comes after v1, with the first real tool to sync.
Where do API-created deadlines show up?
In the app through normal sync: they land on the phone and schedule notifications like hand-made ones.
Same key, MCP protocol for Claude and Codex.
The MCP guide explains the assistant connection.