Sync API
Pull changes
GET /api/boards/{boardId}/sync?since={version}
Returns all board/note/Jira item changes since the given version number. Use since=0 for a full sync.
Response (200) — changes present:
{
"board": { "id": "abc123", "name": "My Board", "version": 45, "updatedAt": "..." },
"notes": [
{ "id": "note1", "title": "Epic", "content": "...", "x": 100, "y": 200, "color": "orange", "version": 42, "updatedAt": "...", "deletedAt": null }
],
"deletedNoteIds": ["old-note-id"],
"jiraItems": [ ... ],
"deletedJiraItemIds": [],
"serverVersion": 45
}Response (200) — no changes (idle short-circuit):
{ "serverVersion": 45 }When serverVersion equals the client's since value, the server returns immediately without running full queries.
Push changes
POST /api/boards/{boardId}/sync
Pushes local mutations to the server. Executes as a single D1 batch transaction.
Request:
{
"clientVersion": 42,
"board": {
"name": "Updated Board Name",
"updatedAt": "2026-06-01T12:00:00Z"
},
"notes": {
"upserted": [
{
"id": "note1",
"title": "Epic",
"content": "...",
"x": 100,
"y": 200,
"color": "orange",
"type": "Epic",
"updatedAt": "2026-06-01T12:00:00Z"
}
],
"deleted": ["old-note-id"]
},
"jiraItems": {
"upserted": [
{
"id": "item1",
"key": "EPIC-001",
"type": "epic",
"summary": "...",
"updatedAt": "2026-06-01T12:00:00Z"
}
],
"deleted": []
}
}Response (200):
{ "serverVersion": 46 }Response (400): Payload schema validation failed.
Payload constraints
| Field | Limit |
|---|---|
notes.upserted | Max 500 items per request |
jiraItems.upserted | Max 500 items per request |
| Note content | Max 30,000 characters |
See also
- Sync Engine — How the client uses this API
- API Overview — Error codes and auth requirements