API reference

Data sources API

Data sources: addresses that keep a card live

HTTP reference. Generated from the backend contract. Browse endpoints below or download OpenAPI.

This group has 10 operations, generated from api/openapi.yaml. Filter by path, action, or authentication. Each endpoint lists its inputs; expand it for a request template and response codes. Templates need your own values and a schema-valid body.

Replace uppercase placeholders with your values. For a JSON request, save a body matching the schema in request.json. Cookie examples use a local cookie jar from an authenticated session.

Data sources: addresses that keep a card live

GET/api/source-presets

List Source Presets

Lists the source presets: ready-made, tested configurations of the json data source (docs/sources.md, Presets). Each says which cards it fills, the fields a person fills in (with help, a pattern and an example), the secrets it needs and how to get each, how often it refreshes and how long a card keeps its last data, and whose data it reads under which terms.

Create a source from one with POST /api/sources and preset, settings and secrets, and preview it with POST /api/sources/test.

Authentication
projectBearer
Request body
none
Operation ID
listSourcePresets
Request template and responses
shell · request template
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/source-presets'

Responses

StatusMeaningBody and headers
200The source presets, by category and title.SourcePresetList (application/json); headers: Cache-Control
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
GET/api/source-presets/{name}

Get Source Preset

One source preset, as the list shows it.

Authentication
projectBearer
Request body
none
Operation ID
getSourcePreset

Parameters

NameSend inRequired?Description
namepathrequiredThe name of a source preset, as GET /api/source-presets lists it.
Request template and responses
shell · request template
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/source-presets/NAME'

Responses

StatusMeaningBody and headers
200One source preset.SourcePreset (application/json); headers: Cache-Control
404not_found.Problem (application/problem+json)
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
GET/api/sources

List Sources

Lists the project's data sources, newest first, at most 200 a page. A data source keeps one card's dynamic properties current from an outside address on a schedule (docs/sources.md). Each source shows its status: the last attempt, the last success, the last change written, the next run, the failure count and the last error.

Secrets are never returned; each is shown as set with a masked hint. next_cursor is passed back as after for the next page, null when there are no more.

Authentication
projectBearer
Request body
none
Operation ID
listSources

Parameters

NameSend inRequired?Description
afterqueryoptional
Request template and responses
shell · request template
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources'

Responses

StatusMeaningBody and headers
200The project's data sources.SourceList (application/json); headers: Cache-Control
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
POST/api/sources

Create Source

Creates a data source that writes one card's dynamic properties from an outside address. kind selects the adapter (ics reads an iCalendar or webcal:// address); config holds the kind's settings and secrets its credentials, which are stored sealed and shown only as a masked hint.

Or name a preset (GET /api/source-presets) and give its settings and secrets instead of kind and config: the source is a json source whose config the preset builds, shown back with its preset and settings, and the refresh interval and stale period default to the preset's. A preset fills only the cards it lists (source_target_unsupported).

The source runs within seconds and then every refresh_seconds. A failed run never writes: the card keeps its last good document and the source's status shows the error. One source writes one card (source_target_taken), the card must be one the kind can fill (source_target_unsupported), and an organization has at most 200 sources (source_limit_reached).

Use POST /api/sources/test first to see the document the source would write. Appends source.created. An exact retry with the same Idempotency-Key returns this same answer for twenty-four hours.

Authentication
projectBearer
Request body
SourceCreate
Operation ID
createSource

Parameters

NameSend inRequired?Description
Idempotency-KeyheaderoptionalOmit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically.

Request body fields

FieldDescription
name (required, string)minLength: 1 maxLength: 80
kind (optional, SourceKind)

Where the data comes from. ics reads iCalendar and webcal:// addresses (the other kinds are described in /docs/sources). A kind that is not available answers invalid_request at kind. Allowed: "ics", "sheets", "csv", "json", "microsoft365", "google_calendar", "square", "shopify", "momentus", "toast"

target (required, SourceTarget)
preset (optional, string)

A source preset (GET /api/source-presets) to make the source from, instead of kind and config: the kind is the preset's, and the config is built from settings. kind and config are required without it, and refused with it unless kind is the preset's own. pattern: "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"

settings (optional, object)The values of the preset's fields, by field name (a text, an option of a choice, or a list of objects). Required fields are enforced against the preset, with a field path such as settings.channel.
config (optional, object)

The kind's settings (/docs/sources). For ics: calendars (1 to 60, each with a key), days, time_zone, private_title, include, exclude. include and exclude (each 1 to 20 keywords of 1 to 100 characters, matched against event titles) are also settings of microsoft365, google_calendar and momentus.

For csv and json: url, method (GET or POST), body or graphql, headers, auth (none, bearer, header, basic, oauth2, token_request), time_zone, pagination, and for json format (auto, json, csv, xml).

secrets (optional, object)

Credentials by name, stored sealed. For ics: calendar_url.<key>, the calendar's address (webcal://, https:// or http://), one per calendar. For csv and json: token, password, client_secret, header.<Name> (a request header) and query.<name> (a query parameter), and the secrets a token_request body reads as {{secrets.<name>}}.

For a preset: the names its secrets list gives.

refresh_seconds (optional, integer)Seconds between syncs; the kind's default and floor apply when omitted or lower (ics: 300, at least 60; momentus: 60, at least 30). minimum: 30 maximum: 86400
stale_after_seconds (optional, SourceStaleAfter)

How long the card keeps the source's last good data when it cannot refresh, in seconds.

The source writes its documents to expire that long after the last good refresh, so when it keeps failing they blank on every screen (offline ones included) and pages whose visibility depends on the data fall back to the pages after them; a source that is not failing renews the deadline as it refreshes.

At least twice refresh_seconds. null keeps the last good data until the source refreshes again (the default for every kind but momentus, whose default is 1800 when the member is omitted on create). A failing source that passes the period is stale (status.stale) and appends source.stale.

enabled (optional, boolean)default: true
Request template and responses
shell · request template
curl --request POST --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/sources'

Responses

StatusMeaningBody and headers
201Created.Source (application/json); headers: Location, ETag, Cache-Control
400invalid_request with field errors (config.calendars[0].key, secrets.calendar_url.lobby, settings.channel for a preset), or source_secret_required when a secret the kind or preset needs is missing.Problem (application/problem+json)
402

feature_not_in_plan — a Square, Shopify, Microsoft 365 or Google Workspace room source needs connected sources (Plus) and a Momentus source needs the Momentus source (Enterprise); the problem names the feature and required_plan. Calendars by address, Google Sheets, CSV and JSON sources are in every plan.

Problem (application/problem+json)
409source_target_taken (the card already has a source; source_id names it), source_limit_reached or idempotency_mismatch.Problem (application/problem+json)
422source_target_unsupported; supported_cards lists the card types the kind can fill.Problem (application/problem+json)
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
POST/api/sources/test

Test Source

Previews a data source without saving or writing anything: fetches the address, shapes the answer for the target card and validates the document against the card, then returns the document, whether the card accepts it (valid, with validation_error naming the path when it does not), the run's warnings and counts.

Pass source_id to test a saved source with the other members as overrides (settings override a preset source's own); otherwise target and either kind and config, or preset, settings and secrets, are required. A secret a saved source keeps is used as stored, unless the override changes where it points (source_secret_required).

A fetch or shaping failure is source_test_failed with the fixed source_error. At most 30 previews a minute per organization.

Authentication
projectBearer
Request body
SourceTestRequest
Operation ID
testSource

Request body fields

FieldDescription
source_id (optional, string)A saved source to test; the other members override it.
kind (optional, SourceKind)

Where the data comes from. ics reads iCalendar and webcal:// addresses (the other kinds are described in /docs/sources). A kind that is not available answers invalid_request at kind. Allowed: "ics", "sheets", "csv", "json", "microsoft365", "google_calendar", "square", "shopify", "momentus", "toast"

target (optional, SourceTarget)
config (optional, object)
preset (optional, string)A source preset to test a source that is not saved yet; its settings and secrets replace kind and config. pattern: "^[a-z][a-z0-9]*(-[a-z0-9]+)*$"
settings (optional, object)A preset's settings; with source_id they override the saved source's.
secrets (optional, object)
Request template and responses
shell · request template
curl --request POST --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/sources/test'

Responses

StatusMeaningBody and headers
200The preview.SourceTestResult (application/json); headers: Cache-Control
400invalid_request or source_secret_required.Problem (application/problem+json)
402

feature_not_in_plan — a Square, Shopify, Microsoft 365 or Google Workspace room source needs connected sources (Plus) and a Momentus source needs the Momentus source (Enterprise); the problem names the feature and required_plan. Calendars by address, Google Sheets, CSV and JSON sources are in every plan.

Problem (application/problem+json)
404The saved source named by source_id was not found.Problem (application/problem+json)
422source_test_failed (source_error holds code, message and upstream_status) or source_target_unsupported.Problem (application/problem+json)
429

Stable rate_limited problem. Retry only after the authoritative Retry-After interval. Fixed-window denials also include the applicable RateLimit-Policy and RateLimit members; concurrency and byte-budget denials omit those optional disclosures.

Problem (application/problem+json); headers: Retry-After, RateLimit-Policy, RateLimit
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
GET/api/sources/{source_id}

Get Source

One data source with its status. ETag is the revision, for If-Match on the next change.

Authentication
projectBearer
Request body
none
Operation ID
getSource

Parameters

NameSend inRequired?Description
source_idpathrequiredThe id of one of the project's data sources.
Request template and responses
shell · request template
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID'

Responses

StatusMeaningBody and headers
200One data source.Source (application/json); headers: ETag, Cache-Control
404not_found.Problem (application/problem+json)
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
PATCH/api/sources/{source_id}

Update Source

Changes a data source. config replaces the whole config; secrets merges (a string sets or replaces one, null removes it).

A source made from a preset takes settings instead of config: each setting named replaces its value, null removes an optional one, the others keep theirs, and the config is built again from the preset (config on such a source is invalid_request at config, and settings on another is invalid_request at settings). Its secrets are named as the preset names them.

A secret not sent keeps its value unless the change points the source somewhere its stored scope does not cover (source_secret_required at secrets.<name>: enter it again).

A change to the target, config, secrets, refresh_seconds or enabled resets the failure count and runs the source within seconds; a rename does not. enabled false stops the schedule and keeps the card's last document. If-Match guards the revision. Appends source.updated.

Authentication
projectBearer
Request body
SourceUpdate
Operation ID
updateSource

Parameters

NameSend inRequired?Description
source_idpathrequiredThe id of one of the project's data sources.
If-MatchheaderoptionalOptional positive resource revision. Omit to write the current resource; a supplied stale revision is revision_conflict.
Idempotency-KeyheaderoptionalOmit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically.

Request body fields

FieldDescription
name (optional, string)minLength: 1 maxLength: 80
target (optional, SourceTarget)
config (optional, object)Replaces the whole config. A source made from a preset takes settings instead.
settings (optional, object)For a source made from a preset: merged into its settings (a value replaces one, null removes an optional one) and the config is built again.
secrets (optional, object)Merged into the stored secrets: a string sets or replaces one, null removes it. A source made from a preset names them as the preset does.
refresh_seconds (optional, integer)minimum: 30 maximum: 86400
stale_after_seconds (optional, SourceStaleAfter)

How long the card keeps the source's last good data when it cannot refresh, in seconds.

The source writes its documents to expire that long after the last good refresh, so when it keeps failing they blank on every screen (offline ones included) and pages whose visibility depends on the data fall back to the pages after them; a source that is not failing renews the deadline as it refreshes.

At least twice refresh_seconds. null keeps the last good data until the source refreshes again (the default for every kind but momentus, whose default is 1800 when the member is omitted on create). A failing source that passes the period is stale (status.stale) and appends source.stale.

enabled (optional, boolean)
Request template and responses
shell · request template
curl --request PATCH --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/sources/SOURCE_ID'

Responses

StatusMeaningBody and headers
200The changed source.Source (application/json); headers: ETag, Cache-Control
400invalid_request or source_secret_required.Problem (application/problem+json)
402

feature_not_in_plan — a Square, Shopify, Microsoft 365 or Google Workspace room source needs connected sources (Plus) and a Momentus source needs the Momentus source (Enterprise); the problem names the feature and required_plan. Calendars by address, Google Sheets, CSV and JSON sources are in every plan.

A change that only replaces secrets, alone or with enabled false, is always allowed, so a source whose token expired stays current.

Problem (application/problem+json)
404not_found.Problem (application/problem+json)
409source_target_taken or idempotency_mismatch.Problem (application/problem+json)
412revision_conflict.Problem (application/problem+json)
422source_target_unsupported.Problem (application/problem+json)
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
DELETE/api/sources/{source_id}

Delete Source

Deletes the data source. The card keeps the last document the source wrote. If-Match guards the revision. Appends source.deleted.

Authentication
projectBearer
Request body
none
Operation ID
deleteSource

Parameters

NameSend inRequired?Description
source_idpathrequiredThe id of one of the project's data sources.
If-MatchheaderoptionalOptional positive resource revision. Omit to write the current resource; a supplied stale revision is revision_conflict.
Idempotency-KeyheaderoptionalOmit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically.
Request template and responses
shell · request template
curl --request DELETE --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID'

Responses

StatusMeaningBody and headers
204Deleted.no body
404not_found.Problem (application/problem+json)
412revision_conflict.Problem (application/problem+json)
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
GET/api/sources/{source_id}/rooms

Get Source Rooms

The room mapping of a data source that reads a booking system's rooms (kind momentus): which rooms it offers that no screen shows (summary.unmapped_rooms), and which screens read a room or area document without a value that names one (screens with status missing or unknown, with a suggestion when the value is a room written another way).

The rooms are those of the source's last good refresh; nothing is fetched. A kind with no rooms answers source_has_no_rooms.

Authentication
projectBearer
Request body
none
Operation ID
getSourceRooms

Parameters

NameSend inRequired?Description
source_idpathrequiredThe id of one of the project's data sources.
Request template and responses
shell · request template
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID/rooms'

Responses

StatusMeaningBody and headers
200The room mapping report.SourceRooms (application/json); headers: Cache-Control
404not_found.Problem (application/problem+json)
409source_has_no_rooms.Problem (application/problem+json)
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)
POST/api/sources/{source_id}/refresh

Refresh Source

Syncs the source now, inline (up to 60 seconds), and returns it with its new status. A failed sync answers 200 with status.state error and the error; it never writes. A refresh starts the source over: the failure count resets and the address is read in full. source_busy (Retry-After) while a scheduled sync holds the source.

At most 6 refreshes a minute per source.

Authentication
projectBearer
Request body
none
Operation ID
refreshSource

Parameters

NameSend inRequired?Description
source_idpathrequiredThe id of one of the project's data sources.
Idempotency-KeyheaderoptionalOmit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically.
Request template and responses
shell · request template
curl --request POST --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID/refresh'

Responses

StatusMeaningBody and headers
200The source after the sync.Source (application/json); headers: ETag, Cache-Control
404not_found.Problem (application/problem+json)
409source_busy.Problem (application/problem+json); headers: Retry-After
429

Stable rate_limited problem. Retry only after the authoritative Retry-After interval. Fixed-window denials also include the applicable RateLimit-Policy and RateLimit members; concurrency and byte-budget denials omit those optional disclosures.

Problem (application/problem+json); headers: Retry-After, RateLimit-Policy, RateLimit
default

Stable RFC 9457 problem response. A 421 server_draining carries Retry-After of 1 second, a 500 not_ready or dependency_unavailable carries 5, and a 500 manifest_degraded carries 60, unless the handler set a more specific value.

Problem (application/problem+json)