OpenAPI YAMLOpenAPI JSONproblems YAMLAPI overview
This group has 94 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.
People and project dashboard
Inspect Dashboard Invitation
Inspects an invitation without consuming it. Never reports signup or verification state, except that a sign-in reset reports replaces_unverified_account. An organization_admin or organization_member invitation reports the organization's name and no project.
Request body fields
| Field | Description |
|---|---|
| token (required, string) | pattern: "^[A-Za-z0-9_-]{43}$" |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/invitations/inspect'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Inspects an invitation without consuming it. | InvitationInspect (application/json); headers: 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) |
| 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 |
Start Dashboard Invitation Passkey
Starts a five-minute registration ceremony bound to the invitation digest and mode. Link create_login requires a verified __Host-screenrig-signup cookie and uses its name.
Email create_login binds the supplied display name; reset binds the target person, except that a reset of an unverified address registers the passkey for the new person it creates, named by the supplied display name or, when absent, from the address.
That reset requires replace_unverified_account true (the inspection reports replaces_unverified_account) and otherwise answers 409 unverified_account_replacement.
Request body fields
| Field | Description |
|---|---|
| token (required, string) | pattern: "^[A-Za-z0-9_-]{43}$" |
| mode (required, string) | Allowed: "create_login", "reset" |
| display_name (optional, DashboardDisplayName) | Trimmed printable display name, at most 80 UTF-8 bytes. Rejects controls, URL-looking text, @, www., ://, and credential material. Never authorization. minLength: 1 maxLength: 80 |
| replace_unverified_account (optional, boolean) | Sign-in reset only (mode reset; any other mode refuses it). Must be true when the inspection reports replaces_unverified_account true, which is the person's consent to a new, empty account in place of the unverified one the address holds; absent or false then answers 409 unverified_account_replacement and starts no ceremony. Ignored when the reset replaces nothing. default: false |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/invitations/passkey-options'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Starts a five-minute registration ceremony bound to the invitation digest and mode. | DashboardPasskeyRegistration (application/json); headers: 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) |
| 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 |
Verify Dashboard Invitation Email
Starts a browser-bound link signup and revokes earlier signups for this invitation. The verification challenge is bound to this signup. Development auth verifies the signup immediately without mail.
Request body fields
| Field | Description |
|---|---|
| token (required, string) | pattern: "^[A-Za-z0-9_-]{43}$" |
| display_name (required, DashboardDisplayName) | Trimmed printable display name, at most 80 UTF-8 bytes. Rejects controls, URL-looking text, @, www., ://, and credential material. Never authorization. minLength: 1 maxLength: 80 |
| email (required, string) | minLength: 3 maxLength: 254 format: "email" |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/invitations/email-verifications'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 202 | Starts a browser-bound link signup and revokes earlier signups for this invitation. | InvitationEmailVerificationAccepted (application/json); headers: Set-Cookie, 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) |
| 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 |
Get Dashboard Invitation Signup
Returns the live signup belonging to this browser. A missing, revoked, consumed, or expired signup cookie returns invitation_invalid.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/invitations/signup'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Returns the live signup belonging to this browser. | InvitationSignup (application/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) |
Accept Dashboard Invitation
Accepts an invitation transactionally and mints a fresh person session, deleting the old session when present.
Link create_login requires the verified __Host-screenrig-signup cookie for this invitation. signed_in requires a dashboard session and recent sign-in or fresh proof; email delivery requires a matching verified email, or the unverified address of the signed-in person, which accepting verifies.
An address a live person already holds, verified or not, returns resource_conflict for create_login. A reset signs in the person who holds a verified address.
A reset of an unverified address requires replace_unverified_account true (the inspection reports replaces_unverified_account) and otherwise answers 409 unverified_account_replacement and consumes nothing; with it, the reset creates a new verified person with the credential it registers, named by display_name or, when absent, from the address, with a new organization and project, and signs that person in; the unverified person is deleted (their sessions, passkeys and agents end) and the projects and organizations they made stay, without them and no longer matching the address as their contact, so no later reset re-sends them an enrollment invitation.
The response names the new project. A session whose email verification is required (email_verification_required on GET /api/session) accepts only an emailed invitation naming its own address and receives 403 email_verification_required for any other.
An organization_admin invitation adds the person to the organization's admins and opens no project; it returns organization_admin_limit when the organization already has 20 admins and stays outstanding, and resource_conflict when the organization was deleted.
An organization_member invitation sets the person's home organization to the inviting organization, from any previous home, and grants no project membership; it returns managed_elsewhere (409) when another organization manages the person, and resource_conflict when the organization was deleted.
An organization_admin invitation sets the home organization only for a person with none. A project_member invitation re-checks the organization's guest policy and returns guest_not_allowed (403) when the person would be an external guest the policy refuses; a project invitation never changes anyone's home organization. A refused invitation stays outstanding.
Request body fields
| Field | Description |
|---|---|
| token (required, string) | pattern: "^[A-Za-z0-9_-]{43}$" |
| mode (required, string) | Allowed: "create_login", "signed_in", "reset" |
| display_name (optional, DashboardDisplayName) | Trimmed printable display name, at most 80 UTF-8 bytes. Rejects controls, URL-looking text, @, www., ://, and credential material. Never authorization. minLength: 1 maxLength: 80 |
| credential (optional, InvitationCredential) | |
| proof (optional, DashboardProof) | |
| buyer (optional, InvitationBuyer) | |
| remove_other_passkeys (optional, boolean) | Sign-in reset only (mode reset). Removes the person's passkeys other than the one this reset registers, or every passkey when the reset sets a password, so a lost or stolen device stops signing in. Absent means true; any other invitation refuses it. A reset of an unverified address creates a new person who has no other passkeys, and ignores it. A reset that registers a passkey removes the password whatever this says. default: true |
| replace_unverified_account (optional, boolean) | Sign-in reset only (mode reset; any other invitation refuses it). Must be true when the inspection reports replaces_unverified_account true, which is the person's consent to a new, empty account in place of the unverified one the address holds; absent or false then answers 409 unverified_account_replacement and consumes nothing. Ignored when the reset replaces nothing. default: false |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/invitations/accept'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Accepts an invitation transactionally and mints a fresh person session, deleting the old session when present. | InvitationAccepted (application/json); headers: Set-Cookie, 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) |
| 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 |
Start Dashboard Signup Passkey
Starts a five-minute registration ceremony for a self-serve signup, bound to the normalized email address and the display name. It creates nothing and sends no mail.
An address a live person holds, verified or not, returns 409 account_exists; an address at a domain whose organization signs in through an identity provider returns 403 sso_required; an invalid address or name returns 400 invalid_request with field errors. A server running dashboard development authentication returns passkeys_disabled.
Limited per client address.
Request body fields
| Field | Description |
|---|---|
| email (required, string) | minLength: 3 maxLength: 254 format: "email" |
| display_name (required, DashboardDisplayName) | Trimmed printable display name, at most 80 UTF-8 bytes. Rejects controls, URL-looking text, @, www., ://, and credential material. Never authorization. minLength: 1 maxLength: 80 |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/signups/passkey-options'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Starts a five-minute registration ceremony for a self-serve signup. | DashboardPasskeyRegistration (application/json); headers: RateLimit-Policy, RateLimit |
| 400 | 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) |
| 403 | 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) |
| 409 | 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) |
| 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) |
Create Dashboard Signup
Creates a self-serve account and signs this browser in.
One transaction creates the person with an unverified email address and a verification deadline 72 hours out, registers the passkey from the ceremony POST /api/signups/passkey-options started, creates the person's organization and project as agent enrollment creates them, makes the person the project owner, stores the marketing email choice, and queues the verification mail (purpose account_email).
The website visitor that opened the page is linked to the account and the signup is counted as signed_up. The response sets the dashboard session cookie. The refusals are those of POST /api/signups/passkey-options; a used, expired or mismatched ceremony returns 400 invalid_request. Limited per client address and per email address.
Request body fields
| Field | Description |
|---|---|
| email (required, string) | minLength: 3 maxLength: 254 format: "email" |
| display_name (required, DashboardDisplayName) | Trimmed printable display name, at most 80 UTF-8 bytes. Rejects controls, URL-looking text, @, www., ://, and credential material. Never authorization. minLength: 1 maxLength: 80 |
| marketing_email (required, boolean) | The person chose to receive product news by email. Stored as consent with the person. |
| credential (required, DashboardPasskeyProof) |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/signups'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | The account exists and this browser holds its session. | SignupCreated (application/json); headers: Cache-Control, Set-Cookie, RateLimit-Policy, RateLimit |
| 400 | 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) |
| 403 | 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) |
| 409 | 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) |
| 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) |
Switch Dashboard Project
Switches to one of the person’s projects and updates its last-used time. A staff member may also switch to a project they shadow; that session reports shadow true, is read-only, and updates no last-used time. Any other project returns not_found.
Request body fields
| Field | Description |
|---|---|
| project_id (required, string) | minLength: 1 |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/session/project'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Switches to one of the person’s projects and updates its last-used time. | DashboardSession (application/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 Dashboard Members
Lists members of the current project without their private email addresses.
Every member has equal authority except member management (removal, approver, scopes, ownership), which belongs to the owner and to an admin of the project's organization who is a member. owner marks the project owner, external marks a guest (the member's home is not the project's organization), and viewer_user_id and viewer_is_owner describe the signed-in person.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Lists members of the current project without their private email addresses. | DashboardMemberList (application/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) |
Remove Dashboard Member
Removes a member from the current project. The project owner removes any other member, and so does an admin of the project's organization who is a member; any member removes themselves to leave. The owner is never removed and never leaves (owner_cannot_leave; transfer ownership first). A member removing someone else is refused with owner_required.
A person who is not a member, including one already removed, is not_found. In one transaction the membership ends, that person's outstanding email invitations to the project are revoked, and the project event member.removed is appended (details user_id, removed_by_user_id, left).
The person's sessions stop resolving the project on their next request and fall back as they do after a project deletion. Agent memberships are separate and stay. People only; no bearer route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required | |
| project_id | query | required | The project the caller means; a session whose selection has changed is refused with resource_conflict. |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID?project_id=PROJECT_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The membership ended. | no body |
| 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 Member Activity
One person's activity in the current project, newest first: their sign-ins (and refused sign-ins naming their address or passkey), sign-outs, switches into the project, credential changes, reauthentication proofs and every change they made through the dashboard, refused and failed ones included. Reads are never recorded.
Agent and CLI requests are on their agents (listDashboardAgentEvents). A staff member's shadow of the project records nothing; a change made under an approved staff write lease is a row of that staff member with source staff.
The person themself, the project's owner, an admin of the project's organization and a staff member shadowing the project may read it. Anyone else is answered not_found, as is a person who is neither a member nor has rows here, so the answer never tells who belongs; a former member's rows stay readable.
The project is the session's, never the request's, and only that project's rows are ever returned.
Every value is server-derived: the action from the route the server matched (or a named account action such as session.sign_in or passkey.add), the resource from the route's first path value when it is a server-minted identifier, status, problem_code and error from the problem registry, the client parsed from the User-Agent and platform hint (the raw User-Agent is not kept).
No request body, password, token or cookie is stored. client_ip and email are shown as recorded.
Paging keys on (at, id) descending. Pass next_cursor as after to continue; it is null at the end. A row written meanwhile only lands ahead of the first page and retention removes the oldest rows, so a cursor never repeats or skips a surviving row. A malformed cursor or filter is refused with invalid_request; a limit outside 1-100 is the default.
Rows expire on the project's event retention window at the time they were written. recorded_since is the time of the project's oldest surviving row, or, before any, when this server began recording; nothing before it is reconstructed.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required | |
| after | query | optional | Cursor from a previous page's next_cursor. |
| limit | query | optional | |
| kind | query | optional | Only these kinds; repeat the parameter or separate kinds with commas. |
| outcome | query | optional | |
| resource_type | query | optional | Exact kind of object the request acted on. |
| resource_id | query | optional | Exact identifier of the object the request acted on. |
| since | query | optional | |
| until | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID/activity'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The person's activity in the current project. | MemberActivityList (application/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 Dashboard Me
Returns the signed-in person’s profile and credential counts.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Returns the signed-in person’s profile and credential counts.. | DashboardMe (application/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 Dashboard Me
Tombstones the signed-in person. Proof-protected: the body carries a fresh sign-in proof verified against a reauthentication bound to this session with kind account_delete and subject_id equal to the signed-in person's user id (start it with POST /api/me/reauthentications). Without a current reauthentication the answer is reauthentication_required.
On success the response is 204, the dashboard session cookie is cleared, and the browser's HTTP cache for the dashboard origin is cleared as on sign-out.
Request body fields
| Field | Description |
|---|---|
| proof (required, DashboardProof) |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Person deleted, dashboard session cookie cleared and the browser's HTTP cache for this origin cleared. | no body; headers: Clear-Site-Data |
| 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) |
Start Dashboard Reauthentication
Starts passkey step-up bound to the session, kind, and subject. A person without a passkey receives resource_conflict and uses a password proof.
Request body fields
| Field | Description |
|---|---|
| kind (required, string) | Allowed: "agent_connection_approval", "agent_connection_denial", "agent_disconnect", "email_change", "password_set", "passkey_add", "passkey_delete", "invitation_accept", "account_delete", "staff_grant", "staff_action", "staff_featuresets", "staff_education_eligible", "dashboard_token", "oauth_authorization_approval", "oauth_authorization_denial", "service_client_change", "review_policy_change", "identity_provider_change", "sso_policy_change", "scim_change" |
| subject_id (optional, string) | The subject the reauthentication binds to. kind account_delete requires the signed-in person's user id. kind staff_grant is staff only and requires the added person's email address. kind staff_action requires the specific prepared request_id. kind staff_featuresets is staff only and requires the organization id (replacing its featuresets). kind staff_education_eligible is staff only and requires the organization id (marking it a verified K-12 school or district, or clearing the mark). kind dashboard_token is staff only and requires the signed-in staff person's user id (creating or replacing a dashboard link token). kinds oauth_authorization_approval and oauth_authorization_denial require the authorization id (oaz_...). kind service_client_change requires the service client id, or the project id when creating a client. kind review_policy_change requires the project id (turning Require review for agent changes off). kinds identity_provider_change, sso_policy_change and scim_change require the organization id (an organization admin changing its single sign-on connection, its Require SSO policy, or its SCIM settings and tokens); a session that signed in through single sign-on proves with {type: sso} instead and starts no reauthentication. minLength: 1 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/reauthentications'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Starts passkey step-up bound to the session, kind, and subject. | DashboardReauthentication (application/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) |
Set Dashboard Password
Sets or replaces the person’s password after fresh proof. The first password requires passkey proof; replacement accepts the current password or a passkey. Revokes other sessions and queues a sign-in changed notice.
A person whose email address is unverified, such as a self-serve signup before they verify it, cannot set a password and receives 403 email_verification_required.
Request body fields
| Field | Description |
|---|---|
| password (required, string) | 12–128 UTF-8 bytes, without whitespace. Cannot equal the email or display name or a bundled common password. Stored only as an Argon2id hash. minLength: 12 maxLength: 128 pattern: "^\\S+$" |
| proof (required, DashboardProof) |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/password'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Sets or replaces the person’s password after fresh proof. | no body |
| 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 Dashboard Passkeys
Lists the person’s passkeys with what a client needs to keep the browser’s password manager in step with them (the WebAuthn Signal API). The list carries the relying party ID and the user handle the passkeys are registered under, and each passkey carries its credential ID and the provider its authenticator reported.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me/passkeys'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Lists the person’s passkeys.. | DashboardPasskeyList (application/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) |
Start Dashboard Passkey Registration
Verifies fresh proof and starts a registration bound to the session and person. Passkeys are disabled under development auth.
Request body fields
| Field | Description |
|---|---|
| proof (required, DashboardProof) |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/passkeys/options'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Verifies fresh proof and starts a registration bound to the session and person. | DashboardPasskeyRegistration (application/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) |
Complete Dashboard Passkey Registration
Stores the new passkey, revokes the person’s other sessions, and queues a sign-in changed notice. A passkey sent without a name is named after its provider, or Passkey when its authenticator reported none the list knows.
Request body fields
| Field | Description |
|---|---|
| ceremony_id (required, string) | minLength: 1 |
| credential (required, object) | WebAuthn credential response. |
| name (optional, string) | The name the person gives the passkey. Left out, the passkey is named after its provider (for example iCloud Keychain), or Passkey when the authenticator reported none the list knows. minLength: 1 maxLength: 60 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/passkeys/complete'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Stores the new passkey, revokes the person’s other sessions, and queues a sign-in changed notice.. | DashboardPasskey (application/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) |
Rename Dashboard Passkey
Renames a passkey owned by the signed-in person.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request body fields
| Field | Description |
|---|---|
| name (required, string) | minLength: 1 maxLength: 60 |
Request template and responses
curl --request PATCH --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/passkeys/RESOURCE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Renames a passkey owned by the signed-in person.. | DashboardPasskey (application/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 Dashboard Passkey
Deletes a passkey after fresh proof and sends a sign-in changed notice. Removing the last sign-in method returns last_credential. A person whose account requires a passkey (every staff member) cannot remove their last passkey; that returns 409 resource_conflict.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request body fields
| Field | Description |
|---|---|
| proof (required, DashboardProof) |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/passkeys/RESOURCE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Deletes a passkey after fresh proof and sends a sign-in changed notice. | no body |
| 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 Dashboard Email
Returns the person’s verified and pending email state. A person who signed up themselves holds an unverified address until they open the link mailed to it; email_verified is false and verify_by is the deadline, after which the session may use only the routes that verify or change the address (email_verification_required on GET /api/session).
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me/email'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Returns the person’s verified and pending email state.. | DashboardEmail (application/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) |
Change Dashboard Email
Requests an email change after fresh proof. The verified address stays effective while verification is pending. An address any other live person holds, verified or not, returns user_email_conflict. The old address receives a warning, not an undo link.
A person whose address is unverified changes it the same way; verifying the new address makes it the person's verified address and clears verify_by.
Request body fields
| Field | Description |
|---|---|
| email (required, string) | minLength: 3 maxLength: 254 format: "email" |
| proof (required, DashboardProof) |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/email/change'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 202 | Requests an email change after fresh proof. | UserEmailChangeAccepted (application/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) |
Request Dashboard Email Verification
Queues a fresh verification link. While an email change waits for verification (pending_email on GET /api/me/email), it is that change's link, sent to the pending address; otherwise it is an account_email link for the person's current unverified address. Within ten minutes of the last link of its kind it queues nothing and still answers 202.
A person whose address is verified and who has no change pending returns 409 resource_conflict.
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me/email/verification'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 202 | The verification link is queued, or was queued within the last ten minutes. | DashboardEmailVerificationAccepted (application/json) |
| 409 | 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) |
| 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) |
Put Dashboard Signup Profile
Replaces the answers the person gave after signing up with the body, which holds every answer so far; a member left out, or null, is unanswered. Each member has a closed value set, and a value outside it returns 400 invalid_request with a field error.
The profile is kept with the person and shown to screenRIG staff with the organization the person signed up into.
Request body fields
| Field | Description |
|---|---|
| who_for (optional, inline) | |
| use_case (optional, inline) | |
| screen_range (optional, inline) | |
| go_live (optional, inline) | |
| devices (optional, inline) | |
| role (optional, inline) | |
| firm_kind (optional, inline) | |
| agent (optional, inline) | |
| agent_other (optional, inline) | The agent's name when agent is other. |
| heard (optional, inline) | |
| heard_detail (optional, inline) |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me/signup-profile'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The profile is stored. | no body |
| 400 | 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) |
| 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 Dashboard Application Usage
Where an application (web app) of the session's project is placed, computed in one pass over the project's playlists and one read of the screens that hold them. placements are the application primitives whose stored application owner is this application, in playlist (the playlist list's order), page and primitive order; a playlist that places it twice has two. release says how each pinned release stands against the application's latest_ready_release: latest, older, or unknown while it has none. screens are the pairing_pending and active screens that default to, schedule, take over with or currently show a playlist of a placement, newest first; archived screens never count, and a screen whose Player cannot show web apps carries applications_unsupported.
A member or agent limited to screens (screen_scope) sees only its screens, and screen_count counts only those. This is not the delete blocker, which is the runtime grants (a screen's manifest holding a release). An id the project does not hold is not_found as for getApplication. The answer is private and no-store.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/applications/RESOURCE_ID/usage'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Where the application is placed. | ApplicationUsage (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) |
Put Dashboard Advertising Inventory
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| ScreenRig-Project | header | optional | Deprecated for one release. Must be consistent with the JWT projects grants; adds Deprecation and Warning headers. No token exchange. |
| screen_id | path | required | |
| If-Match | header | optional | Optional positive resource revision. Omit to write the current resource; a supplied stale revision is revision_conflict. |
Request body fields
| Field | Description |
|---|---|
| impressions_per_hour (optional, inline) | The seller's estimate of the impressions this screen delivers in an hour. Each completed play counts this times its seconds over 3600 as estimated impressions in reports. Null or absent means no estimate. |
| ads_enabled (required, boolean) | |
| site_name (optional, string) | maxLength: 120 |
| city (optional, string) | maxLength: 120 |
| region (optional, string) | maxLength: 120 |
| venue_type (optional, string) | maxLength: 64 |
| audience_tags (optional, array) | |
| placement (optional, string) | maxLength: 120 |
| public_description (optional, string) | maxLength: 500 |
| rate_override_mcr_per_15s (optional, inline) | Null restores inheritance from the project default; it never means zero. |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/advertising/inventory/SCREEN_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Stored inventory. | AdvertisingInventory (application/json) |
| 403 | outside_screen_scope as on OutsideScreenScope, or approver_required - a member limited to screens who cannot approve reviews does not change what a screen plays or when (docs/screen-scope.md). | Problem (application/problem+json) |
| 409 | protected_target - the change reaches a screen in a protected screen folder and has no review form (docs/screen-scope.md). Clear the folder's protection through a review, make the change, and protect the folder again. | 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 Dashboard Media Usage
Where a ready media item of the session's project is used, computed in one pass over the project's playlists and one read of the screens that hold them. playlists are those that name the file (an image or video primitive's static ids and a by id or ids selector, a stream's fallback, a media:<id> string in a card's params, a stinger's logo, a soundtrack track), then those whose tag, folder or all selectors reach it, each group in the playlist list's order; a playlist is one entry whose uses list each way, the exact kinds first.
Selectors are judged as the runtime resolves them: a tag filter matches the file's tag and tags, a folder selector the files directly inside the folder, an all selector every file of the kind, and a pending file by its last-approved tags and folder (a file never approved is reached by none).
Rotation (batch_size, one_at_a_time), availability windows, aspect fit and a page's visibility are not judged. screens are the pairing_pending and active screens that default to, schedule, take over with or currently show one of those playlists, newest first; archived screens never count.
A member or agent limited to screens (screen_scope) sees only its screens, and screen_count counts only those. An id the project does not hold, or a media item that is not ready, is not_found as for getMedia. The answer is private and no-store.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/media/RESOURCE_ID/usage'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Where the media is used. | MediaUsage (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 Dashboard Media Thumbnail
Returns a small lossy WebP of a ready image owned by the session's project, so the dashboard's grids never decode originals. There is one size: it fits inside 512 x 512 with the aspect kept and is never upscaled, and an animated image shows its first frame.
The first request generates it and stores it beside the original; later requests stream the stored copy, and deleting the media removes it with the original. Another project's identifier, video, audio, and media that is not ready return not_found. Range is not accepted.
The ETag is strong and names the original and the thumbnail generator, so it is the same on every request and host. The response is private, no-cache, and an If-None-Match that matches, checked after the media resolves in the session's project, returns 304 without reading the thumbnail. Completed bytes are recorded as dashboard_media egress.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required | |
| If-None-Match | header | optional | Thumbnail ETag returned by this route. |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/media/RESOURCE_ID/thumbnail'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The WebP thumbnail. | string (image/webp); headers: Content-Length, Content-Disposition, ETag, Cache-Control, X-Content-Type-Options |
| 304 | The thumbnail ETag matches If-None-Match. No body or egress increment is produced. | no body; headers: ETag, Cache-Control |
| 404 | 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) |
| 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) |
Head Dashboard Media Thumbnail
Applies the same ownership, conditional and generation rules as getDashboardMediaThumbnail and returns its headers without the body. No egress is recorded.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required | |
| If-None-Match | header | optional | Thumbnail ETag returned by this route. |
Request template and responses
curl --request HEAD --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/media/RESOURCE_ID/thumbnail'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Thumbnail metadata with no body. | no body; headers: Content-Length, Content-Disposition, ETag, Cache-Control, X-Content-Type-Options |
| 304 | The thumbnail ETag matches If-None-Match. No egress increment is produced. | no body; headers: ETag, Cache-Control |
| 404 | 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) |
| 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) |
Peek Dashboard Email Verification
Scanner-safe verification peek. It never verifies an address, mutates a user, or signs the visitor in. It reports the link's purpose and state; a pending account_email link verifies only for a request that carries the person's dashboard session, so a page asks for the sign-in before it asks to confirm.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| token | query | required |
Request template and responses
curl --request GET 'https://screenrig.ai/api/email/verify?token=TOKEN'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Verification status. | EmailVerifyResult (application/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) |
Verify Dashboard Email
Explicit human confirmation consumes one purpose-bound verification challenge. Link-signup challenges require the matching __Host-screenrig-signup cookie; email-change challenges are token-bound, so the link works in any browser.
An account_email challenge (mailed at self-serve signup and by POST /api/me/email/verification, valid for 30 days) opens in any browser but verifies only for a request that carries a live dashboard session of the person the link is for, including a session that email_verification_required limits to this route.
With no session, or another person's, it answers 200 sign_in_required, verifies nothing and leaves the link usable. A verified account_email link marks the person's address verified and ends the verification deadline; it answers superseded when another person verified the same address first. Verification never signs the visitor in.
Request body fields
| Field | Description |
|---|---|
| token (required, string) | minLength: 1 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/email/verify'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Verification status. | EmailVerifyResult (application/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) |
Start Dashboard Passkey Assertion
Starts one usernameless WebAuthn assertion ceremony and returns the request options verbatim for navigator.credentials.get. No cookie is required, and no allowCredentials list is published, so the route reveals nothing about which users or credentials exist. The ceremony expires with DashboardCeremonyTTL of five minutes.
When the server runs dashboard development authentication, this route returns passkeys_disabled.
Request template and responses
curl --request POST 'https://screenrig.ai/api/webauthn/assertions'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | WebAuthn request options bound to this ceremony. | DashboardPasskeyAssertion (application/json); headers: Cache-Control, RateLimit-Policy, RateLimit |
| 400 | 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) |
| 403 | 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) |
| 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) |
Complete Dashboard Passkey Assertion
Verifies one usernameless assertion and mints the dashboard session cookie for the user the discoverable credential identifies. No cookie authenticates the request. A ceremony that is unknown, elapsed, or already used returns passkey_invalid, and so does an assertion the relying party cannot verify or a sign counter that moves backwards.
A valid ceremony whose credential identifier is registered to nobody (no stored credential has it, for any person) returns 401 passkey_unknown instead; that answer is for that one case only, so a client may tell the browser to forget the credential (PublicKeyCredential.signalUnknownCredential) on it and on nothing else.
The credential identifier is not authorization on its own: the signed assertion is. A person whose verified address is at a domain whose organization requires single sign-on is refused with 403 sso_required, unless they are a break-glass admin of that organization; such a sign-in is audited.
When the server runs dashboard development authentication, this route returns passkeys_disabled.
Request body fields
| Field | Description |
|---|---|
| ceremony_id (required, string) | |
| credential (required, object) | WebAuthn assertion response serialized from the PublicKeyCredential the authenticator returned. |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/webauthn/assertions/complete'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Session cookie minted from a verified assertion. | DashboardSession (application/json); headers: Cache-Control, Set-Cookie |
| 400 | 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) |
| 401 | 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) |
| 403 | 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) |
| 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) |
Create Dashboard Session
Signs in the person identified by verified email and password. Unknown email, no password, and wrong password return the same unauthorized response. Opens the last-used project if still a membership, otherwise the most recent membership, or no project.
An address at a domain whose organization requires single sign-on is refused with 403 sso_required before any account is looked up, so the answer does not depend on whether a person holds the address; POST /api/sso/starts signs that person in through their identity provider.
Password sign-in needs a verified email, so a person who signed themselves up (POST /api/signups) signs in with their passkey, and one who set a password on an unverified address still gets the unauthorized answer. Development auth uses this same password flow.
Request body fields
| Field | Description |
|---|---|
| email (required, string) | The person’s verified email address. Unknown email, no password, and wrong password return the same unauthorized response. minLength: 3 maxLength: 254 format: "email" |
| password (required, string) | minLength: 12 maxLength: 128 |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/sessions'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Person session minted from verified email and password. | DashboardSession (application/json); headers: Cache-Control, Set-Cookie, RateLimit-Policy, RateLimit |
| 400 | 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) |
| 401 | 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) |
| 403 | 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) |
| 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 |
| 500 | 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) |
| 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 Dashboard Session
Returns the current dashboard session. The session cookie and server-side session establish authority; user_id is descriptive. A 401 response means sign-in is required.
The dev_auth field is reserved for local development and is false on the hosted service. organization is the person's home organization, absent while they have none; project.organization_admin says the person administers the current project's organization.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/session'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Current dashboard session. | DashboardSession (application/json); headers: Cache-Control |
| 401 | 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) |
| 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) |
Logout Dashboard Session
Deletes the server-side session row and expires the session cookie. It does not delete the user and does not remove any credential. It is intrinsically idempotent and takes no Idempotency-Key.
A successful sign-out also clears the browser's HTTP cache for the dashboard origin, dropping the private, no-cache media, screenshot and ad review bytes the session viewed; a session that only expires leaves them until the browser evicts them.
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/logout'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Session row deleted, session cookie expired and the browser's HTTP cache for this origin cleared. | no body; headers: Cache-Control, Set-Cookie, Clear-Site-Data |
| 401 | 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) |
| 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) |
Record Onboarding Step
Reports one step of one browser's run through the dashboard's entry flows (sign-up, sign-in, reset, invitation and adding a passkey) for the staff onboarding read. Public: it works with and without a dashboard session.
The journey is the browser's own random id; the server also keeps the edge visitor cookie when the request carries one, and the person and organization when a session does. A journey is staff-only and keeps the real values people entered (addresses, names, answers); it never receives a password, code or token.
The first value of mode, source, utm_source, utm_medium, utm_campaign, click_kind, site_trail and site_cta is kept; each step keeps its first time, and a step's value, detail and the journey's email (from email_submitted) are the latest. source is accepted only with entry_viewed. question is required with the question_* steps and refused with every other. detail is a problem code for a *_failed step, the sign-in method for signed_in, or connected or skipped for signup_finished. email_verified, email_gate_reached, site_visited, site_cta_clicked and the account milestones are written or derived by the server and are refused here.
Only lengths are limited. Limited per client address.
Request body fields
| Field | Description |
|---|---|
| journey_id (required, string) | The browser's journey: a lower-case RFC 4122 UUID the dashboard keeps in its own storage. pattern: "^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" |
| step (required, OnboardingStepName) | A step of the entry flows, in display order. email_verified, email_gate_reached and the account milestones (agent_connected, screen_paired, playlist_with_content, activated) are written or joined by the server and are not names a client sends. Allowed: "entry_viewed", "returning_shown", "email_submitted", "address_new", "address_existing", "address_sso", "address_failed", "signup_form_viewed", "signup_name_entered", "signup_marketing_choice", "passkey_unsupported", "passkey_started", "passkey_cancelled", "signup_failed", "account_created", "question_shown", "question_answered", "question_follow_up", "question_skipped", "connect_viewed", "connect_copied", "agent_approved", "signup_finished", "dashboard_opened", "signin_passkey_started", "signin_passkey_cancelled", "signin_password_started", "signin_sso_started", "signin_failed", "signed_in", "reset_viewed", "reset_requested", "reset_opened", "reset_completed", "invite_viewed", "invite_email_sent", "invite_passkey_started", "invite_passkey_cancelled", "invite_failed", "invite_accepted", "passkey_upgrade_shown", "passkey_add_started", "passkey_add_cancelled", "passkey_added" |
| mode (optional, string) | The entry page's mode. The first value is kept. Allowed: "login", "signup" |
| source (optional, string) | Only with entry_viewed: where the person came from, as the entry page names it: the sign-up link's path, the last website page, the referring host, or direct. Kept as sent. The first value is kept. maxLength: 500 |
| utm_source (optional, string) | Lower-cased. The first value is kept. maxLength: 80 |
| utm_medium (optional, string) | Lower-cased. The first value is kept. maxLength: 80 |
| utm_campaign (optional, string) | Lower-cased. The first value is kept. maxLength: 80 |
| click_kind (optional, string) | The advertising click id the landing carried; the id itself is never sent. Allowed: "gclid", "gbraid", "wbraid", "fbclid", "msclkid", "li_fat_id", "ttclid", "rdt_cid", "twclid" |
| question (optional, string) | Required with question_shown, question_answered, question_follow_up and question_skipped; refused with every other step. agent_other, heard_text and heard_kind name follow-ups and go only with question_follow_up. Allowed: "who_for", "use_case", "screen_range", "go_live", "devices", "role", "firm_kind", "agent", "heard", "agent_other", "heard_text", "heard_kind" |
| detail (optional, string) | A problem code for a *_failed step, the method for signed_in (passkey, password, sso, autofill), connected or skipped for signup_finished. Kept as sent. maxLength: 200 |
| value (optional, OnboardingValue) | What the person entered at a step: the address typed (email_submitted, reset_requested), the name (signup_name_entered), yes or no (signup_marketing_choice), the options chosen or the follow-up text (question_answered, question_follow_up), an address or name entered on an invitation. Never a password, code or token. Empty is absent. |
| site_trail (optional, array) | The pages the browser viewed on the website in this tab, oldest first. The first value is kept. |
| site_cta (optional, OnboardingSiteCTA) | The sign-up or sign-in link the person clicked on the website. |
Request template and responses
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/onboarding/steps'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The step was recorded. | no body; headers: Cache-Control, RateLimit-Policy, RateLimit |
| 400 | 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) |
| 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) |
List Dashboard Agents
Lists every pending, active, revoked, cancelled, and expired agent of the session project with safe installation metadata, last use, authenticated request count, and directly attributable metered credits. No bearer, recipient key bytes, envelope, or project identifier is returned.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Project agents. | AgentList (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) |
List Dashboard Agent Events
This agent's history, newest first, as ONE record per trigger. It carries both what the agent asked for and what changed as a result. A request that changed something is its domain event, stamped with the command that caused it. A request that changed nothing — refused, failed, or an event-less success — is one agent.command event.
There is no separate commands endpoint; showing the same trigger on two panels was the defect this replaced. Lifecycle events for this agent are included. Worker, player, and dashboard-only activity is never inferred as agent activity. Two requests are two triggers. A retry after a refusal is a second record, never a rewrite of the first.
Reads are not recorded, because they change nothing and a polling agent would bury every real action. Anonymous enrollment is excluded. Every part of the command stamp is derived from the route this server matched or from the problem registry.
There is no argument vector, no request body, no header, and no free text anywhere in a record, so nothing needs redacting and no caller can write chosen text into an operator-visible surface. Resource identifiers appear because an identifier is never authorization and is already published on events. Paging keys on sequence, descending.
Pass the returned next_cursor as after to continue. next_cursor is empty when the page is short, which is the end of the history: a concurrent append only takes a higher sequence, and retention removes the lowest sequences first, so a cursor never duplicates or skips a surviving record. Offset paging is not supported.
Every search parameter is an exact-match or range predicate on a server-written token. A malformed cursor or filter value is refused with invalid_request. A limit outside 1-200 is clamped to the default rather than refused. Records expire on the project's own event retention window.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required | |
| after | query | optional | Cursor from a previous page's next_cursor. |
| limit | query | optional | |
| command | query | optional | Exact route-derived command name, such as screens.archive. |
| type | query | optional | Exact event type, such as agent.command or screen.archived. |
| resource_type | query | optional | Exact kind of object the request acted on. |
| resource_id | query | optional | Exact identifier of the object the request acted on. |
| outcome | query | optional | Present only on agent.command records; a domain event implies ok. |
| problem_code | query | optional | Exact stable problem code the server refused with. |
| since | query | optional | |
| until | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/events'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Agent history. | EventList (application/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) |
Disconnect Dashboard Agent
Disconnects the agent from the selected project after fresh proof. The project must be one of the person’s memberships. Pending connections and credential issuances are cancelled; no replacement token is issued. A member limited to screens does not connect agents, issue credentials or manage the project's people: outside_screen_scope (ask the project owner).
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request body fields
| Field | Description |
|---|---|
| project_id (required, string) | minLength: 1 |
| proof (optional, DashboardProof) | |
| capabilities (optional, array) | Optional on agent connection and connected-app approval only. Omitted approves the full requested set; a non-empty subset of the connection's capabilities narrows the granted credential; anything else is invalid_request. |
| user_code (optional, string) | Required when approving a device sign-in (flow device): the code the person confirms matches the terminal. A mismatch is agent_connection_code_mismatch; the fifth expires the sign-in (agent_connection_expired). Ignored otherwise. maxLength: 32 |
| access (optional, string) | The access level a device sign-in or a connected app is approved with (Read only, Propose or Manage); omitted keeps the level asked for. Ignored for other connections. A person who cannot approve reviews may not approve Manage (403 approver_required). Allowed: "read", "propose", "manage" |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/agents/RESOURCE_ID/disconnect'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Agent disconnected. | no body |
| 403 | outside_screen_scope - the caller is limited to screens and the screen, screen folder, selector or audience the request names or reaches is outside them (docs/screen-scope.md). An id outside the scope and an id that does not exist get the same answer; errors[0].screen_scope carries the caller's scope, and the write is refused whole, never narrowed. | 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 Dashboard Agent Notes
The notes this agent wrote in the session project, newest first, open and resolved. state is all (the default), open or resolved. Pass next_cursor back as after; it is empty on the last page. Note bodies are plain text written by an agent; render them as text, never as HTML or Markdown.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required | |
| state | query | optional | |
| after | query | optional | next_cursor of the previous page. |
| limit | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/notes'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The agent's notes. | NotePage (application/json); headers: Cache-Control |
| 404 | 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) |
| 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) |
Resolve Dashboard Agent Note
Resolves one of the agent's open notes as the signed-in person, with a required reason; resolution.by names the person. Appends note.resolved with the person as actor. A resolved note is note_not_open.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required | |
| note_id | path | required | The id of one of the agent's notes. |
| 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 |
|---|---|
| reason (required, string) | minLength: 1 maxLength: 500 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/agents/RESOURCE_ID/notes/NOTE_ID/resolve'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The resolved note. | Note (application/json) |
| 404 | 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) |
| 409 | 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) |
| 422 | 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) |
| 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 Dashboard Agent Note
Deletes one of the agent's notes, open or resolved, as the signed-in person. Appends note.deleted with the person as actor.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required | |
| note_id | path | required | The id of one of the agent's notes. |
| 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 --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/notes/NOTE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Deleted. | no body |
| 404 | 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) |
| 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 Dashboard Agent Connections
The pending connection requests addressed to the session project, which a member may review and approve: requests naming the project, and device sign-ins or connects by an agent identity already a member of it.
A new installation's sign-in is not listed (its project hint is client-supplied); a person reaches it by its user code (POST /api/agent-connections/lookup).
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agent-connections/pending'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The pending requests, newest first, at most 100. | object (application/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) |
Lookup Dashboard Agent Connection
Resolves the user code of a pending device sign-in (`screenrig login`), as typed or prefilled on the connect page, to its connection, whose approval view then shows it. Approves nothing. Separators, spaces and case are ignored. An unknown, used or invalid code is agent_connection_invalid; an expired one agent_connection_expired.
Limited to 5 lookups per dashboard session per 10 minutes, 20 per client address per hour and 1200 per hour fleet-wide (rate_limited). A member limited to screens does not connect agents, issue credentials or manage the project's people: outside_screen_scope (ask the project owner).
Request body fields
| Field | Description |
|---|---|
| user_code (required, string) | maxLength: 32 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/agent-connections/lookup'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The connection the code names. | object (application/json) |
| 403 | outside_screen_scope - the caller is limited to screens and the screen, screen folder, selector or audience the request names or reaches is outside them (docs/screen-scope.md). An id outside the scope and an id that does not exist get the same answer; errors[0].screen_scope carries the caller's scope, and the write is refused whole, never narrowed. | 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 Dashboard Agent Connection
Returns safe connection review metadata. Review does not select a project; approval selects one of the person’s memberships.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agent-connections/RESOURCE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Safe connection metadata. | AgentConnection (application/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) |
Approve Dashboard Agent Connection
Approves the connection for the selected project after fresh proof and creates a pending agent. The project must be one of the person’s memberships. Returns safe metadata, never the bearer. A member limited to screens does not connect agents, issue credentials or manage the project's people: outside_screen_scope (ask the project owner).
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request body fields
| Field | Description |
|---|---|
| project_id (required, string) | minLength: 1 |
| proof (optional, DashboardProof) | |
| capabilities (optional, array) | Optional on agent connection and connected-app approval only. Omitted approves the full requested set; a non-empty subset of the connection's capabilities narrows the granted credential; anything else is invalid_request. |
| user_code (optional, string) | Required when approving a device sign-in (flow device): the code the person confirms matches the terminal. A mismatch is agent_connection_code_mismatch; the fifth expires the sign-in (agent_connection_expired). Ignored otherwise. maxLength: 32 |
| access (optional, string) | The access level a device sign-in or a connected app is approved with (Read only, Propose or Manage); omitted keeps the level asked for. Ignored for other connections. A person who cannot approve reviews may not approve Manage (403 approver_required). Allowed: "read", "propose", "manage" |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/agent-connections/RESOURCE_ID/approve'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Pending agent safe metadata. | Agent (application/json) |
| 409 | 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) |
| 403 | outside_screen_scope - the caller is limited to screens and the screen, screen folder, selector or audience the request names or reaches is outside them (docs/screen-scope.md). An id outside the scope and an id that does not exist get the same answer; errors[0].screen_scope carries the caller's scope, and the write is refused whole, never narrowed. | 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) |
Deny Dashboard Agent Connection
Denies the connection for the selected project after fresh proof without creating an agent. The project must be one of the person’s memberships. A member limited to screens does not connect agents, issue credentials or manage the project's people: outside_screen_scope (ask the project owner).
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request body fields
| Field | Description |
|---|---|
| project_id (required, string) | minLength: 1 |
| proof (optional, DashboardProof) | |
| capabilities (optional, array) | Optional on agent connection and connected-app approval only. Omitted approves the full requested set; a non-empty subset of the connection's capabilities narrows the granted credential; anything else is invalid_request. |
| user_code (optional, string) | Required when approving a device sign-in (flow device): the code the person confirms matches the terminal. A mismatch is agent_connection_code_mismatch; the fifth expires the sign-in (agent_connection_expired). Ignored otherwise. maxLength: 32 |
| access (optional, string) | The access level a device sign-in or a connected app is approved with (Read only, Propose or Manage); omitted keeps the level asked for. Ignored for other connections. A person who cannot approve reviews may not approve Manage (403 approver_required). Allowed: "read", "propose", "manage" |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/agent-connections/RESOURCE_ID/deny'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | Connection denied. | no body |
| 403 | outside_screen_scope - the caller is limited to screens and the screen, screen folder, selector or audience the request names or reaches is outside them (docs/screen-scope.md). An id outside the scope and an id that does not exist get the same answer; errors[0].screen_scope carries the caller's scope, and the write is refused whole, never narrowed. | 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 Dashboard Boot
One request for the dashboard shell.
Each member is the body the named route answers for this same session (GET /api/me/email, /api/support/status, /api/projects, /api/organizations, /api/project, /api/project/capabilities, /api/advertising/network, /api/alerts?state=open&limit=1 and /api/reviews?state=all&limit=1), produced by that route's own handler under its own authorization, plan and scope checks.
A member is absent when its route would not answer 2xx for this session (a refusal, a role or plan that cannot read it, no current project, a fault), and the dashboard then reads that route itself. advertising_network is null when its route would answer 404 not_found because the project has no network.
A session with no current project gets the members that need none.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/dashboard/boot'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The dashboard shell's reads. | DashboardBoot (application/json); headers: Cache-Control |
| 401 | 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) |
| 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 Dashboard Summary
Project network-status counters for the session's project. Screen online counts are derived from live paired runtime event streams, the same derivation Screen.online publishes; they are not a stored boolean and not a player heartbeat. Media bytes are the durable bytes of ready media only.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/summary'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Project summary counters. | DashboardSummary (application/json); headers: Cache-Control |
| 401 | 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) |
| 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 Dashboard Payout Status
Truthful payout capability state. rails_available is false and unavailable_reason is financial_rails_unavailable while card, tax and cash-out rail are unavailable. No raw bank credentials are returned.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/payout-status'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Payout status. | BillingPayoutStatus (application/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 Dashboard Receipt
One finalized receipt/tax document owned by the caller. No receipt exists while money collection is unshipped, so this is not_found rather than a fabricated document.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/receipts/RESOURCE_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 404 | not_found - no receipt exists. | 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 Dashboard Balance
Returns the session project's public whole-credit balance. This cookie-authenticated read never debits, so it remains available at zero. The cookie-only dashboard never presents a project bearer to GET /api/project.
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/balance'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Public whole-credit balance. | DashboardBalance (application/json); headers: Cache-Control |
| 401 | 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) |
| 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 Dashboard Application Preview Launch
Mints one single-use thirty-second launch ticket for the latest ready release of an application the session's project owns, on that release's own exact preview host, never the release host Players frame, so a Player and the dashboard in one browser never share that host's cached documents or grant cookie.
The ticket converts to the release-grant cookie on that host only, so the preview is cross-origin by construction and web application code can never read a dashboard cookie. The response release_id identifies the exact release selected for this launch, even if another publish completes later. Assign launch_url to iframe.src and to nothing else.
Authority here is owner authority: the session's project owns the application. That is a deliberate second authority source alongside exact-current-manifest authority for screenrig.webapp-package/v1, and it is scoped to this operation. Do not generalize it to media or to protected runtime content.
There is no parent player, so the browser SDK and the key-value bridge fail closed and the preview is presentation-only. An application with no ready release is resource_conflict.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/applications/RESOURCE_ID/preview-launches'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Single-use 30-second exact-release-host preview launch. | DashboardApplicationPreviewLaunch (application/json); headers: Cache-Control, Referrer-Policy, RateLimit-Policy, RateLimit |
| 401 | 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) |
| 404 | 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) |
| 409 | 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) |
| 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 Dashboard Organization
One organization as an item of GET /api/organizations shows it to the caller, with admin, home and reseller. A signed-in person reads it when they administer it, administer the reseller it is delegated to, are staff, or would see it in that listing (a member of one of its live projects, or it is their home organization).
Anyone else, and an organization that does not exist, gets 404 not_found. Grants no project membership. Cookie sessions only; an agent credential is refused.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://api.screenrig.ai/api/organizations/ORG_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization result. | OrganizationView (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) |
Dashboard Organizations Projects
Organization admins read project names, owners, status and screen counts only; this grants no project access. An admin reads a project's content only after joining it (POST .../projects/{project_id}/access), and manages its people with the owner and members routes below.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| cursor | query | optional | |
| limit | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/projects'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization result. | OrganizationProjectPage (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) |
List Dashboard Resellers
The live resellers whose organization the signed-in person administers (admin_user_ids), ordered by name; empty for everyone else. Cookie sessions only. A reseller is an organization staff made a reseller or one of its admins enrolled (POST /api/resellers); its admins run its customers' organizations (docs/resellers.md).
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The caller's resellers. | ResellerList (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) |
Enroll Reseller
An admin of an organization makes it a reseller at once. The caller must be a signed-in person with a verified email address (cookie sessions only; agents and service clients never hold reseller authority) and an admin of the organization named by organization_id; anyone else gets 404 not_found.
The reseller starts at 2000 basis points of list price (20%) effective now and is pending review, boarding up to 10 current customers (customer_limit) until screenRIG reviews it. The organization must be live, not already a reseller, not a customer of a reseller and not on the staff or promo plan (409 reseller_conflict, the detail names the reason).
Appends reseller.enrolled to the organization audit.
Request body fields
| Field | Description |
|---|---|
| organization_id (required, string) | The organization to make a reseller; the caller must be one of its admins. minLength: 1 maxLength: 200 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/resellers'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | The new reseller, as GET /api/resellers/{reseller_id} reads it. | Reseller (application/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 Dashboard Reseller
One reseller the caller administers, with its spread. Anyone else gets 404 not_found.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The reseller. | Reseller (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) |
List Dashboard Reseller Customers
The reseller's current customers (organizations delegated to it), ordered by name, with plan, counts and stored bytes. Reseller admins only; anyone else gets 404 not_found.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required | |
| cursor | query | optional | |
| limit | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | One page of customers. | ResellerCustomerPage (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 Dashboard Reseller Customer
Creates a customer organization delegated to the reseller from its creation, on Standard, with the calling reseller admin as its one admin. The caller's home organization does not change. The organization's own admins may later end the delegation (DELETE /api/organizations/{org_id}/reseller).
Appends organization.created and reseller.customer_started to the organization audit. A reseller awaiting review (review_state pending) boards up to customer_limit current customers; past it the answer is 409 reseller_conflict.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required |
Request body fields
| Field | Description |
|---|---|
| name (required, ProjectName) | Trimmed printable project name. Rejects controls, URL-looking text, @, www., and ://. minLength: 1 maxLength: 60 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/resellers/RESELLER_ID/customers'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | The new customer. | ResellerCustomer (application/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 Dashboard Reseller Customer
One current customer of the reseller. Reseller admins only; an organization that is not a current customer answers 404 not_found.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required | |
| org_id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers/ORG_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The customer. | ResellerCustomer (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) |
Set Dashboard Reseller Customer Plan
Sets a current customer's plan, which the reseller pays for. standard removes the plan; plus and premium are always allowed, education only for an education-eligible organization. Enterprise, staff and promo are staff-assigned.
An upgrade applies at once, a downgrade or removal at the next UTC month boundary, as organization plan changes do (docs/billing-rollup.md). Appends reseller.customer_plan to the organization audit.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required | |
| org_id | path | required |
Request body fields
| Field | Description |
|---|---|
| plan_id (required, string) | Allowed: "standard", "plus", "education", "premium" |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/resellers/RESELLER_ID/customers/ORG_ID/plan'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The customer with its plan as now stored. | ResellerCustomer (application/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 Dashboard Reseller Customer Projects
A current customer's live projects with names, status, screen counts and whether the caller is already a member. Listing grants no project access; POST .../access joins one.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required | |
| org_id | path | required | |
| cursor | query | optional | |
| limit | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers/ORG_ID/projects'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | One page of projects. | ResellerCustomerProjectPage (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) |
Join Dashboard Reseller Customer Project
Makes the calling reseller admin a full member of a current customer's project (can_approve, no scopes, source reseller_admin), as an organization admin's join does, so they can open it with PUT /api/session/project. Already a member answers the project unchanged.
Appends member.added_by_reseller to the project and reseller.project_joined to the organization audit, and emails the project owner. The membership stays until removed; ending the delegation does not remove it.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required | |
| org_id | path | required | |
| project_id | path | required |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers/ORG_ID/projects/PROJECT_ID/access'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The project the caller can now open. | DashboardProjectReference (application/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 Dashboard Reseller Statement
What the reseller owes for one UTC month. One line per customer delegated at any time in the month, with the part of its usage charges in the delegated part of the month that its own credit did not cover (at list price and at the reseller's price), and its plan's annual price.
The reseller's price is list less the spread in force at the later of the month's start and the reseller's (re)creation. Reseller admins only.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| reseller_id | path | required | |
| period | query | optional | The UTC month, YYYY-MM. Omitted is the current month. |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/statement'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The statement. | ResellerStatement (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) |
End Dashboard Organization Reseller
An admin of the organization ends its delegation to its reseller at once. From then the organization pays for itself; its plan, projects and members stay as they are, including memberships reseller admins hold. The overage its wallet accrued while delegated, which the reseller is billed for, is written off in the same change.
Appends reseller.customer_ended to the organization audit. An organization with no reseller answers 404 not_found.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/reseller'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The organization, now without a reseller. | OrganizationView (application/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) |
Dashboard Organizations Discovery
Projects elsewhere whose owners have a verified email on the exact verified domain. Contact addresses and subdomains do not match, and admins cannot pull projects in.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| cursor | query | optional | |
| limit | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/discovery'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization result. | OrganizationProjectPage (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) |
Dashboard Organizations Start Domain
Open a 7-day DNS TXT challenge for one domain, replacing that domain's pending challenge; the organization's other domains are unchanged. Put its exact value at its returned DNS name and keep it there. An organization holds at most 20 domains, verified and pending together (resource_conflict). A domain another organization holds is resource_conflict.
A domain this organization already holds may be proved again, which records the new value for the daily DNS check.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request body fields
| Field | Description |
|---|---|
| domain (required, string) | Exact DNS domain; no wildcard, URL or IP address. minLength: 3 maxLength: 253 |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/domain-challenges'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | Organization result. | OrganizationDomainChallenge (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) |
Dashboard Organizations Verify Domain
Verify one unexpired challenge against DNS and add its domain to the organization, beside the domains it already holds. Each exact domain belongs to one organization. A proof rotated during lookup is refused. Keep the TXT record in place; a daily check removes a domain whose record stays missing for seven days.
Once the claim commits, and in the background after this response, each project whose owner is a verified person at exactly the domain and which sits alone in that owner's personal organization is moved into this organization (renamed "<name> (<owner>)" on a name conflict).
Projects in any other organization, projects holding a customer-paid plan of their own, and projects their owner or staff moved out of a domain organization stay where they are; a project the organization's limits refuse is retried a day later. Placement grants no access.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request body fields
| Field | Description |
|---|---|
| challenge_id (required, string) |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/domain-verification'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization result. | VerifiedOrganizationDomain (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) |
Dashboard Organizations Admins
A designated admin reads the organization's admins, the candidates who may become one (verified, active owners of its live projects who are not admins yet) and the organization revision. Anyone else is refused as on the other organization admin routes. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/admins'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization admins. | OrganizationAdmins (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) |
Dashboard Organizations Set Admins
A designated admin replaces the organization's admins. If-Match carries the organization revision; a stale one is revision_conflict with current_revision. The set names 1 to 20 people, each a current admin or a candidate, otherwise invalid_request; an admin removes themselves only while another admin remains.
The change increments the revision, is recorded in the organization audit, grants no project membership, and returns the same shape as GET. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| If-Match | header | required | The organization revision from GET, optionally quoted. |
Request body fields
| Field | Description |
|---|---|
| admin_user_ids (required, array) |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'If-Match: "REVISION"' --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/admins'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization admins after the change. | OrganizationAdmins (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) |
Dashboard Organizations People
A designated admin reads the organization's people. Read-only. projects lists the organization's live projects, ordered by name, at most 500. people is the union of the organization's home members (member true), the active memberships of those projects (suspended memberships are left out) and the designated admins.
It is ordered admins first, then home members, then external people (those who are not home members), each group by display name then email.
Each person carries their role in each project (owner or member), whether they can approve reviews there (can_approve) and whether they are limited to screens or uploads (limited), whether they are an admin, a home member (member), managed by the organization (managed), and, for an external person, whether the current guest policy would not admit them (outside_guest_policy).
An admin or home member in no project appears with an empty projects list. email is empty for a person whose address is not verified. Deactivated people and agents never appear. At most 500 people are returned, admins always among them; truncated is true when people, projects or memberships were left out.
Anyone else is refused as on the other organization admin routes. People only; agents and bearer credentials have no route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/people'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization people. | OrganizationPeople (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) |
Dashboard Organizations List Admin Invitations
A designated admin lists the organization's admin invitations by id, 50 at a time, after expiring those whose time has passed. Recipient addresses are visible to the organization's admins, who supplied them. Tokens and credential URLs are never listed. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| status | query | optional | |
| cursor | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/admin-invitations'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The organization's admin invitations. | OrganizationAdminInvitationList (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) |
Dashboard Organizations Create Admin Invitations
A designated admin invites people by email to become admins. Accepting adds the person to the organization's admins and creates their login if they have none; it grants no project membership. At most 20 admins counting pending admin invitations (organization_admin_limit); an address whose person already administers the organization is invalid_request.
Email invitations expire after seven days; an outstanding invitation to the same address is reused. The organization and inviter names must be fit for email. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| Idempotency-Key | header | required |
Request body fields
| Field | Description |
|---|---|
| emails (required, array) |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Idempotency-Key: REQUEST_ID' --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/admin-invitations'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | The organization admin invitations, one per distinct address. | OrganizationAdminInvitationCreated (application/json); headers: Cache-Control, 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) |
| 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 |
Dashboard Organizations Revoke Admin Invitation
A designated admin revokes an outstanding admin invitation and frees its admin slot. An already revoked invitation returns 204; an accepted one returns invitation_consumed; an id the organization does not hold is not_found. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| invitation_id | path | required |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/admin-invitations/INVITATION_ID/revoke'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The invitation is revoked. | no body |
| 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) |
Dashboard Organizations List Member Invitations
A designated admin lists the organization's member invitations by id, 50 at a time, after expiring those whose time has passed. Recipient addresses are visible to the organization's admins, who supplied them. Tokens and credential URLs are never listed. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| status | query | optional | |
| cursor | query | optional |
Request template and responses
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/member-invitations'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The organization's member invitations. | OrganizationMemberInvitationList (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) |
Dashboard Organizations Create Member Invitations
A designated admin invites people by email to join the organization as members. Accepting sets the person's home organization to this one, from any previous home, and creates their login if they have none; it grants no project membership.
An address whose person is already a home member of the organization is invalid_request; one whose person another organization manages is managed_elsewhere. Email invitations expire after seven days; an outstanding invitation to the same address is reused. The organization and inviter names must be fit for email.
Accepting an invitation to the staff organization (plan_id staff) also makes the person staff, so only staff send those, one address per request with a staff_grant proof bound to it (reauthentication_required without one). People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| Idempotency-Key | header | required |
Request body fields
| Field | Description |
|---|---|
| emails (required, array) | |
| proof (optional, DashboardProof) |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Idempotency-Key: REQUEST_ID' --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/member-invitations'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 201 | The organization member invitations, one per distinct address. | OrganizationMemberInvitationCreated (application/json); headers: Cache-Control, 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) |
| 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 |
Dashboard Organizations Revoke Member Invitation
A designated admin revokes an outstanding member invitation. An already revoked invitation returns 204; an accepted one returns invitation_consumed; an id the organization does not hold is not_found. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| invitation_id | path | required |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/member-invitations/INVITATION_ID/revoke'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The invitation is revoked. | no body |
| 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) |
Dashboard Organizations Remove Member
A designated admin removes a home member from the organization.
In one transaction the person's home organization is cleared and their memberships in all of the organization's live projects end, each as removing them from that project would (outstanding email invitations to it are revoked and their sessions stop resolving it); memberships in other organizations' projects are untouched, and no other organization changes.
The change is recorded in the organization audit.
A person an identity provider manages (single sign-on or SCIM) is managed_member; a designated admin is organization_admin_member (remove the admin seat first with PUT /api/organizations/{org_id}/admins); a person who owns any live project of the organization is member_owns_projects and the detail lists the project names (transfer those projects first, nothing is removed); a person who is not a home member of the organization, including one already removed, is not_found.
People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| user_id | path | required |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/members/USER_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The person is no longer a member of the organization. | no body |
| 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) |
Dashboard Organizations Set Guest Policy
A designated admin sets whom the organization admits to its projects as guests, meaning people whose home organization is another one or who have none. mode allow (the default) admits every guest, domains admits a guest whose verified email address is at one of domains, and none admits no guest. domains lists 1 to 20 distinct lowercase DNS names, required for mode domains and omitted otherwise; anything else is invalid_request.
The policy replaces the previous one, increments the organization revision, is recorded in the organization audit, and answers the policy in force. It is checked when the organization grants a guest a project membership, by project member invitation (create and accept) and by SCIM group binding, and refuses with guest_not_allowed.
Staff and the organization's own admins are exempt, agents are not checked, and home members are never guests. Tightening the policy removes nobody; outside_policy counts the external people already in the organization's live projects whom the new policy would not admit, and GET /api/organizations/{org_id}/people flags each of them (outside_guest_policy).
People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request body fields
| Field | Description |
|---|---|
| mode (required, OrganizationGuestPolicyMode) | allow admits every guest. domains admits a guest whose verified email address is at one of the listed domains (exact match). none admits no guest. Home members are never guests. Allowed: "allow", "domains", "none" |
| domains (optional, array) | Required for mode domains (1 to 20 domains, duplicates refused), and omitted for allow and none; either way a wrong shape is invalid_request. |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/guest-policy'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The guest policy now in force. | OrganizationGuestPolicyResult (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) |
Dashboard Organizations Set Library
A designated admin sets or clears the organization's Library project. project_id names one of the organization's live projects, or null clears it.
Every other project of the organization then reads the Library's media, media folders and playlists (library=true on GET /api/media, /api/media-folders and /api/playlists, and by id) and uses them read-only - page media references, by:folder selectors that name a Library folder (tag and all selectors never reach the Library), screen schedules and stacks, and from_template - while only the Library's own members change them.
The Library project holds no screens - a project with screens is library_no_screens, and the Library admits none afterwards. Setting a Library needs the library plan feature (Premium, Education, Enterprise; feature_not_in_plan otherwise); clearing one never does, and a Library kept after a downgrade keeps serving.
Clearing or replacing the Library leaves member playlists naming its items unresolvable at their next write, and screens stop receiving its media. A project that is the Library and is deleted or moved out of the organization clears it.
Answers the organization view, is recorded in the organization audit (organization.library_changed) and increments the revision. People only.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request body fields
| Field | Description |
|---|---|
| project_id (required, inline) | The organization's project to make its Library, or null to clear the Library. |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/library'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The organization with its Library now in force. | OrganizationView (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) |
Dashboard Organizations Set Project Access
A designated admin sets the access of many people to many of the organization's live projects in one request, without joining any of them.
Each of 1 to 500 changes names a project, a person and an access, with no (project_id, user_id) pair twice. member makes the person a member of the project who cannot approve reviews (added when they are not one; an approver loses approval), approver a member who can approve (added when they are not one), and none no member (removed when they are one).
Everything is applied in order in one transaction, and one refusal undoes the whole batch; each refusal blames changes[i] (the project or the person) or changes[i].access in errors[].field.
A project that is not a live project of this organization is not_found; a person who is not a live person (an agent, a deactivated person, an unknown id) or who is staff, a suspended membership, and a person added who is not one of the organization's people (its admins, its home members and the active members of its other live projects; anyone else joins through an invitation) are invalid_request; the owner is never set to member or none (owner_cannot_leave); an uploader never approves (resource_conflict, as PUT /api/members/{user_id}/approver answers); removing the admin themself is forbidden (an admin leaves through DELETE /api/members/{user_id}); and a person who is added is admitted as an invitation admits them, so home members and the organization's admins always and an external person only where the guest policy admits them now (guest_not_allowed).
The project's 200-member limit and its plan's member cap apply to what is added (member_limit_reached). The answer repeats every change in request order; changed is false for one whose access was already in effect, which writes and records nothing.
Each change is recorded in the organization audit (organization.project_member_added, organization.project_member_approver_changed or organization.project_member_removed) and in the project's events (member.added_by_organization_admin, project.member_approver_changed or member.removed, marked as the organization admin's), and each project's owner is emailed once for the batch unless they made it.
People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required |
Request body fields
| Field | Description |
|---|---|
| changes (required, array) | The changes, applied in order; no (project_id, user_id) pair appears twice. |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/project-access'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The changes as applied, in request order. | OrganizationProjectAccessResult (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) |
Dashboard Organizations Join Project
A designated admin joins one of the organization's live projects as a member without a screen or upload scope who can approve reviews. Joining is what gives the admin the project's content, which the organization routes never show.
An admin who is already a member without a scope who can approve gets 200 with joined false and nothing changes; a member with a screen or upload scope, or one who cannot approve, becomes a member without a scope who can approve, recorded as a join.
The project's 200-member limit applies (member_limit_reached); the organization's guest policy never applies to its own admins. Joining is recorded in the organization audit as organization.project_joined and in the project's events as member.added_by_organization_admin, and the project's owner is emailed.
A project the organization does not hold, or that was deleted, is not_found. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| project_id | path | required |
Request template and responses
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/projects/PROJECT_ID/access'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The admin is a member of the project. | OrganizationProjectAccess (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) |
Dashboard Organizations Set Project Owner
A designated admin makes a person the owner of one of the organization's live projects without joining it, from whoever owns it now, including an owner whose account is deactivated.
The new owner is a verified, active person who is a member of the project or a home member of the organization (a home member who is not a member of the project is added first as a member without a screen or upload scope who can approve reviews; the guest policy does not apply to a home member); anyone else is invalid_request at user_id.
An admin makes themself the owner only after joining the project (POST /api/organizations/{org_id}/projects/{project_id}/access), and one who is not a member without a screen or upload scope who can approve is invalid_request at user_id.
The effect is that of the owner's own transfer, so the new owner's screen scope and upload scope are cleared and the project's legacy responsibilities are bound to them. Naming the current owner changes nothing. The change is recorded in the organization audit as organization.project_owner_changed, and the previous and the new owner are emailed.
The project's 200-member limit applies to an added home member (member_limit_reached). A project the organization does not hold, or that was deleted, is not_found. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| project_id | path | required |
Request body fields
| Field | Description |
|---|---|
| user_id (required, string) | The new owner. A verified, active person who is a member of the project or a home member of the organization. minLength: 1 maxLength: 200 |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/organizations/ORG_ID/projects/PROJECT_ID/owner'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The project's owner after the change. | OrganizationProjectOwner (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) |
Dashboard Organizations Remove Project Member
A designated admin removes a member from one of the organization's live projects without joining it. It has the effect of the owner's removal (DELETE /api/members/{user_id}). The membership ends, the person's outstanding email invitations to the project are revoked, their sessions stop resolving the project, and agent memberships stay.
The owner is never removed (owner_cannot_leave; transfer ownership first with PUT /api/organizations/{org_id}/projects/{project_id}/owner). A person who is not a member of the project, including one already removed, and a project the organization does not hold or that was deleted, are not_found.
The removal is recorded in the organization audit as organization.project_member_removed and in the project's events as member.removed with removed_by_organization_admin true. People only; agents and bearer credentials have no admin route.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| project_id | path | required | |
| user_id | path | required |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/projects/PROJECT_ID/members/USER_ID'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 204 | The membership ended. | no body |
| 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) |
Dashboard Organizations Remove One Domain
Remove one domain, verified or pending, and leave the organization's other domains. Future placement and discovery for it stop, and another organization may verify it. Projects already in the organization stay. A domain the organization neither holds nor is proving is not_found.
While the organization requires single sign-on, a verified domain is resource_conflict; turning off Require single sign-on takes effect after 72 hours, and the domain can be removed then.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| org_id | path | required | |
| domain | path | required |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/domains/DOMAIN'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | Organization result. | OrganizationDomainRemoved (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) |
Set Dashboard Member Approver
Sets whether a member can approve: decide reviews and grant agents Manage access. A member who cannot approve has their agents held to Propose. The project owner, or a member who administers the project's organization (forbidden otherwise); the owner's own row is fixed (resource_conflict); a non-member is not_found.
Appends project.member_approver_changed (details user_id, can_approve).
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required |
Request body fields
| Field | Description |
|---|---|
| can_approve (required, boolean) | |
| project_id (optional, string) | The project the caller means; a session whose selection has changed is refused with resource_conflict. minLength: 1 maxLength: 200 |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/members/USER_ID/approver'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The member. | DashboardMember (application/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) |
Set Dashboard Member Screen Scope
Limits a member to screen folders (each with every folder inside it) and screens, or replaces the scope of one (docs/screen-scope.md).
In one transaction it also ends the agents the person brought to the project (agent.disconnected, as removing them would) and appends project.member_screen_scope_changed (details user_id, screen_scope, previous, changed_by_user_id). The scope is read on the member's next request: the change shows on their next GET /api/session without signing in again.
The project owner, or a member who administers the project's organization (forbidden otherwise); the owner's own row, an uploader (a scoped member is limited to screens, an uploader to content) and a member who approves reviews with single screens in the scope are resource_conflict; a non-member is not_found; an id that is not a live screen folder or screen of the project is invalid_request at screen_scope.folder_ids[i] or screen_scope.screen_ids[i].
A scoped member who approves reviews approves only inside the scope; one who cannot approve reads and runs commands but changes what plays only through approvers (approver_required).
A scope is also refused with resource_conflict while the person, or an agent the person brought, has a live service client of the project: the detail names up to five clients as ID (name) and counts the rest, and nothing is written.
Limiting a person to screens is screen scope, which the Enterprise plan includes; a project whose plan lacks it is refused with feature_not_in_plan (402). A scope that is set keeps limiting the person until it is cleared (DELETE), which every plan may do.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required |
Request body fields
| Field | Description |
|---|---|
| screen_scope (required, ScreenScope) | What a scoped member or agent may act on (docs/screen-scope.md): the screens in the listed screen folders and in every folder inside them, and the listed screens. At least one id in all. An id that names no live folder or screen of the project when written is invalid_request at its position; a later deletion leaves a dead id, which grants nothing. The scope is read on each request, so a change applies to the next one. Tags are never scope. |
| project_id (optional, string) | As on MemberApproverUpdate. minLength: 1 maxLength: 200 |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/members/USER_ID/screen-scope'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The member, with screen_scope. | DashboardMember (application/json) |
| 402 | feature_not_in_plan — Screen scope is part of the Enterprise plan; the problem names the feature, the plan the account is on and required_plan. | Problem (application/problem+json) |
| 403 | forbidden - only the project owner or a member who administers the project's organization sets a scope, and outside_screen_scope for a member limited to screens; ask the project owner. | Problem (application/problem+json) |
| 409 | resource_conflict - the owner's row, an uploader, an approver with single screens in the scope, or a live service client of the person or of an agent they brought; revoke each named client with screenrig service-client revoke ID and set the scope again. | 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) |
Clear Dashboard Member Screen Scope
Gives a scoped member the whole project's screens again. The project owner, or a member who administers the project's organization, only; a member who is not scoped is left as they are. Appends project.member_screen_scope_changed with screen_scope null.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required | |
| project_id | query | optional | The project the caller means; a session whose selection has changed is refused with resource_conflict. |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID/screen-scope'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The member. | DashboardMember (application/json) |
| 403 | forbidden - only the project owner or a member who administers the project's organization sets a scope, and outside_screen_scope for a member limited to screens; ask the project owner. | 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) |
Set Dashboard Agent Screen Scope
Limits an agent's membership of the session project to screen folders and screens, or replaces its scope (docs/screen-scope.md). The agent's reach is this scope narrowed by its responsible person's, so a scoped person never acts through an agent wider than themselves.
The project owner, or a member who administers the project's organization (forbidden otherwise); an agent that is not a member of the project is not_found. Appends agent.screen_scope_changed (details agent_id, screen_scope, previous, changed_by_user_id).
An agent's scope applies to its next request on the instance that wrote it and within two seconds on the others. A scope is refused with resource_conflict while the agent has a live service client of the project: the detail names up to five clients as ID (name) and counts the rest, and nothing is written.
Limiting an agent to screens is screen scope, which the Enterprise plan includes; a project whose plan lacks it is refused with feature_not_in_plan (402). A scope that is set keeps limiting the agent until it is cleared (DELETE), which every plan may do.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request body fields
| Field | Description |
|---|---|
| screen_scope (required, ScreenScope) | What a scoped member or agent may act on (docs/screen-scope.md): the screens in the listed screen folders and in every folder inside them, and the listed screens. At least one id in all. An id that names no live folder or screen of the project when written is invalid_request at its position; a later deletion leaves a dead id, which grants nothing. The scope is read on each request, so a change applies to the next one. Tags are never scope. |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/agents/RESOURCE_ID/screen-scope'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The agent, with screen_scope. | Agent (application/json) |
| 402 | feature_not_in_plan — Screen scope is part of the Enterprise plan; the problem names the feature, the plan the account is on and required_plan. | Problem (application/problem+json) |
| 403 | forbidden - only the project owner or a member who administers the project's organization sets a scope, and outside_screen_scope for a member limited to screens; ask the project owner. | Problem (application/problem+json) |
| 409 | resource_conflict - the agent has a live service client of the project; revoke each named client with screenrig service-client revoke ID and set the scope again. | 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) |
Clear Dashboard Agent Screen Scope
Removes the scope of an agent's membership of the session project. The project owner, or a member who administers the project's organization, only. Appends agent.screen_scope_changed with screen_scope null.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| id | path | required |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/screen-scope'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The agent. | Agent (application/json) |
| 403 | forbidden - only the project owner or a member who administers the project's organization sets a scope, and outside_screen_scope for a member limited to screens; ask the project owner. | 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) |
Set Dashboard Member Upload Scope
Makes a member an uploader, or replaces the scope of one (docs/uploaders.md): the playlists they change pages of and the media folders they upload into.
In one transaction it also stops them approving reviews, ends the agents they brought to the project (agent.disconnected, as removing them would) and appends project.member_upload_scope_changed (details user_id, upload_scope, changed_by_user_id).
The scope is read on the member's next request: the change shows on their next GET /api/session without signing in again.
The project owner, or a member who administers the project's organization (forbidden otherwise); the owner's own row is resource_conflict; a non-member is not_found; an id that is not a live playlist or media folder of the project is invalid_request at upload_scope.playlist_ids[i] or upload_scope.folder_ids[i]. access propose (the default) sends the uploader's changes to review; manage publishes them.
A member limited to screens is resource_conflict: clear that scope first (DELETE /api/members/{user_id}/screen-scope).
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required |
Request body fields
| Field | Description |
|---|---|
| upload_scope (required, UploadScope) | What an uploader may use (docs/uploaders.md): the playlists it changes pages of and the media folders it uploads into. Folders are exactly the listed ones, never their subfolders. An id that names no live object of the project when written is invalid_request at its position; a later deletion leaves a dead id, which grants nothing. The scope is read on each request, so a change applies to the next one. |
| project_id (optional, string) | As on MemberApproverUpdate. minLength: 1 maxLength: 200 |
Request template and responses
curl --request PUT --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/members/USER_ID/upload-scope'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The member, with upload_scope. | DashboardMember (application/json) |
| 402 | feature_not_in_plan — an upload scope makes an uploader, and the project's plan does not include uploaders; required_plan names the plan that does. Narrowing a scope and removing it are always allowed. | 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) |
Clear Dashboard Member Upload Scope
Makes an uploader a full member again, who does not approve reviews (turn that on with setDashboardMemberApprover). The project owner, or a member who administers the project's organization, only; a member who is not an uploader is left as they are. Appends project.member_upload_scope_changed with upload_scope null.
Parameters
| Name | Send in | Required? | Description |
|---|---|---|---|
| user_id | path | required | |
| project_id | query | optional | The project the caller means; a session whose selection has changed is refused with resource_conflict. |
Request template and responses
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID/upload-scope'Responses
| Status | Meaning | Body and headers |
|---|---|---|
| 200 | The member. | DashboardMember (application/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) |