Data Sources let you pull live content from any external JSON API and show it on your screens. You connect an API once in your account settings, and then reuse it across as many templates as you like.
EasySignage fetches and caches the data centrally on a fixed schedule, so:
- Your screens (players) never call your API directly — they only display the cached result.
- Your API isn’t hit once per screen; it’s fetched once and shared.
- Credentials (tokens, API keys) are stored encrypted and are never exposed to a browser or a player.
This works the same way as the existing Google Sheets integration — connect a source, then drop its data into a template as a table.
Note: Data Sources is a BETA feature. Today it supports displaying a repeating list of records as a dynamic table.
How it works
- You add a JSON API as a data source (URL + optional authentication).
- EasySignage fetches the API, caches the response, and refreshes it on the interval you choose.
- In the template editor you pick the data source, choose which list to repeat and which columns to show, and add a dynamic table to your design.
- When the cached data changes, the table on your screens updates automatically — no need to edit or re-publish the template.
Part 1 — Configure a data source
Open the Data Sources page
- Click the profile icon in the top-right corner.
- Select Settings.
- Choose Data Sources.
- Click Add Data Source.

Fill in the connection details
| Field | What to enter |
|---|---|
| Type | Choose JSON API. |
| Name | A label you’ll recognise later (e.g. Cafeteria Menu API). Required. |
| Description | Optional note about what this source is for. |
| URL | The full HTTPS address that returns JSON (e.g. https://example.com/menu.json). |
| Authentication | How EasySignage should authenticate to your API: No Auth, Bearer Token, or API Key. See below. |
| Custom Headers | Optional extra request headers — click Add to enter key/value pairs. |
| Query Parameters | Optional values appended to the URL — click Add to enter key/value pairs. |
| Refresh Interval | How often EasySignage re-fetches the data: 5m, 15m, 30m, 1h, 6h, 12h, or 24h. |
| Enabled | Turn the source on or off without deleting it. |
Important: The URL must use HTTPS. Plain
http://addresses, links that redirect elsewhere, and internal/private addresses are not allowed.
Authentication options
- No Auth — the API is public; nothing extra is sent.
- Bearer Token — EasySignage sends an
Authorization: Bearer <token>header. Paste your token in the Bearer Token field. - API Key — EasySignage sends your key in a header you specify. Enter the Header Name (e.g.
X-API-Key) and the API Key value.
Note: Credentials are encrypted the moment you save and are never shown again or sent back to your browser. When editing a source, leave the token/key field blank to keep the existing credentials, or type a new value to replace them.

Test the connection
Click Test Connection before saving. EasySignage performs a live request and shows:
- Connected / Failed status, the HTTP status code, the response time, and the payload size.
- A field explorer of the returned JSON so you can confirm the data looks right.
In the field explorer you can:
- Expand objects and lists to see their structure.
- See each field’s type and a sample value.
- Spot collections (lists of records) — these are marked with a collection tag and are what you’ll repeat in a table.
- Search for a field by name.
- Copy a field’s path with the copy icon.
- Toggle between the field tree and the raw JSON.
When everything looks right, click Save.
Manage existing sources
On the Data Sources list each source shows its type, status, refresh interval, last sync time, and how many templates use it. From there you can Edit, Duplicate, Enable/Disable, Explore data (browse the last fetched payload), or Delete a source.
Part 2 — Use a data source in a template
- Open or create a template and click Open Editor.
- In the left menu choose Data Sources, then open the JSON API connector.

- From Choose a data source, select the source you configured.
- If the source has not been fetched yet, click Fetch now to load its data.
- Pick the list to repeat (the collection of records) if the source has more than one.
- Tick the columns you want to display.
- Click Add to template. A dynamic table is added to your canvas — one row per record, one column per field you selected.
- Position and style the table like any other object, then Save.
Important: Once you save a template with a data source, that template is locked to that data source. When you reopen the editor the source is pre-selected and can’t be changed. To use a different source, remove the table from the design and add a new one.
How the table stays up to date
The table is connected to the data source, not a frozen copy. When EasySignage refreshes the source (on its interval), the table on your screens updates automatically. You don’t need to edit or re-publish the template.
Technical details
Data flow
You configure a source ─▶ EasySignage backend fetches + caches it
│
Template binding ─▶ rows are built from the cached data
│
Players read the cached result
(your API is never called by a screen)
Fetch & cache: the API is fetched server-side and the response is cached. Players render from the cache, so your API only sees EasySignage’s scheduled requests.
One collection per table: each table repeats one list of records (like one sheet/tab). If your JSON has several lists, add a separate table for each.
Column order: columns appear in the order you selected them; the first row is the header.
Security and limits
HTTPS only.
http://, redirecting URLs, embedded credentials (user:pass@…), and internal/private hosts are rejected.Credentials are encrypted at rest using managed encryption keys and are never returned to the browser or sent to players.
Size limit: responses larger than 10 MB are rejected.
Timeout: requests time out after 30 seconds.
Record cap: very large lists are truncated to protect playback.
Supported response shapes
EasySignage works best with a JSON object that contains a list of records, for example:
{
"resource": [
{ "name": "Cereals", "price": "3.00", "day": "Monday" },
{ "name": "Toast", "price": "2.50", "day": "Monday" }
]
}
Here resource is the collection you’d repeat, and name, price, day are the columns. Records that omit a field simply show an empty cell.
Troubleshooting
| Problem | What to check |
|---|---|
| Test Connection: Authentication failed | Re-enter the token/API key; confirm the header name for API-key auth. |
| Test Connection: Only HTTPS is allowed | Change the URL to https://. |
| Test Connection: The URL redirects elsewhere | Use the final direct URL; redirects aren’t followed. |
| The response isn’t valid JSON | Open the URL in a browser and confirm it returns valid JSON (no HTML error page, no trailing/missing brackets). |
| No data to explore / empty table | Open the source and use Fetch now, or wait for the first scheduled sync, then add the table. |
| No repeatable list found | Your JSON has no array of records; the table needs a list (collection) to repeat. |
| Table shows but the background is missing in preview | The design image is still rendering; give it a moment and refresh the preview. |
Tip: If a field shows raw JSON instead of a value, it’s a nested object. Pick the specific sub-field (e.g. a price inside a details object) as a column instead.