Documentation
API Reference
Sync

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

FieldLimit
notes.upsertedMax 500 items per request
jiraItems.upsertedMax 500 items per request
Note contentMax 30,000 characters

See also