API reference

Dashboard API

People and project dashboard

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

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

POST/api/invitations/inspect

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.

Authentication
none
Request body
InvitationInspectRequest
Operation ID
inspectDashboardInvitation

Request body fields

FieldDescription
token (required, string)pattern: "^[A-Za-z0-9_-]{43}$"
Request template and responses
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/invitations/inspect'

Responses

StatusMeaningBody and headers
200Inspects 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
POST/api/invitations/passkey-options

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.

Authentication
none OR invitationSignup
Request body
InvitationPasskeyOptionsRequest
Operation ID
startDashboardInvitationPasskey

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
201Starts 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
POST/api/invitations/email-verifications

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.

Authentication
none
Request body
InvitationEmailVerificationRequest
Operation ID
verifyDashboardInvitationEmail

Request body fields

FieldDescription
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
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/invitations/email-verifications'

Responses

StatusMeaningBody and headers
202Starts 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/api/invitations/signup

Get Dashboard Invitation Signup

Returns the live signup belonging to this browser. A missing, revoked, consumed, or expired signup cookie returns invitation_invalid.

Authentication
invitationSignup
Request body
none
Operation ID
getDashboardInvitationSignup
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/invitations/signup'

Responses

StatusMeaningBody and headers
200Returns 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)
POST/api/invitations/accept

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.

Authentication
none OR invitationSignup OR dashboardSession
Request body
InvitationAcceptRequest
Operation ID
acceptDashboardInvitation

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200Accepts 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
POST/api/signups/passkey-options

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.

Authentication
none
Request body
SignupPasskeyOptionsRequest
Operation ID
startDashboardSignupPasskey

Request body fields

FieldDescription
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
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/signups/passkey-options'

Responses

StatusMeaningBody and headers
201Starts 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)
POST/api/signups

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.

Authentication
none
Request body
SignupRequest
Operation ID
createDashboardSignup

Request body fields

FieldDescription
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
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/signups'

Responses

StatusMeaningBody and headers
201The 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)
PUT/api/session/project

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.

Authentication
dashboardSession
Request body
DashboardProjectSwitch
Operation ID
switchDashboardProject

Request body fields

FieldDescription
project_id (required, string)minLength: 1
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200Switches 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)
GET/api/members

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardMembers
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members'

Responses

StatusMeaningBody and headers
200Lists 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)
DELETE/api/members/{user_id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
removeDashboardMember

Parameters

NameSend inRequired?Description
user_idpathrequired
project_idqueryrequiredThe project the caller means; a session whose selection has changed is refused with resource_conflict.
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID?project_id=PROJECT_ID'

Responses

StatusMeaningBody and headers
204The 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)
GET/api/members/{user_id}/activity

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.

Authentication
dashboardSession
Request body
none
Operation ID
listMemberActivity

Parameters

NameSend inRequired?Description
user_idpathrequired
afterqueryoptionalCursor from a previous page's next_cursor.
limitqueryoptional
kindqueryoptionalOnly these kinds; repeat the parameter or separate kinds with commas.
outcomequeryoptional
resource_typequeryoptionalExact kind of object the request acted on.
resource_idqueryoptionalExact identifier of the object the request acted on.
sincequeryoptional
untilqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID/activity'

Responses

StatusMeaningBody and headers
200The 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/api/me

Get Dashboard Me

Returns the signed-in person’s profile and credential counts.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardMe
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me'

Responses

StatusMeaningBody and headers
200Returns 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/api/me

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.

Authentication
dashboardSession
Request body
DashboardProofRequest
Operation ID
deleteDashboardMe

Request body fields

FieldDescription
proof (required, DashboardProof)
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/me'

Responses

StatusMeaningBody and headers
204Person 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)
POST/api/me/reauthentications

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.

Authentication
dashboardSession
Request body
DashboardReauthenticationRequest
Operation ID
startDashboardReauthentication

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
201Starts 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)
PUT/api/me/password

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.

Authentication
dashboardSession
Request body
DashboardPasswordSet
Operation ID
setDashboardPassword

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
204Sets 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)
GET/api/me/passkeys

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardPasskeys
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me/passkeys'

Responses

StatusMeaningBody and headers
200Lists 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)
POST/api/me/passkeys/options

Start Dashboard Passkey Registration

Verifies fresh proof and starts a registration bound to the session and person. Passkeys are disabled under development auth.

Authentication
dashboardSession
Request body
DashboardProofRequest
Operation ID
startDashboardPasskeyRegistration

Request body fields

FieldDescription
proof (required, DashboardProof)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
201Verifies 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)
POST/api/me/passkeys/complete

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.

Authentication
dashboardSession
Request body
DashboardPasskeyComplete
Operation ID
completeDashboardPasskeyRegistration

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
201Stores 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)
PATCH/api/me/passkeys/{id}

Rename Dashboard Passkey

Renames a passkey owned by the signed-in person.

Authentication
dashboardSession
Request body
DashboardPasskeyPatch
Operation ID
renameDashboardPasskey

Parameters

NameSend inRequired?Description
idpathrequired

Request body fields

FieldDescription
name (required, string)minLength: 1 maxLength: 60
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200Renames 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/api/me/passkeys/{id}

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.

Authentication
dashboardSession
Request body
DashboardProofRequest
Operation ID
deleteDashboardPasskey

Parameters

NameSend inRequired?Description
idpathrequired

Request body fields

FieldDescription
proof (required, DashboardProof)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
204Deletes 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/api/me/email

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).

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardEmail
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me/email'

Responses

StatusMeaningBody and headers
200Returns 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)
POST/api/me/email/change

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.

Authentication
dashboardSession
Request body
UserEmailChangeRequest
Operation ID
changeDashboardEmail

Request body fields

FieldDescription
email (required, string)minLength: 3 maxLength: 254 format: "email"
proof (required, DashboardProof)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
202Requests 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)
POST/api/me/email/verification

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.

Authentication
dashboardSession
Request body
none
Operation ID
requestDashboardEmailVerification
Request template and responses
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/me/email/verification'

Responses

StatusMeaningBody and headers
202The 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/api/me/signup-profile

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.

Authentication
dashboardSession
Request body
SignupProfile
Operation ID
putDashboardSignupProfile

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
204The 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/api/applications/{id}/usage

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardApplicationUsage

Parameters

NameSend inRequired?Description
idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/applications/RESOURCE_ID/usage'

Responses

StatusMeaningBody and headers
200Where 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)
POST/api/advertising/inventory/{screen_id}

Put Dashboard Advertising Inventory

Authentication
dashboardSession
Request body
AdvertisingInventoryWrite
Operation ID
putDashboardAdvertisingInventory

Parameters

NameSend inRequired?Description
ScreenRig-ProjectheaderoptionalDeprecated for one release. Must be consistent with the JWT projects grants; adds Deprecation and Warning headers. No token exchange.
screen_idpathrequired
If-MatchheaderoptionalOptional positive resource revision. Omit to write the current resource; a supplied stale revision is revision_conflict.

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200Stored inventory.AdvertisingInventory (application/json)
403outside_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/api/media/{id}/usage

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardMediaUsage

Parameters

NameSend inRequired?Description
idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/media/RESOURCE_ID/usage'

Responses

StatusMeaningBody and headers
200Where 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/api/media/{id}/thumbnail

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardMediaThumbnail

Parameters

NameSend inRequired?Description
idpathrequired
If-None-MatchheaderoptionalThumbnail ETag returned by this route.
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/media/RESOURCE_ID/thumbnail'

Responses

StatusMeaningBody and headers
200The WebP thumbnail.string (image/webp); headers: Content-Length, Content-Disposition, ETag, Cache-Control, X-Content-Type-Options
304The 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/api/media/{id}/thumbnail

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.

Authentication
dashboardSession
Request body
none
Operation ID
headDashboardMediaThumbnail

Parameters

NameSend inRequired?Description
idpathrequired
If-None-MatchheaderoptionalThumbnail ETag returned by this route.
Request template and responses
shell · request template
curl --request HEAD --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/media/RESOURCE_ID/thumbnail'

Responses

StatusMeaningBody and headers
200Thumbnail metadata with no body.no body; headers: Content-Length, Content-Disposition, ETag, Cache-Control, X-Content-Type-Options
304The 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)
GET/api/email/verify

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.

Authentication
none
Request body
none
Operation ID
peekDashboardEmailVerification

Parameters

NameSend inRequired?Description
tokenqueryrequired
Request template and responses
shell · request template
curl --request GET 'https://screenrig.ai/api/email/verify?token=TOKEN'

Responses

StatusMeaningBody and headers
200Verification 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)
POST/api/email/verify

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.

Authentication
none OR invitationSignup OR dashboardSession
Request body
EmailVerifyRequest
Operation ID
verifyDashboardEmail

Request body fields

FieldDescription
token (required, string)minLength: 1
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200Verification 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)
POST/api/webauthn/assertions

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.

Authentication
none
Request body
none
Operation ID
startDashboardPasskeyAssertion
Request template and responses
shell · request template
curl --request POST 'https://screenrig.ai/api/webauthn/assertions'

Responses

StatusMeaningBody and headers
201WebAuthn 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)
POST/api/webauthn/assertions/complete

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.

Authentication
none
Request body
DashboardPasskeyAssertionComplete
Operation ID
completeDashboardPasskeyAssertion

Request body fields

FieldDescription
ceremony_id (required, string)
credential (required, object)WebAuthn assertion response serialized from the PublicKeyCredential the authenticator returned.
Request template and responses
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/webauthn/assertions/complete'

Responses

StatusMeaningBody and headers
200Session 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)
POST/api/sessions

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.

Authentication
none
Request body
DashboardPasswordLogin
Operation ID
createDashboardSession

Request body fields

FieldDescription
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
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/sessions'

Responses

StatusMeaningBody and headers
200Person 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/api/session

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardSession
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/session'

Responses

StatusMeaningBody and headers
200Current 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)
POST/api/logout

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.

Authentication
dashboardSession
Request body
none
Operation ID
logoutDashboardSession
Request template and responses
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/logout'

Responses

StatusMeaningBody and headers
204Session 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)
POST/api/onboarding/steps

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.

Authentication
none
Request body
OnboardingStepRequest
Operation ID
recordOnboardingStep

Request body fields

FieldDescription
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
shell · request template
curl --request POST --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/onboarding/steps'

Responses

StatusMeaningBody and headers
204The 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)
GET/api/agents

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardAgents
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents'

Responses

StatusMeaningBody and headers
200Project 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)
GET/api/agents/{id}/events

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardAgentEvents

Parameters

NameSend inRequired?Description
idpathrequired
afterqueryoptionalCursor from a previous page's next_cursor.
limitqueryoptional
commandqueryoptionalExact route-derived command name, such as screens.archive.
typequeryoptionalExact event type, such as agent.command or screen.archived.
resource_typequeryoptionalExact kind of object the request acted on.
resource_idqueryoptionalExact identifier of the object the request acted on.
outcomequeryoptionalPresent only on agent.command records; a domain event implies ok.
problem_codequeryoptionalExact stable problem code the server refused with.
sincequeryoptional
untilqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/events'

Responses

StatusMeaningBody and headers
200Agent 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)
POST/api/agents/{id}/disconnect

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).

Authentication
dashboardSession
Request body
DashboardAgentAction
Operation ID
disconnectDashboardAgent

Parameters

NameSend inRequired?Description
idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
204Agent 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)
GET/api/agents/{id}/notes

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardAgentNotes

Parameters

NameSend inRequired?Description
idpathrequired
statequeryoptional
afterqueryoptionalnext_cursor of the previous page.
limitqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/notes'

Responses

StatusMeaningBody and headers
200The 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)
POST/api/agents/{id}/notes/{note_id}/resolve

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.

Authentication
dashboardSession
Request body
NoteResolve
Operation ID
resolveDashboardAgentNote

Parameters

NameSend inRequired?Description
idpathrequired
note_idpathrequiredThe id of one of the agent's notes.
Idempotency-KeyheaderoptionalOmit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically.

Request body fields

FieldDescription
reason (required, string)minLength: 1 maxLength: 500
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200The 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/api/agents/{id}/notes/{note_id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
deleteDashboardAgentNote

Parameters

NameSend inRequired?Description
idpathrequired
note_idpathrequiredThe id of one of the agent's notes.
Idempotency-KeyheaderoptionalOmit for a fresh operation. Supply and reuse a key to deduplicate retries; the CLI manages keys automatically.
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/notes/NOTE_ID'

Responses

StatusMeaningBody and headers
204Deleted.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)
GET/api/agent-connections/pending

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).

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardAgentConnections
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agent-connections/pending'

Responses

StatusMeaningBody and headers
200The 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)
POST/api/agent-connections/lookup

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).

Authentication
dashboardSession
Request body
object
Operation ID
lookupDashboardAgentConnection

Request body fields

FieldDescription
user_code (required, string)maxLength: 32
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200The 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/api/agent-connections/{id}

Get Dashboard Agent Connection

Returns safe connection review metadata. Review does not select a project; approval selects one of the person’s memberships.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardAgentConnection

Parameters

NameSend inRequired?Description
idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agent-connections/RESOURCE_ID'

Responses

StatusMeaningBody and headers
200Safe 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)
POST/api/agent-connections/{id}/approve

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).

Authentication
dashboardSession
Request body
DashboardAgentAction
Operation ID
approveDashboardAgentConnection

Parameters

NameSend inRequired?Description
idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200Pending 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)
POST/api/agent-connections/{id}/deny

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).

Authentication
dashboardSession
Request body
DashboardAgentAction
Operation ID
denyDashboardAgentConnection

Parameters

NameSend inRequired?Description
idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
204Connection 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/api/dashboard/boot

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardBoot
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/dashboard/boot'

Responses

StatusMeaningBody and headers
200The 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/api/summary

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardSummary
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/summary'

Responses

StatusMeaningBody and headers
200Project 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/api/billing/payout-status

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardPayoutStatus
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/payout-status'

Responses

StatusMeaningBody and headers
200Payout 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/api/billing/receipts/{id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardReceipt

Parameters

NameSend inRequired?Description
idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/billing/receipts/RESOURCE_ID'

Responses

StatusMeaningBody and headers
404not_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/api/balance

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardBalance
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/balance'

Responses

StatusMeaningBody and headers
200Public 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)
POST/api/applications/{id}/preview-launches

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.

Authentication
dashboardSession
Request body
none
Operation ID
createDashboardApplicationPreviewLaunch

Parameters

NameSend inRequired?Description
idpathrequired
Request template and responses
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/applications/RESOURCE_ID/preview-launches'

Responses

StatusMeaningBody and headers
201Single-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/api/organizations/{org_id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardOrganization

Parameters

NameSend inRequired?Description
org_idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://api.screenrig.ai/api/organizations/ORG_ID'

Responses

StatusMeaningBody and headers
200Organization 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)
GET/api/organizations/{org_id}/projects

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsProjects

Parameters

NameSend inRequired?Description
org_idpathrequired
cursorqueryoptional
limitqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/projects'

Responses

StatusMeaningBody and headers
200Organization 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)
GET/api/resellers

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).

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardResellers
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers'

Responses

StatusMeaningBody and headers
200The 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)
POST/api/resellers

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.

Authentication
dashboardSession
Request body
ResellerEnrollment
Operation ID
enrollReseller

Request body fields

FieldDescription
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
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt --header 'Content-Type: application/json' --data '@request.json' 'https://screenrig.ai/api/resellers'

Responses

StatusMeaningBody and headers
201The 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/api/resellers/{reseller_id}

Get Dashboard Reseller

One reseller the caller administers, with its spread. Anyone else gets 404 not_found.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardReseller

Parameters

NameSend inRequired?Description
reseller_idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID'

Responses

StatusMeaningBody and headers
200The 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)
GET/api/resellers/{reseller_id}/customers

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardResellerCustomers

Parameters

NameSend inRequired?Description
reseller_idpathrequired
cursorqueryoptional
limitqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers'

Responses

StatusMeaningBody and headers
200One 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)
POST/api/resellers/{reseller_id}/customers

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.

Authentication
dashboardSession
Request body
object
Operation ID
createDashboardResellerCustomer

Parameters

NameSend inRequired?Description
reseller_idpathrequired

Request body fields

FieldDescription
name (required, ProjectName)Trimmed printable project name. Rejects controls, URL-looking text, @, www., and ://. minLength: 1 maxLength: 60
Request template and responses
shell · request template
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

StatusMeaningBody and headers
201The 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/api/resellers/{reseller_id}/customers/{org_id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardResellerCustomer

Parameters

NameSend inRequired?Description
reseller_idpathrequired
org_idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers/ORG_ID'

Responses

StatusMeaningBody and headers
200The 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)
PUT/api/resellers/{reseller_id}/customers/{org_id}/plan

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.

Authentication
dashboardSession
Request body
object
Operation ID
setDashboardResellerCustomerPlan

Parameters

NameSend inRequired?Description
reseller_idpathrequired
org_idpathrequired

Request body fields

FieldDescription
plan_id (required, string)Allowed: "standard", "plus", "education", "premium"
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200The 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)
GET/api/resellers/{reseller_id}/customers/{org_id}/projects

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.

Authentication
dashboardSession
Request body
none
Operation ID
listDashboardResellerCustomerProjects

Parameters

NameSend inRequired?Description
reseller_idpathrequired
org_idpathrequired
cursorqueryoptional
limitqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/customers/ORG_ID/projects'

Responses

StatusMeaningBody and headers
200One 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)
POST/api/resellers/{reseller_id}/customers/{org_id}/projects/{project_id}/access

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.

Authentication
dashboardSession
Request body
none
Operation ID
joinDashboardResellerCustomerProject

Parameters

NameSend inRequired?Description
reseller_idpathrequired
org_idpathrequired
project_idpathrequired
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200The 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/api/resellers/{reseller_id}/statement

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.

Authentication
dashboardSession
Request body
none
Operation ID
getDashboardResellerStatement

Parameters

NameSend inRequired?Description
reseller_idpathrequired
periodqueryoptionalThe UTC month, YYYY-MM. Omitted is the current month.
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/resellers/RESELLER_ID/statement'

Responses

StatusMeaningBody and headers
200The 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)
DELETE/api/organizations/{org_id}/reseller

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.

Authentication
dashboardSession
Request body
none
Operation ID
endDashboardOrganizationReseller

Parameters

NameSend inRequired?Description
org_idpathrequired
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/reseller'

Responses

StatusMeaningBody and headers
200The 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)
GET/api/organizations/{org_id}/discovery

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsDiscovery

Parameters

NameSend inRequired?Description
org_idpathrequired
cursorqueryoptional
limitqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/discovery'

Responses

StatusMeaningBody and headers
200Organization 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)
POST/api/organizations/{org_id}/domain-challenges

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.

Authentication
dashboardSession
Request body
OrganizationDomainInput
Operation ID
dashboardOrganizationsStartDomain

Parameters

NameSend inRequired?Description
org_idpathrequired

Request body fields

FieldDescription
domain (required, string)Exact DNS domain; no wildcard, URL or IP address. minLength: 3 maxLength: 253
Request template and responses
shell · request template
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

StatusMeaningBody and headers
201Organization 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)
POST/api/organizations/{org_id}/domain-verification

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.

Authentication
dashboardSession
Request body
OrganizationDomainProof
Operation ID
dashboardOrganizationsVerifyDomain

Parameters

NameSend inRequired?Description
org_idpathrequired

Request body fields

FieldDescription
challenge_id (required, string)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200Organization 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)
GET/api/organizations/{org_id}/admins

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsAdmins

Parameters

NameSend inRequired?Description
org_idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/admins'

Responses

StatusMeaningBody and headers
200Organization 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)
PUT/api/organizations/{org_id}/admins

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.

Authentication
dashboardSession
Request body
OrganizationAdminsUpdate
Operation ID
dashboardOrganizationsSetAdmins

Parameters

NameSend inRequired?Description
org_idpathrequired
If-MatchheaderrequiredThe organization revision from GET, optionally quoted.

Request body fields

FieldDescription
admin_user_ids (required, array)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200Organization 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)
GET/api/organizations/{org_id}/people

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsPeople

Parameters

NameSend inRequired?Description
org_idpathrequired
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/people'

Responses

StatusMeaningBody and headers
200Organization 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)
GET/api/organizations/{org_id}/admin-invitations

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsListAdminInvitations

Parameters

NameSend inRequired?Description
org_idpathrequired
statusqueryoptional
cursorqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/admin-invitations'

Responses

StatusMeaningBody and headers
200The 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)
POST/api/organizations/{org_id}/admin-invitations

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.

Authentication
dashboardSession
Request body
OrganizationAdminInvitationCreate
Operation ID
dashboardOrganizationsCreateAdminInvitations

Parameters

NameSend inRequired?Description
org_idpathrequired
Idempotency-Keyheaderrequired

Request body fields

FieldDescription
emails (required, array)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
201The 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
POST/api/organizations/{org_id}/admin-invitations/{invitation_id}/revoke

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsRevokeAdminInvitation

Parameters

NameSend inRequired?Description
org_idpathrequired
invitation_idpathrequired
Request template and responses
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/admin-invitations/INVITATION_ID/revoke'

Responses

StatusMeaningBody and headers
204The 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)
GET/api/organizations/{org_id}/member-invitations

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsListMemberInvitations

Parameters

NameSend inRequired?Description
org_idpathrequired
statusqueryoptional
cursorqueryoptional
Request template and responses
shell · request template
curl --request GET --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/member-invitations'

Responses

StatusMeaningBody and headers
200The 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)
POST/api/organizations/{org_id}/member-invitations

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.

Authentication
dashboardSession
Request body
OrganizationMemberInvitationCreate
Operation ID
dashboardOrganizationsCreateMemberInvitations

Parameters

NameSend inRequired?Description
org_idpathrequired
Idempotency-Keyheaderrequired

Request body fields

FieldDescription
emails (required, array)
proof (optional, DashboardProof)
Request template and responses
shell · request template
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

StatusMeaningBody and headers
201The 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
POST/api/organizations/{org_id}/member-invitations/{invitation_id}/revoke

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsRevokeMemberInvitation

Parameters

NameSend inRequired?Description
org_idpathrequired
invitation_idpathrequired
Request template and responses
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/member-invitations/INVITATION_ID/revoke'

Responses

StatusMeaningBody and headers
204The 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)
DELETE/api/organizations/{org_id}/members/{user_id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsRemoveMember

Parameters

NameSend inRequired?Description
org_idpathrequired
user_idpathrequired
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/members/USER_ID'

Responses

StatusMeaningBody and headers
204The 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)
PUT/api/organizations/{org_id}/guest-policy

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.

Authentication
dashboardSession
Request body
OrganizationGuestPolicyUpdate
Operation ID
dashboardOrganizationsSetGuestPolicy

Parameters

NameSend inRequired?Description
org_idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200The 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)
PUT/api/organizations/{org_id}/library

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.

Authentication
dashboardSession
Request body
OrganizationLibraryUpdate
Operation ID
dashboardOrganizationsSetLibrary

Parameters

NameSend inRequired?Description
org_idpathrequired

Request body fields

FieldDescription
project_id (required, inline)The organization's project to make its Library, or null to clear the Library.
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200The 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)
POST/api/organizations/{org_id}/project-access

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.

Authentication
dashboardSession
Request body
OrganizationProjectAccessRequest
Operation ID
dashboardOrganizationsSetProjectAccess

Parameters

NameSend inRequired?Description
org_idpathrequired

Request body fields

FieldDescription
changes (required, array)The changes, applied in order; no (project_id, user_id) pair appears twice.
Request template and responses
shell · request template
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

StatusMeaningBody and headers
200The 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)
POST/api/organizations/{org_id}/projects/{project_id}/access

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsJoinProject

Parameters

NameSend inRequired?Description
org_idpathrequired
project_idpathrequired
Request template and responses
shell · request template
curl --request POST --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/projects/PROJECT_ID/access'

Responses

StatusMeaningBody and headers
200The 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)
PUT/api/organizations/{org_id}/projects/{project_id}/owner

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.

Authentication
dashboardSession
Request body
OrganizationProjectOwnerUpdate
Operation ID
dashboardOrganizationsSetProjectOwner

Parameters

NameSend inRequired?Description
org_idpathrequired
project_idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200The 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)
DELETE/api/organizations/{org_id}/projects/{project_id}/members/{user_id}

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsRemoveProjectMember

Parameters

NameSend inRequired?Description
org_idpathrequired
project_idpathrequired
user_idpathrequired
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/projects/PROJECT_ID/members/USER_ID'

Responses

StatusMeaningBody and headers
204The 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)
DELETE/api/organizations/{org_id}/domains/{domain}

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.

Authentication
dashboardSession
Request body
none
Operation ID
dashboardOrganizationsRemoveOneDomain

Parameters

NameSend inRequired?Description
org_idpathrequired
domainpathrequired
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/organizations/ORG_ID/domains/DOMAIN'

Responses

StatusMeaningBody and headers
200Organization 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)
PUT/api/members/{user_id}/approver

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).

Authentication
dashboardSession
Request body
MemberApproverUpdate
Operation ID
setDashboardMemberApprover

Parameters

NameSend inRequired?Description
user_idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200The 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)
PUT/api/members/{user_id}/screen-scope

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.

Authentication
dashboardSession
Request body
MemberScreenScopeUpdate
Operation ID
setDashboardMemberScreenScope

Parameters

NameSend inRequired?Description
user_idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200The member, with screen_scope.DashboardMember (application/json)
402feature_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)
403forbidden - 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)
DELETE/api/members/{user_id}/screen-scope

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.

Authentication
dashboardSession
Request body
none
Operation ID
clearDashboardMemberScreenScope

Parameters

NameSend inRequired?Description
user_idpathrequired
project_idqueryoptionalThe project the caller means; a session whose selection has changed is refused with resource_conflict.
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID/screen-scope'

Responses

StatusMeaningBody and headers
200The member.DashboardMember (application/json)
403forbidden - 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)
PUT/api/agents/{id}/screen-scope

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.

Authentication
dashboardSession
Request body
AgentScreenScopeUpdate
Operation ID
setDashboardAgentScreenScope

Parameters

NameSend inRequired?Description
idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200The agent, with screen_scope.Agent (application/json)
402feature_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)
403forbidden - 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)
409resource_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)
DELETE/api/agents/{id}/screen-scope

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.

Authentication
dashboardSession
Request body
none
Operation ID
clearDashboardAgentScreenScope

Parameters

NameSend inRequired?Description
idpathrequired
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/agents/RESOURCE_ID/screen-scope'

Responses

StatusMeaningBody and headers
200The agent.Agent (application/json)
403forbidden - 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)
PUT/api/members/{user_id}/upload-scope

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).

Authentication
dashboardSession
Request body
MemberUploadScopeUpdate
Operation ID
setDashboardMemberUploadScope

Parameters

NameSend inRequired?Description
user_idpathrequired

Request body fields

FieldDescription
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
shell · request template
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

StatusMeaningBody and headers
200The 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)
DELETE/api/members/{user_id}/upload-scope

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.

Authentication
dashboardSession
Request body
none
Operation ID
clearDashboardMemberUploadScope

Parameters

NameSend inRequired?Description
user_idpathrequired
project_idqueryoptionalThe project the caller means; a session whose selection has changed is refused with resource_conflict.
Request template and responses
shell · request template
curl --request DELETE --cookie cookies.txt --cookie-jar cookies.txt 'https://screenrig.ai/api/members/USER_ID/upload-scope'

Responses

StatusMeaningBody and headers
200The 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)