Beta
Build on Nyblit
The Nyblit API lets you read and manage your Tasks from scripts, automations and your own apps. It is a JSON REST API authenticated with personal access tokens.
- Base URL
https://api.nyblit.app/v1 - Needs a plan that includes API Access, on a standard (not end-to-end encrypted) account
- Reference every endpoint and field
Quickstart
- In Nyblit, open Settings → API Access and create a token. Pick only the scopes you need. Copy it — it is shown once. Get a token
- Check it works:
curl https://api.nyblit.app/v1/me \
-H "Authorization: Bearer nyb_pat_…"- List what is on your Today tab (Disposition key
in_progress):
curl "https://api.nyblit.app/v1/tasks?disposition=in_progress&limit=20" \
-H "Authorization: Bearer nyb_pat_…"- Add a task to Today (needs the
tasks:writescope):
curl https://api.nyblit.app/v1/tasks \
-H "Authorization: Bearer nyb_pat_…" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 7c1e9a52-3f0b-4d1e-9b8a-2f6d5c4e3a10" \
-d '{"title": "Call the bank", "disposition": "in_progress"}'Tab labels are customisable, so the API always uses the fixed Disposition keys: not_started, in_progress, waiting, on_hold, done.
Authentication and scopes
Send your token in the Authorization header on every request. Tokens in the URL are rejected, because URLs end up in logs. Treat a token like a password: anyone holding it can act as you within its scopes.
- Tokens always expire. You choose how long when you create one.
- Revoke a token at any time in Settings → API Access; it stops working immediately.
- Tokens start with
nyb_pat_, so secret scanners can spot leaked ones. - A token can do what you can do in Nyblit, to your own data. It can't change account security settings or create other tokens.
GET /meworks with any token and needs no scope. Use it to check a token.
| Scope | Allows |
|---|---|
tasks:read | Read your tasks. |
tasks:write | Create, update and delete your tasks. |
projects:read | Read your projects. |
projects:write | Create, update and delete your projects. |
workflows:read | Read your Workflows and Statuses. |
workflows:write | Create, update and delete your Workflows and Statuses. |
webhooks:manage | Manage webhook subscriptions. |
During the beta you can read your tasks (with their steps), projects, workflows, statuses and dispositions, and create, change, complete, archive and delete tasks. Writes for steps, projects and workflows, and webhooks, follow.
Changing tasks
Changes made through the API follow the same rules as the app and sync to every device the account uses.
- Setting a
status_idalso sets the task's Workflow and Disposition. Changingworkflow_idmoves the task to that Workflow's first Status for its Disposition. Changingdispositionon its own clears the Status. on_hold_untilonly applies in Later (on_hold): at that time the task wakes back onto Today.POST /tasks/{id}/lateris a shortcut.PATCHchanges only the fields you send; sendnullto clear one.
Avoiding lost updates
Every task has a version, also sent as the ETag header. Send it back in If-Match on PATCH, DELETE or an action. If the task changed in the meantime (for example in the app), you get 412 precondition_failed with the current task — re-apply your change to it and retry.
curl -X PATCH https://api.nyblit.app/v1/tasks/{id} \
-H "Authorization: Bearer nyb_pat_…" \
-H "Content-Type: application/json" \
-H 'If-Match: "10381"' \
-d '{"due_date": "2026-10-02"}'Safe retries
Send an Idempotency-Key (any unique string, such as a UUID) when creating a task. If the request times out, retry with the same key: you get the task the first attempt created (200 with Idempotent-Replayed: true) instead of a duplicate. Use a new key for each new task.
Pagination
Lists return up to limit items (default 50, maximum 100) plus has_more and next_cursor. Pass next_cursor back as cursor to get the next page. Cursors are opaque — do not build them yourself.
{
"object": "list",
"data": [ { "object": "task", "id": "…", "title": "Call the bank", … } ],
"has_more": true,
"next_cursor": "WyIyMDI2LTA5LTI5…"
}Unknown query parameters are rejected with 400, so a typo never silently returns everything.
Errors
Errors use RFC 9457 problem details (application/problem+json). Branch on code; show title to people; quote request_id when you contact us.
{
"type": "https://developers.nyblit.app/errors/insufficient_scope",
"title": "Token is missing a required scope",
"status": 403,
"code": "insufficient_scope",
"detail": "This endpoint needs the `tasks:read` scope.",
"request_id": "5f0c…"
}| Code | Status | Meaning |
|---|---|---|
invalid_request | 400 | A parameter is missing, malformed or unknown. See errors[]. |
invalid_token | 401 | The token is missing, wrong, expired or revoked. |
insufficient_scope | 403 | The token works but lacks the scope this endpoint needs. |
plan_required | 403 | The account’s plan does not include API Access. |
access_disabled | 403 | Nyblit has turned off API access for this account. Contact support. |
vault_account_unsupported | 403 | The account uses end-to-end encryption. |
task_limit_reached | 403 | The account’s plan allows no more active tasks. Complete or archive some first. |
not_found | 404 | No such endpoint or resource (or it belongs to someone else). |
precondition_failed | 412 | If-Match did not match: the resource changed since you read it. The body holds the current version. |
rate_limited | 429 | Too many requests. Wait Retry-After seconds. |
internal_error | 500 | Our fault. Retry with backoff and quote request_id if it persists. |
api_disabled | 503 | The API is temporarily switched off. Retry later. |
Rate limits
Limits apply per token, per account and (for writes) per day. Every response carries RateLimit-Limit, RateLimit-Remaining and RateLimit-Reset (seconds). When you hit a limit you get 429 with Retry-After — wait that long, then retry. Limits can change, so read the headers rather than hard-coding numbers.
End-to-end encrypted accounts
If an account has end-to-end encryption turned on, task titles and notes are sealed with a key only the owner holds. Nyblit cannot read them, so the API cannot either: requests for those accounts return 403 vault_account_unsupported. We never ask for your recovery key.
Versioning
The major version is in the URL (/v1). We add fields and endpoints without notice, so ignore fields you do not recognise. Breaking changes ship as a new version, announced in advance with Deprecation and Sunset headers.
