Developer docs
Cadynce REST API
Build integrations with Zapier, Make, n8n, or your own scripts. Every resource
in Cadynce — goals, todos, issues, scorecard, meetings — is available under /api/v1 with scoped API keys and a consistent response shape.
Overview
- Base URL:
https://cadynce.app/api/v1 - Auth: Bearer token (an API key). See Authentication.
- Format: JSON on both request and response. Set
Content-Type: application/json for writes. - Versioning: All endpoints live under
/api/v1. Breaking changes will ship as /v2. - Timezone: All timestamps are ISO 8601 in UTC. Dates are
YYYY-MM-DD.
Quickstart
- Sign in and go to Settings → API Keys.
Create a key, pick your scopes, and copy it immediately — we
only show the raw key once.
- Make your first request:
curl https://cadynce.app/api/v1/todos \
-H "Authorization: Bearer cdn_live_..."
Create a todo:
curl -X POST https://cadynce.app/api/v1/todos \
-H "Authorization: Bearer cdn_live_..." \
-H "Content-Type: application/json" \
-d '{"title":"Ship Zapier app","priority":"high"}'
Authentication
Every request must include an Authorization: Bearer <key> header.
Keys start with the cdn_live_ prefix and are scoped to a single
organization — an API key issued by org A cannot read or write data in org B.
Keys can be revoked at any time from the Settings page. A revoked key stops
working immediately.
Scopes
Each key carries a set of scopes. Requests require the scope that matches
the action — if a key doesn't have the required scope, you get a 403.
| Scope | Grants |
|---|
* | All scopes (full access) |
todos:read / todos:write | Read / mutate todos |
goals:read / goals:write | Read / mutate goals |
issues:read / issues:write | Read / mutate issues |
scorecard:read / scorecard:write | Read / mutate scorecard metrics & entries |
meetings:read / meetings:write | Read / mutate meetings |
people:read | Read organization members (read-only) |
organization:read | Read the organization record |
Rate limits
Each API key is limited to 1,000 requests per hour, tracked
as a sliding window. Every response carries these headers:
X-RateLimit-Limit — always 1000 X-RateLimit-Remaining — requests left in the current window X-RateLimit-Reset — Unix timestamp (seconds) when the window resets
If you exceed the limit, you'll get 429 Too Many Requests with
a Retry-After header (seconds to wait).
Errors
Errors return a consistent shape with a machine-readable code and a human-readable message. Field-level validation errors
also include the offending field:
{
"code": "invalid_field",
"message": "priority must be one of: low, normal, high",
"field": "priority"
}
| Status | Common codes | Meaning |
|---|
| 400 | invalid_body, missing_field, invalid_field, no_updates | Malformed or invalid request |
| 401 | unauthorized | Missing or invalid API key |
| 403 | forbidden | Key is missing the required scope |
| 404 | not_found | Resource doesn't exist (or isn't in your org) |
| 429 | rate_limited | Too many requests — back off and retry |
| 500 | db_error | Server error — safe to retry |
Response envelopes
Single resource:
{ "data": { /* resource object */ } }
List:
{
"data": [ /* ... */ ],
"next_cursor": "eyJ...", // null on the last page
"has_more": true
}
Delete:
{ "deleted": true, "id": "..." }
The organization_id column is never returned — it
is implicit from your API key.
Need something we don't expose yet?
Email support@cadynce.app — we're
building the public API out based on integration needs, and we're happy to
prioritize what our customers ask for.