Your records, read on your terms.
This read-only REST API returns evaluation results and synced records for the account that owns the API key.
Authentication
Create and revoke keys at API settings. The full value is shown once. Keep it private and send it only in the Authorization header. Keys are hashed at rest, expire in 30, 90, or 365 days, and can be revoked in settings. A key with only progress:read cannot read record lists.
curl 'https://getaccrue.app/api/v1/progress?timeZone=America%2FLos_Angeles' \
-H 'Authorization: Bearer accrue_live_REPLACE_WITH_YOUR_KEY'
Never place a key in a URL, query parameter, or request body. Do not include keys in logs, source code, or shared prompts.
Available routes
GET /meReturn the authenticated UID and this key's scopes; no email or data freshness metadata is returned because this identity-only response does not read a record snapshot.
GET /progressEvaluate all ledgers and report sync freshness.
GET /ledgersList evaluated ledgers with bounded pagination.
GET /ledgers/{id}Read one ledger result.
GET /entriesRead entries with optional inclusive from and to dates.
GET /sitesRead the signed-in user's sites.
GET /supervisorsRead the signed-in user's supervisors.
GET /tasksRead the signed-in user's tasks.
Read progress and time remaining
For a “how much time is left?” question, read each ledger's headline.remainingMinutes or display-ready headline.remainingDisplay. Bucket-specific figures live under buckets[]. A null target or remaining value means the preset has no verified target figure. Ledgers are independent; the same logged activity may credit more than one, so do not add ledger totals together.
Shortened response excerpt
{
"data": {
"ledgers": [{
"id": "example-ledger",
"headline": {
"creditedMinutes": 120,
"targetMinutes": 300,
"remainingMinutes": 180,
"creditedDisplay": "2:00",
"targetDisplay": "5:00",
"remainingDisplay": "3:00"
},
"buckets": []
}],
"freshness": { "lastSyncedAt": "2026-09-25T18:01:00Z", "allDevicesSynced": null }
},
"meta": {
"apiVersion": "1",
"asOf": "2026-09-25T18:00:00Z",
"timeZone": "America/Los_Angeles",
"firstWeekday": 1,
"source": "synced_records"
}
}
Am I on track?
Use standing.title and standing.detail for the evaluator's current summary. When pace is present, compare pace.completion with deadline; deadlineName labels that window. A projected completion after the deadline signals a timing concern. If either value is null, the API cannot make that comparison. Pace is based on credited weekly history and is only a projection; it does not establish eligibility or predict board approval.
Scopes
Every key includes progress:read, which allows /me, /progress, and the ledger routes. Add records:read to also call /entries, /sites, /supervisors, and /tasks. A progress-only key receives 403 insufficient_scope on those records routes.
Evaluation dates and calendars
Pass asOf as an ISO 8601 UTC timestamp to reproduce an evaluation date. Future times are rejected. Pass an IANA timeZone such as America/Los_Angeles; UTC is the default, and callers should use the iPhone's current time zone. firstWeekday is 1 for Sunday through 7 for Saturday, defaulting to 1. Metadata echoes these settings.
Pagination and limits
Lists return up to 100 records by default and accept limit up to 200. Follow meta.nextCursor exactly; keep the same asOf, timeZone, and firstWeekday values returned in that page's metadata. Cursors are scoped to the same account, list, filters, evaluation calendar, and sync snapshot. Entry date filters are inclusive ISO civil dates. Unknown query parameters are rejected. The API evaluates full history and refuses more than 20,000 rows or 16 MiB of decoded row bodies rather than returning partial figures.
Response freshness and boundaries
Each data response has meta.asOf, meta.timeZone, meta.firstWeekday, and meta.lastSyncedAt. The sync time is the latest remote Firestore document write time. It cannot prove that every device has synced. Independent ledger totals can credit the same activity and must not be added together.
Responses are not cached. Error bodies contain a stable error code and request ID but no row contents, credential values, or account profile. Rate limit is 60 API requests per key per minute, with an additional coarse cap of 600 requests per service instance per minute.
Errors and retries
For 400, correct the query or request before retrying. For 401, confirm the key is current or refresh the Firebase sign-in in settings. For 403 insufficient_scope, create a key with the needed scope. On 429, wait at least a minute before retrying; key issuance may remain limited for up to an hour. A 413 means the complete synced dataset is over the evaluation bound and will not succeed by retrying. For a temporary 503, wait and retry with backoff; repeated failures may require syncing the app or service recovery.
Connection integrations
These docs describe ordinary read-only REST access using an Accrue API key. A Muse connector OAuth/account-linking integration is not part of this API. See Meta's connector product page for the separate integration context.