Connections API

Build EasyBoard connections in minutes

These docs cover the EasyBoard API for updating and reading an existing dashboard. Bring your dashboard ID and write token, copy a recipe, and you can start pushing live updates in minutes.

What you need

Three things before you start

Every API call uses a dashboard ID. Write operations also need a write token. Tiles are targeted by their ID (or alternateId on Pro).

Dashboard ID

The ID is the last part of your dashboard URL. In /d/abc123xyz456, the dashboard ID is abc123xyz456.

Write token

Use the write token only for POST, PATCH, DELETE, and reorder requests. Treat it like a password. It is not recoverable if lost.

Tile ID / Alternate ID

Fetch the current tile list first to find tile IDs. Pro dashboards can also assign a unique alternateId per tile for friendlier API targeting. Use tile IDs by default, or alternateId with `lookup=alternateId` for single-tile GET and DELETE requests.

Authentication

How write tokens work

Read endpoints are public. Anyone with the dashboard ID can fetch tiles or open an SSE stream. No token needed.

Write endpoints require a Bearer token. Send your dashboard write token in the Authorization header:

Authorization: Bearer YOUR_WRITE_TOKEN

Without this header (or with a wrong token), write endpoints return 401 Unauthorized.

Write endpoints (token required)

PATCH/api/d/{id}Rename dashboard
POST/api/d/{id}/tilesCreate a tile
PATCH/api/d/{id}/tilesUpdate tiles (batch)
DELETE/api/d/{id}/tiles/{ref}Delete a tile
POST/api/d/{id}/tiles/reorderReorder tiles

Public endpoints (no token)

GET/api/d/{id}/tilesList all tiles
GET/api/d/{id}/tiles/{ref}Get a single tile
GET/api/d/{id}/streamSSE live stream

Plans and limits

Free vs Pro and what each plan allows

LimitFreePro
Dashboards per user1Unlimited
Tiles per dashboard5Unlimited
API write calls per hour601,000
Alternate tile IDs (alternateId)Not availableAvailable

When you exceed a rate limit, the API returns 429 with X-RateLimit-Limit and X-RateLimit-Remaining headers so you can throttle gracefully.

Field limits

Title200 characters
Value10,000 characters
Unit32 characters
Dashboard name100 characters
Batch PATCH100 update instructions
alternateId100 characters, alphanumeric plus . _ -

Error responses

400Malformed JSON, missing fields, or field length violation
401Missing or invalid write token
403Pro-only feature on a Free dashboard, or tile/dashboard limit reached
404Dashboard or tile not found
409alternateId already in use on this dashboard
429Rate limit exceeded (check X-RateLimit-Remaining header)

Quick start

Your first API call in 60 seconds

Platform note: The curl examples below work on macOS, Linux, and WSL. On Windows PowerShell, select the PowerShell tab for native commands. The C tab uses libcurl, and Arduino (ESP32) shows a complete sketch for IoT devices.

1

Read your tiles

No write token needed. Look for the id of the tile you want to update.

curl https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles
2

Update a single tile

Send one update instruction with your write token. Replace YOUR_TILE_ID with the ID from step 1.

curl -X PATCH https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"target":{"id":"YOUR_TILE_ID"},"patch":{"value":"1500"}}]}'
3

Go further

The same endpoint supports updating multiple tiles in one request — just add more entries to the updates array. See the Common recipes below for creating tiles, incrementing counters, and subscribing to live updates via SSE.

Tile types

Know what each tile expects

The API stores tile values as strings, but each tile type interprets that string differently. If you are creating or updating tiles from code, these are the formats to expect.

TypeWhat `value` should containExampleWhat users see
MetricNumber as a string"1250"A large value with an optional unit like $, %, kg, or ms.
CounterInteger as a string"12"A count that usually changes through `delta` updates such as +1 or -1.
Progress0-100 style number as a string"75"A progress bar percentage. The UI clamps the visual bar, but the API stores the string you send.
TextPlain text"Kitchen closes at 4pm"A free-form message, note, or status update.
ClockIANA timezone string"America/New_York"Displays the current time for a timezone. Use an empty string for the viewer's local timezone.
CountdownISO 8601 target datetime"2027-01-01T00:00:00.000Z"Counts down to a target moment.
ElapsedISO 8601 start datetime"2026-01-01T00:00:00.000Z"Counts up from a starting moment.
ToggleOne of the configured options"Open"Cycles through 2–3 preset options on click. PATCH with `{"next": true}` to advance to the next option, wrapping around. The `options` field stores the cycle list.

Supported sizes

Use small, medium, or large. In the current UI that means roughly 1 column, 2 columns, or full width.

About unknown `size` values

The API does not currently reject other strings, but EasyBoard only understands those three sizes. Other values may save successfully but display oddly, so integrations should stick to small, medium, and large.

Common recipes

Copy-paste examples for the most common jobs

Create a metric tile

Add a new metric tile at the end of the dashboard.

curl -X POST https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"metric","title":"Revenue","value":"1250","unit":"$","size":"medium"}'

Increment a counter with delta

Send `delta` for counter-style updates. `delta` currently wins over `value` if both are present.

curl -X PATCH https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"target":{"id":"YOUR_TILE_ID"},"patch":{"delta":1}}]}'

Set a text tile

Text tiles use the same batch PATCH endpoint with a string value.

curl -X PATCH https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"target":{"id":"YOUR_TILE_ID"},"patch":{"value":"Kitchen closes at 4pm"}}]}'

Set a progress tile

Progress values are stored exactly as sent; the UI clamps the visual bar client-side.

curl -X PATCH https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"target":{"id":"YOUR_TILE_ID"},"patch":{"value":"75"}}]}'

Read all tiles

Fetch a one-shot snapshot of the dashboard without opening a streaming connection.

curl https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles

Subscribe with SSE

Use a streaming connection when you want live dashboard snapshots without polling.

curl -N https://easyboard.live/api/d/YOUR_DASHBOARD_ID/stream

Typical use cases

Where this API shines

Apple Shortcuts, Zapier, and Make

Update one or more tiles from a webhook or automation step with a single batch PATCH request and a write token header.

CI/CD deploy boards

Set status text, deployment progress, and release countdowns directly from your pipeline.

Sales and operations dashboards

Push revenue, order counts, and progress targets from scripts, spreadsheets, or backend jobs.

Shared status screens

Use public read access plus SSE to mirror a live board on TVs, kiosks, or lightweight helper apps.

IoT and Arduino devices

Push sensor readings, temperatures, and device statuses from ESP32 or similar microcontrollers using the built-in HTTPClient library.

Behavioral notes

How the API behaves in edge cases

  • Batch PATCH requests are atomic. If any instruction fails, none of the tile updates are saved.
  • If you send both `delta` and `value` in the same tile patch, `delta` wins and `value` is ignored.
  • If you send `next: true` and `value` in the same tile patch, `next` wins and `value` is ignored.
  • `delta` is mainly for counters, but the API currently applies it to any tile whose value can be treated like a number.
  • Progress values are stored exactly as sent. The visual bar is clamped client-side, not by the API.
  • `alternateId` is Pro-only when you create, assign, rename, or clear it. It must be unique within a dashboard.
  • SSE sends full dashboard snapshots and may emit a `deleted` event before closing if the dashboard is removed elsewhere.

API reference

Endpoint guide and examples

Browse each endpoint, see what to send, and copy working examples. If you need the machine-readable API file, you can download it from /api/openapi/public.

patch/api/d/{dashboardId}Needs write token

Update dashboard settings

Updates dashboard-level settings. Currently supports renaming the dashboard. The name appears in the header and browser tab for all viewers, and is broadcast to connected SSE clients in real time.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.

What To Send

FieldTypeRequiredNotes
namestringNoDisplay name for the dashboard. Emojis are welcome. Send an empty string to clear. Max 100 chars.

Examples

curl -X PATCH https://easyboard.live/api/d/YOUR_DASHBOARD_ID \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name":"Coffee Shop Sales"}'

What You Get Back

200Updated dashboard settings.
application/json
{
  "name": "Coffee Shop Sales"
}
400Invalid body or name too long.
application/json
{
  "error": "name must be 100 characters or fewer"
}
401Missing or incorrect write token.
application/json
{
  "error": "Unauthorized"
}
404Dashboard not found.
application/json
{
  "error": "Dashboard not found"
}
get/api/d/{dashboardId}/tilesNo write token needed

List tiles

Returns the current tiles for a dashboard, sorted by order. You can call this without a write token.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.

Examples

curl https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles

What You Get Back

200Sorted tile array.
application/json
[
  {
    "id": "tile-abc123",
    "alternateId": "RevenueTile",
    "type": "metric",
    "title": "Revenue",
    "value": "1250",
    "unit": "$",
    "size": "medium",
    "order": 0
  },
  {
    "id": "tile-def456",
    "type": "counter",
    "title": "Orders",
    "value": "12",
    "unit": "",
    "size": "small",
    "order": 1
  }
]
404Dashboard not found.
application/json
{
  "error": "Dashboard not found"
}
post/api/d/{dashboardId}/tilesNeeds write token

Create a tile

Creates a new tile at the end of the dashboard. Send your dashboard write token in the Authorization header.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.

What To Send

FieldTypeRequiredNotes
typestringNoUse one of the built-in tile types: metric, text, counter, progress, clock, countdown, elapsed, or toggle. Other values may save successfully but may not display correctly in EasyBoard.
titlestringNoTile label shown above the value. Max 200 chars.
valuestringNoTile value, always stored as a string. Max 10000 chars.
unitstringNoOptional prefix or suffix for metric tiles. Max 32 chars.
sizestringNoUse small, medium, or large. Other values may save successfully but may display oddly, so integrations should stick to those three.
optionsarrayNoToggle tiles only. The ordered list of values to cycle through (2–3 entries). The first entry becomes the initial value.
alternateIdstringNoOptional Pro-only identifier you control. Must be unique within the dashboard and can later be used with `lookup=alternateId` or as a batch update target.

Examples

curl -X POST https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"type":"metric","title":"Revenue","value":"1250","unit":"$","size":"medium"}'

What You Get Back

201Created tile.
application/json
{
  "id": "tile-abc123",
  "alternateId": "RevenueTile",
  "type": "metric",
  "title": "Revenue",
  "value": "1250",
  "unit": "$",
  "size": "medium",
  "order": 0
}
400Invalid JSON body or field length violation.
application/json
{
  "error": "title must be 200 characters or fewer"
}
401Missing or incorrect write token.
application/json
{
  "error": "Unauthorized"
}
404Dashboard not found.
application/json
{
  "error": "Dashboard not found"
}
patch/api/d/{dashboardId}/tilesNeeds write token

Update one or more tiles

Applies one or more tile updates atomically. Each instruction targets exactly one tile by `id` or `alternateId`. Current server behavior is important here: if you send both `delta` and `value`, `delta` wins and `value` is ignored. `alternateId` is Pro-only when you set, rename, or clear it.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.

What To Send

FieldTypeRequiredNotes
updatesarrayYesOne or more tile updates applied atomically. If any instruction fails, no tile changes are saved.

Examples

curl -X PATCH https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"updates":[{"target":{"id":"YOUR_TILE_ID"},"patch":{"value":"1500"}}]}'

What You Get Back

200Updated tiles in request order.
application/json
{
  "updated": [
    {
      "id": "tile-abc123",
      "alternateId": "RevenueTile",
      "type": "metric",
      "title": "Revenue",
      "value": "1500",
      "unit": "$",
      "size": "medium",
      "order": 0
    }
  ]
}
400Invalid JSON body, malformed target, or field length violation.
application/json
{
  "error": "Body must be an object with an updates array"
}
401Missing or incorrect write token.
application/json
{
  "error": "Unauthorized"
}
403A Pro-only alternateId write was attempted on a FREE dashboard.
application/json
{
  "error": "alternateId is a Pro feature. Upgrade to Pro to set a custom tile identifier."
}
404Dashboard or tile not found.
application/json
{
  "error": "Tile not found"
}
409The requested alternateId already exists on this dashboard.
application/json
{
  "error": "alternateId is already used on this dashboard"
}
get/api/d/{dashboardId}/tiles/{tileRef}No write token needed

Get a single tile

Fetch one tile by its generated tile ID or, when `lookup=alternateId`, by its alternateId.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.
tileRefpathYesA tile ID, or an alternateId when used with `lookup=alternateId`.
lookupqueryNoHow to interpret the `tileRef` path segment. Defaults to `id`. Use `alternateId` to fetch or delete by alternateId.

What You Get Back

200Tile found.
application/json
{
  "id": "tile-abc123",
  "alternateId": "RevenueTile",
  "type": "metric",
  "title": "Revenue",
  "value": "1250",
  "unit": "$",
  "size": "medium",
  "order": 0
}
400Invalid lookup mode.
application/json
{
  "error": "lookup must be either \"id\" or \"alternateId\""
}
404Dashboard or tile not found.
application/json
{
  "error": "Tile not found"
}
delete/api/d/{dashboardId}/tiles/{tileRef}Needs write token

Delete a tile

Permanently removes a tile and re-indexes the remaining `order` fields. By default `tileRef` is treated as a tile ID; use `lookup=alternateId` to delete by alternateId.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.
tileRefpathYesA tile ID, or an alternateId when used with `lookup=alternateId`.
lookupqueryNoHow to interpret the `tileRef` path segment. Defaults to `id`. Use `alternateId` to fetch or delete by alternateId.

Examples

curl -X DELETE https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles/YOUR_TILE_ID \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN"

What You Get Back

204Tile deleted successfully.
400Invalid lookup mode.
application/json
{
  "error": "lookup must be either \"id\" or \"alternateId\""
}
401Missing or incorrect write token.
application/json
{
  "error": "Unauthorized"
}
404Dashboard or tile not found.
application/json
{
  "error": "Tile not found"
}
post/api/d/{dashboardId}/tiles/reorderNeeds write token

Reorder tiles

Updates all tile order values at once. Used by drag-and-drop and bulk reordering.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.

What To Send

FieldTypeRequiredNotes
idsarrayYesOrdered list of tile IDs. The first element becomes order 0.

Examples

curl -X POST https://easyboard.live/api/d/YOUR_DASHBOARD_ID/tiles/reorder \
  -H "Authorization: Bearer YOUR_WRITE_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"ids":["tile-def456","tile-abc123"]}'

What You Get Back

204Tiles reordered successfully.
400Invalid JSON body or ids must be an array.
application/json
{
  "error": "ids must be an array"
}
401Missing or incorrect write token.
application/json
{
  "error": "Unauthorized"
}
404Dashboard not found.
application/json
{
  "error": "Dashboard not found"
}
get/api/d/{dashboardId}/streamNo write token needed

Stream live dashboard snapshots

Opens a Server-Sent Events stream for one dashboard. The first event is the current dashboard snapshot, later events are updated snapshots. If the dashboard is removed elsewhere, the stream may emit a `deleted` event before closing.

URL Parts

NameInRequiredDescription
dashboardIdpathYesThe 12-character dashboard ID from your dashboard URL.

Examples

curl -N https://easyboard.live/api/d/YOUR_DASHBOARD_ID/stream

What You Get Back

200Server-Sent Events stream.
text/event-stream
data: {"name":"Coffee Shop Sales","tiles":[{"id":"tile-abc123","type":"metric","title":"Revenue","value":"1250","unit":"$","size":"medium","order":0}]}

: keepalive

event: deleted
data: {}

404Dashboard not found.
application/json
{
  "error": "Dashboard not found"
}