How it works
Three decisions, and the rest follows
Keys belong to the agency
Not to whoever made them. An integration does not stop working because somebody left — but each key does name a user, acts as them, and stops the moment that account is deactivated.
Scopes are resource plus verb
clients:read, invoices:write. The level follows the HTTP method, so an endpoint cannot be read-only in the documentation and writable in practice. A key short of a scope gets a 403 naming the one it needs.
Nothing is on by default
The API is off until an admin turns it on, and switching it off stops every key at once. Revoking one key never disturbs the others.
The surface
What you can read and write
Full CRUD on each of these, paginated, filtered, and scoped to your account and nobody else's. There is no cross-account identifier to pass and no way to widen a key from outside.
Clients & contacts
clients:read · clients:write
Projects & milestones
projects:read · projects:write
Tasks
tasks:read · tasks:write
Time entries
time:read · time:write
Invoices & quotes
invoices:read · invoices:write
Expenses
expenses:read · expenses:write
Support tickets
tickets:read · tickets:write
Sites
sites:read · sites:write
Reports
reports:read
Quick start
Working in about a minute
- 1 Turn the API on in Settings → API.
- 2 Create a key with only the scopes that integration needs. It is shown once.
- 3 Call
/meto confirm what it can do, then get on with it.
# Every client we look after, 25 at a time
curl https://app.marquecrm.com/api/public/v1/clients \
-H "Authorization: Bearer mq_live_..."
# Log an hour against a project
curl -X POST https://app.marquecrm.com/api/public/v1/time-entries \
-H "Authorization: Bearer mq_live_..." \
-H "Content-Type: application/json" \
-d '{"client_id":12,"project_id":44,"duration_minutes":60,"billable":true}' The details
What you can rely on
Rate limits that tell you where you are
Per key, per minute, at your plan's ceiling — 600 a minute on Agency. Every response carries the limit and what is left; going over gets a 429 with Retry-After. One runaway integration cannot take your others down.
Errors that say what to do
Always JSON with a message worth reading. 401 the key is wrong or revoked, 402 the plan does not include the API, 403 it is switched off or the key lacks a scope, 422 validation with errors per field.
Your account, and only yours
Every query is scoped to the agency the key belongs to, at the database layer. There is no account identifier to pass and nothing to get wrong.
Versioned in the path
Fields get added to responses. Existing fields do not change meaning or disappear inside a version.
The full endpoint list, read straight off the running application, is in the API reference.
Build against it before you buy it
The API is unlocked for the whole 90-day trial, on the same keys and the same limits.
Start free trial