OpenAPI YAMLOpenAPI JSONproblems YAMLAPI overview
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
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.
Request template and responses
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/source-presets'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The 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 Source Preset
One source preset, as the list shows it.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| name | path | required | The name of a source preset, as GET /api/source-presets lists it. |
Request template and responses
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/source-presets/NAME'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | One source preset. | SourcePreset (application/json); headers: Cache-Control |
| 404 | not_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) |
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.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| after | query | optional |
Request template and responses
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The 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) |
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.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| Idempotency-Key | header | optional | Omit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically. |
Request body fields
| Field | Description |
|---|---|
| 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
curl --request POST --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/sources'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Created. | Source (application/json); headers: Location, ETag, Cache-Control |
| 400 | invalid_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) |
| 409 | source_target_taken (the card already has a source; source_id names it), source_limit_reached or idempotency_mismatch. | Problem (application/problem+json) |
| 422 | source_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) |
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.
Request body fields
| Field | Description |
|---|---|
| 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
curl --request POST --header 'Authorization: Bearer [SCREENRIG_TOKEN]' --header 'Content-Type: application/json' --data '@request.json' 'https://api.screenrig.ai/api/sources/test'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The preview. | SourceTestResult (application/json); headers: Cache-Control |
| 400 | invalid_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) |
| 404 | The saved source named by source_id was not found. | Problem (application/problem+json) |
| 422 | source_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 Source
One data source with its status. ETag is the revision, for If-Match on the next change.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| source_id | path | required | The id of one of the project's data sources. |
Request template and responses
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | One data source. | Source (application/json); headers: ETag, Cache-Control |
| 404 | not_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) |
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.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| source_id | path | required | The id of one of the project's data sources. |
| If-Match | header | optional | Optional positive resource revision. Omit to write the current resource; a supplied stale revision is revision_conflict. |
| Idempotency-Key | header | optional | Omit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically. |
Request body fields
| Field | Description |
|---|---|
| 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
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
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The changed source. | Source (application/json); headers: ETag, Cache-Control |
| 400 | invalid_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) |
| 404 | not_found. | Problem (application/problem+json) |
| 409 | source_target_taken or idempotency_mismatch. | Problem (application/problem+json) |
| 412 | revision_conflict. | Problem (application/problem+json) |
| 422 | source_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 Source
Deletes the data source. The card keeps the last document the source wrote. If-Match guards the revision. Appends source.deleted.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| source_id | path | required | The id of one of the project's data sources. |
| If-Match | header | optional | Optional positive resource revision. Omit to write the current resource; a supplied stale revision is revision_conflict. |
| Idempotency-Key | header | optional | Omit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically. |
Request template and responses
curl --request DELETE --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Deleted. | no body |
| 404 | not_found. | Problem (application/problem+json) |
| 412 | revision_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 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.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| source_id | path | required | The id of one of the project's data sources. |
Request template and responses
curl --request GET --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID/rooms'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The room mapping report. | SourceRooms (application/json); headers: Cache-Control |
| 404 | not_found. | Problem (application/problem+json) |
| 409 | source_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) |
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.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| source_id | path | required | The id of one of the project's data sources. |
| Idempotency-Key | header | optional | Omit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically. |
Request template and responses
curl --request POST --header 'Authorization: Bearer [SCREENRIG_TOKEN]' 'https://api.screenrig.ai/api/sources/SOURCE_ID/refresh'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The source after the sync. | Source (application/json); headers: ETag, Cache-Control |
| 404 | not_found. | Problem (application/problem+json) |
| 409 | source_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) |