BluetickedDeveloper docs

Tables

7 endpoints, each with examples that open in the console prefilled.

All resources
GET/api/v1/tablestables:readTry in console

List tables

Your workspace's tables (prescriptions, orders, bookings…) with their columns and statuses.

  • Tables are made in the dashboard; the API reads them and reads and writes their rows. Filter with ?preset= (for example leads).
  • Each column has a key (what row data is keyed by), a label and a type: text, number, money (cents), date (YYYY-MM-DD), time (HH:MM), choice (with options), yes_no, phone (E.164) or file (a URL). Statuses are in their table's order.
  • A key restricted to some businesses lists only their tables.
  • kind is records (each row belongs to a contact and moves through the statuses) or reference (a price list, a branch list: rows belong to no one, have no status and no statuses).
curl -X GET "https://app.blueticked.com/api/v1/tables" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "id": "3c5e7a9b-2d4f-4a6c-8e0b-1d3f5a7c9e24",
      "name": "Prescriptions",
      "kind": "records",
      "preset": "blank",
      "business_id": "22222222-2222-4222-9222-222222222222",
      "columns": [
        {
          "key": "medicine",
          "label": "Medicine",
          "type": "text"
        },
        {
          "key": "quantity",
          "label": "Quantity",
          "type": "number"
        },
        {
          "key": "collect_on",
          "label": "Collect on",
          "type": "date"
        }
      ],
      "statuses": [
        {
          "key": "received",
          "label": "Received"
        },
        {
          "key": "ready",
          "label": "Ready to collect"
        },
        {
          "key": "collected",
          "label": "Collected"
        }
      ],
      "row_count": 128,
      "created_at": "2026-10-01T08:00:00.000Z",
      "updated_at": "2026-10-01T10:00:00.000Z"
    }
  ],
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/tables/{id}tables:readTry in console

Get a table

One table, its columns and statuses.

  • The table is wrapped under table. Another workspace's table is not_found; a business your key cannot reach is forbidden.
curl -X GET "https://app.blueticked.com/api/v1/tables/{id}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "table": {
    "id": "3c5e7a9b-2d4f-4a6c-8e0b-1d3f5a7c9e24",
    "name": "Prescriptions",
    "kind": "records",
    "preset": "blank",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "columns": [
      {
        "key": "medicine",
        "label": "Medicine",
        "type": "text"
      },
      {
        "key": "quantity",
        "label": "Quantity",
        "type": "number"
      },
      {
        "key": "collect_on",
        "label": "Collect on",
        "type": "date"
      }
    ],
    "statuses": [
      {
        "key": "received",
        "label": "Received"
      },
      {
        "key": "ready",
        "label": "Ready to collect"
      },
      {
        "key": "collected",
        "label": "Collected"
      }
    ],
    "row_count": 128,
    "created_at": "2026-10-01T08:00:00.000Z",
    "updated_at": "2026-10-01T10:00:00.000Z"
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/tables/{id}/rowstables:readTry in console

List rows

Sync a table's rows into your own system.

Query parameters
statusstring
contact_idstring
  • Newest first. Page with ?limit= (max 200, default 50) and ?cursor= (the previous page's next_cursor, an opaque token; rows written in the same instant are never skipped). Filter with ?status= (a status key) and ?contact_id=.
  • data holds the values by column key, in stored form; answers holds what a form sent that no column takes. source says how the row arrived: api, manual, inbox, import, flow, or a Leads source.
  • lead_id names the lead a Leads row came from, for rows from before leads became rows (provenance; null on every row made since). It never changes, and such a row changes like any other.
  • To hear about new rows and status moves instead of polling, subscribe to the table_row.created and table_row.status_changed webhooks.
curl -X GET "https://app.blueticked.com/api/v1/tables/{id}/rows?status=ready" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "data": [
    {
      "id": "8e2f4a6c-1b3d-4e5f-9a7b-2c4d6e8f0a12",
      "table_id": "3c5e7a9b-2d4f-4a6c-8e0b-1d3f5a7c9e24",
      "business_id": "22222222-2222-4222-9222-222222222222",
      "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
      "conversation_id": null,
      "lead_id": null,
      "status": "received",
      "data": {
        "medicine": "Amoxicillin 500mg",
        "quantity": 21,
        "collect_on": "2026-10-02"
      },
      "answers": {
        "allergies": "None"
      },
      "source": "api",
      "notes": null,
      "created_at": "2026-10-01T10:00:00.000Z",
      "updated_at": "2026-10-01T10:00:00.000Z"
    }
  ],
  "next_cursor": null,
  "has_more": false,
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
POST/api/v1/tables/{id}/rowstables:writeTry in console

Add a row

Add a row for one of your contacts (a prescription, an order, a booking), or to a reference table.

Body parameters
contact_idstring
statusstring
dataobject
notesstring
  • A records table's row belongs to a contact of your workspace, so contact_id is required; a row never creates one (not_found otherwise; create the contact first with POST /api/v1/contacts).
  • A reference table's row belongs to no one: send data (and notes) only. A contact_id or a status is refused with validation_failed.
  • status defaults to the table's first status. data is checked against the columns: a value that does not fit, or a key that is not a column, is refused with validation_failed and details.fields naming each one.
  • A table holds at most 50,000 rows; past that the call is refused with conflict.
  • Send an Idempotency-Key header to make a retry safe. The new row fires table_row.created and the flows listening for it.
curl -X POST "https://app.blueticked.com/api/v1/tables/{id}/rows" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: change-me-per-request-0001" \
  -d '{
  "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
  "status": "received",
  "data": {
    "medicine": "Amoxicillin 500mg",
    "quantity": 21,
    "collect_on": "2026-10-02"
  },
  "notes": "Repeat script"
}'
Response
{
  "row": {
    "id": "8e2f4a6c-1b3d-4e5f-9a7b-2c4d6e8f0a12",
    "table_id": "3c5e7a9b-2d4f-4a6c-8e0b-1d3f5a7c9e24",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
    "conversation_id": null,
    "lead_id": null,
    "status": "received",
    "data": {
      "medicine": "Amoxicillin 500mg",
      "quantity": 21,
      "collect_on": "2026-10-02"
    },
    "answers": {
      "allergies": "None"
    },
    "source": "api",
    "notes": null,
    "created_at": "2026-10-01T10:00:00.000Z",
    "updated_at": "2026-10-01T10:00:00.000Z"
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
GET/api/v1/tables/{id}/rows/{rowId}tables:readTry in console

Get a row

One row and its status timeline.

  • events is the row's status timeline, oldest first; the first event has from_status: null.
curl -X GET "https://app.blueticked.com/api/v1/tables/{id}/rows/{rowId}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "row": {
    "id": "8e2f4a6c-1b3d-4e5f-9a7b-2c4d6e8f0a12",
    "table_id": "3c5e7a9b-2d4f-4a6c-8e0b-1d3f5a7c9e24",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
    "conversation_id": null,
    "lead_id": null,
    "status": "received",
    "data": {
      "medicine": "Amoxicillin 500mg",
      "quantity": 21,
      "collect_on": "2026-10-02"
    },
    "answers": {
      "allergies": "None"
    },
    "source": "api",
    "notes": null,
    "created_at": "2026-10-01T10:00:00.000Z",
    "updated_at": "2026-10-01T10:00:00.000Z"
  },
  "events": [
    {
      "id": "38f69af8-cc01-4955-b304-875d98d301e8",
      "from_status": null,
      "to_status": "received",
      "created_at": "2026-10-01T10:00:00.000Z"
    }
  ],
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
PATCH/api/v1/tables/{id}/rows/{rowId}tables:writeTry in console

Update a row

Move a row on (Ready to collect, Delivered…) or correct it.

Body parameters
statusstring
  • Send any of status (one of the table's status keys), data (the full set of values, replacing the old, checked against the columns) and notes (up to 2,000 characters, or null to clear).
  • A status change fires table_row.status_changed and the flows listening for it, so a "ready to collect" message can go out the moment your system marks the row ready.
curl -X PATCH "https://app.blueticked.com/api/v1/tables/{id}/rows/{rowId}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "status": "ready"
}'
Response
{
  "row": {
    "id": "8e2f4a6c-1b3d-4e5f-9a7b-2c4d6e8f0a12",
    "table_id": "3c5e7a9b-2d4f-4a6c-8e0b-1d3f5a7c9e24",
    "business_id": "22222222-2222-4222-9222-222222222222",
    "contact_id": "ff506e53-e2f0-4d92-884a-dab77d628bad",
    "conversation_id": null,
    "lead_id": null,
    "status": "ready",
    "data": {
      "medicine": "Amoxicillin 500mg",
      "quantity": 21,
      "collect_on": "2026-10-02"
    },
    "answers": {
      "allergies": "None"
    },
    "source": "api",
    "notes": null,
    "created_at": "2026-10-01T10:00:00.000Z",
    "updated_at": "2026-10-01T10:00:00.000Z"
  },
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}
DELETE/api/v1/tables/{id}/rows/{rowId}tables:writeTry in console

Delete a row

Remove a reference table's row: a price or a branch that no longer holds.

  • Only a reference table's rows are deleted. A records row follows a contact through its statuses and is refused with conflict; move it to a closing status instead.
curl -X DELETE "https://app.blueticked.com/api/v1/tables/{id}/rows/{rowId}" \
  -H "Authorization: Bearer $BLUETICKED_API_KEY"
Response
{
  "deleted": true,
  "id": "8e2f4a6c-1b3d-4e5f-9a7b-2c4d6e8f0a12",
  "request_id": "req_b2e3d610e10f1b07468721ee98f0e1d2"
}