API reference
Read as Markdown · OpenAPI JSON · Versioning policy
- OpenAPI Version:
3.2.0 - API Version:
1
Customer inputs reject unknown JSON and query fields. Validation errors contain errors entries with field paths, codes and messages. Conflicts report already_exists, limit_reached or invalid_state, with the detail in message; a refused rename adds lockedUntil. Per-IP and per-token limits apply; honor Retry-After on throttling and in-flight creates. An in-flight create returns 409 idempotency_in_progress; retry it with the same Idempotency-Key. Customer resources expose one id containing the immutable public project identifier used in pid path parameters. Timestamps are RFC 3339 strings normalized to UTC; money fields ending in Micros are micro-USD. Customer PATCH accepts JSON Merge Patch: omitted members remain unchanged, arrays replace, and null clears nullable members. A nullable member has no implicit value beyond the declared null; required fields without a schema default must be supplied. Stored state and billing calculations retain their existing units. A vanity name is a mutable project field. Renames lock further changes for the seven-day grace window; old names redirect during that window. Use this API at https://api.moq.pro/v1. Device login uses the OAuth error envelope and form encoding. Signup, login, passkey enrolment, and email change remain human sign-in flows outside this spec. Fleet operations under /cluster also remain outside this spec. Admin operations require a token with admin authority from a current site admin. The /v1 compatibility and deprecation policy is at https://doc.moq.pro/api-versioning.
Contents
Operations
- GET /projects
- POST /projects
- GET /projects/{pid}
- PATCH /projects/{pid}
- DELETE /projects/{pid}
- GET /projects/{pid}/keys
- POST /projects/{pid}/keys
- POST /projects/{pid}/keys/import
- GET /projects/{pid}/keys/{kid}/private
- POST /projects/{pid}/keys/{kid}/token
- POST /projects/{pid}/keys/{kid}/disable
- POST /projects/{pid}/keys/{kid}/enable
- DELETE /projects/{pid}/keys/{kid}
- GET /projects/{pid}/limits
- PATCH /projects/{pid}/limits
- GET /projects/{pid}/auth/endpoint
- PUT /projects/{pid}/auth/endpoint
- DELETE /projects/{pid}/auth/endpoint
- POST /projects/{pid}/auth/endpoint/test
- POST /projects/{pid}/live/token
- GET /projects/{pid}/recording/rules
- POST /projects/{pid}/recording/rules
- DELETE /projects/{pid}/recording/rules/{id}
- PATCH /projects/{pid}/recording/rules/{id}
- DELETE /projects/{pid}/recording/rules/{id}/sessions
- GET /projects/{pid}/recording/sessions
- GET /projects/{pid}/recording/sessions/{id}
- DELETE /projects/{pid}/recording/sessions/{id}
- GET /projects/{pid}/recording/sessions/{id}/play
- GET /projects/{pid}/recording/s3
- GET /projects/{pid}/agent/rules
- POST /projects/{pid}/agent/rules
- DELETE /projects/{pid}/agent/rules/{id}
- PATCH /projects/{pid}/agent/rules/{id}
- GET /projects/{pid}/sync/targets
- POST /projects/{pid}/sync/targets
- PATCH /projects/{pid}/sync/targets/{id}
- DELETE /projects/{pid}/sync/targets/{id}
- GET /projects/{pid}/webhooks
- POST /projects/{pid}/webhooks
- PATCH /projects/{pid}/webhooks/{id}
- DELETE /projects/{pid}/webhooks/{id}
- POST /projects/{pid}/webhooks/{id}/test
- GET /projects/{pid}/webhooks/{id}/deliveries
- GET /projects/{pid}/usage
- GET /projects/{pid}/usage/current
- GET /projects/{pid}/invoices
- GET /projects/{pid}/spend-cap
- PATCH /projects/{pid}/spend-cap
- GET /projects/{pid}/payment
- DELETE /projects/{pid}/payment
- GET /projects/{pid}/credit
- POST /projects/{pid}/payment/setup-link
- POST /projects/{pid}/payment/setup-intent
- POST /projects/{pid}/payment/confirm
- POST /projects/{pid}/payment/portal
- POST /projects/{pid}/payment/retry
- PATCH /projects/{pid}/payment/contact
- PATCH /projects/{pid}/payment/statements
- GET /projects/{pid}/payment/identity
- PATCH /projects/{pid}/payment/identity
- POST /projects/{pid}/payment/net-terms
- DELETE /projects/{pid}/payment/net-terms
- POST /projects/{pid}/payment/credit-limit
- GET /projects/{pid}/notifications/live
- POST /projects/{pid}/notifications/dismiss
- GET /account/tokens
- POST /account/tokens
- DELETE /account/tokens/current
- DELETE /account/tokens/{id}
- PATCH /account/tokens/{id}
- GET /account
- PATCH /account
- DELETE /account
- GET /account/usage
- GET /account/export
- GET /account/deletion-preview
- GET /account/passkeys
- DELETE /account/passkeys/{id}
- DELETE /account/sessions/current
- DELETE /account/sessions
- GET /projects/{pid}/members
- PATCH /projects/{pid}/members/{accountId}
- DELETE /projects/{pid}/members/{accountId}
- GET /projects/{pid}/invites
- POST /projects/{pid}/invites
- DELETE /projects/{pid}/invites
- POST /projects/{pid}/invites/accept
- GET /projects/{pid}/transfer
- POST /projects/{pid}/transfer
- DELETE /projects/{pid}/transfer
- POST /projects/{pid}/transfer/accept
- POST /projects/{pid}/transfer/decline
- POST /oauth/device
- POST /oauth/token
Webhooks
- POST broadcast.started
- POST broadcast.ended
- POST recording.started
- POST recording.ready
- POST recording.failed
- POST webhook.test
Schemas
- AdminProjectPage
- ApiError
- CreatedApiToken
- Permissions
- ApiToken
- AdminProject
- BillingExposure
- CreditLimitRequest
- CurrentUsageQuantities
- Usage
- Project
- Key
- PrivateKey
- Token
- SessionLimits
- AuthEndpoint
- CreatedAuthEndpoint
- AuthEndpointTest
- LiveToken
- RecordingRule
- Bucket
- DeletingRule
- DeletingRecordings
- Session
- RecordingRuleTotals
- Playback
- DeletingRecording
- S3Credentials
- AgentRule
- AgentConfig
- SyncTarget
- Webhook
- TestedWebhook
- Delivery
- Allowance
- CurrentUsage
- Pool
- Invoice
- SpendCap
- Payment
- BillingStatus
- BillingIdentity
- NotificationFrame
- PermissionsInput
- Account
- AccountUsage
- AccountAllowance
- AccountExport
- AccountDeletionPreview
- AccountDeletionStep
- Passkey
- ProjectMember
- ProjectInvitation
- OwnershipTransfer
- CreditLimitRequestResponse
Servers
- URL:
https://api.moq.wtf/v1
Operations
List Projects
- Method:
GET - Path:
/projects - Operation ID:
listProjects - Tags: Projects
Token permissions: settings:read. Ordered by createdAt ascending, then id ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
name:string, minLength:1, maxLength:32, pattern:^[a-z0-9]([a-z0-9-]*[a-z0-9])?$Only the project with this name, or a former name still redirecting to it, when the caller can read it. An id never matches; read it with getProject.
Responses
200 Success
Content type: application/json
items(required): array of ProjectThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"name": null,
"billingExempt": true,
"domain": null,
"domainRole": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"role": "",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"enforcedPublic": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"redirects": [
{
"path": "",
"expiresAt": "2026-10-22T12:00:00.000Z"
}
],
"suspension": {
"paused": true,
"banned": true,
"freeLimited": true,
"capReached": true,
"suspended": true,
"overFreeTier": true,
"spendCapReached": true
},
"ownerEmail": null
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Generated example:
json
{
"code": "",
"message": "",
"errors": [
{
"path": [
""
],
"code": "",
"message": ""
}
],
"lockedUntil": ""
}Create Project
- Method:
POST - Path:
/projects - Operation ID:
createProject - Tags: Projects
Token permissions: lifecycle:write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
name:string, minLength:4, maxLength:32, pattern:^[a-z0-9]([a-z0-9-]*[a-z0-9])?$Optional mutable project name. Omit for an unnamed project reachable only by its immutable id.
Generated example:
json
{
"name": "example"
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"name": null,
"billingExempt": true,
"domain": null,
"domainRole": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"role": "",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"enforcedPublic": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"redirects": [
{
"path": "",
"expiresAt": "2026-10-22T12:00:00.000Z"
}
],
"suspension": {
"paused": true,
"banned": true,
"freeLimited": true,
"capReached": true,
"suspended": true,
"overFreeTier": true,
"spendCapReached": true
},
"ownerEmail": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Project
- Method:
GET - Path:
/projects/{pid} - Operation ID:
getProject - Tags: Projects
Token permissions: settings:read. Project role: read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Project
- Method:
PATCH - Path:
/projects/{pid} - Operation ID:
updateProject - Tags: Projects
Token permissions: settings:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
domainEnabled:booleanEnable access from the caller verified email domain; false disables it. Omit to leave unchanged.
domainRole:string, possible values:"write", "read"Role for matching verified-domain members. Omit to leave unchanged; owner requires an explicit membership.
name:string | null, minLength:4, maxLength:32, pattern:^[a-z0-9]([a-z0-9-]*[a-z0-9])?$New project name, or null to clear it. The previous name redirects for a grace period.
public:object | null, no additional propertiesVersion 1 patterns. A bare path is exact; a trailing ** segment matches its subtree. Null clears public access.
v(required):number, possible values:1Pattern version 1:
foomatches onlyfoo; usefoo/**for a subtree.publish:array | null, maxItems:32Patterns anyone may publish to. Omitted keeps the saved list; null clears it.
Items:
string, maxLength:256At most 256 UTF-16 code units (JavaScript string.length). A legacy prefix must also fit after subtree expansion.
subscribe:array | null, maxItems:32Patterns anyone may subscribe to. Omitted keeps the saved list; null clears it.
Items:
string, maxLength:256At most 256 UTF-16 code units (JavaScript string.length). A legacy prefix must also fit after subtree expansion.
Generated example:
json
{
"name": null,
"domainEnabled": true,
"domainRole": "write",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
}
}Content type: application/merge-patch+json
no additional properties
domainEnabled:booleanEnable access from the caller verified email domain; false disables it. Omit to leave unchanged.
domainRole:string, possible values:"write", "read"Role for matching verified-domain members. Omit to leave unchanged; owner requires an explicit membership.
name:string | null, minLength:4, maxLength:32, pattern:^[a-z0-9]([a-z0-9-]*[a-z0-9])?$New project name, or null to clear it. The previous name redirects for a grace period.
public:object | null, no additional propertiesVersion 1 patterns. A bare path is exact; a trailing ** segment matches its subtree. Null clears public access.
v(required):number, possible values:1Pattern version 1:
foomatches onlyfoo; usefoo/**for a subtree.publish:array | null, maxItems:32Patterns anyone may publish to. Omitted keeps the saved list; null clears it.
Items:
string, maxLength:256At most 256 UTF-16 code units (JavaScript string.length). A legacy prefix must also fit after subtree expansion.
subscribe:array | null, maxItems:32Patterns anyone may subscribe to. Omitted keeps the saved list; null clears it.
Items:
string, maxLength:256At most 256 UTF-16 code units (JavaScript string.length). A legacy prefix must also fit after subtree expansion.
Generated example:
json
{
"name": null,
"domainEnabled": true,
"domainRole": "write",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
}
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Project
- Method:
DELETE - Path:
/projects/{pid} - Operation ID:
deleteProject - Tags: Projects
Token permissions: lifecycle:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Keys
- Method:
GET - Path:
/projects/{pid}/keys - Operation ID:
listKeys - Tags: Keys
Token permissions: keys:read. Project role: write. Ordered by createdAt ascending, then id ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of KeyThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"algorithm": "",
"keyType": "",
"label": null,
"disabledAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z",
"scope": {
"root": "",
"publish": [
""
],
"subscribe": [
""
],
"put": [
""
],
"get": [
""
]
},
"privateKey": ""
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Key
- Method:
POST - Path:
/projects/{pid}/keys - Operation ID:
createKey - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
algorithm(required):string, possible values:"HS256", "HS384", "HS512", "ES256", "ES384", "RS256", "RS384", "RS512", "PS256", "PS384", "PS512", "EdDSA"Signing algorithm. HS* keys are symmetric secrets; the others are asymmetric key pairs.
label:stringOptional human-readable label.
publish:array of stringImmutable publish scope, patterns relative to the project. Omit both lists for no scope.
subscribe:array of stringImmutable subscribe scope, patterns relative to the project. Omit both lists for no scope.
Generated example:
json
{
"algorithm": "HS256",
"label": "",
"publish": [
""
],
"subscribe": [
""
]
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"algorithm": "",
"keyType": "",
"label": null,
"disabledAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z",
"scope": {
"root": "",
"publish": [
""
],
"subscribe": [
""
],
"put": [
""
],
"get": [
""
]
},
"privateKey": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Import Key
- Method:
POST - Path:
/projects/{pid}/keys/import - Operation ID:
importKey - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
publicKey(required):stringSerialized public JWK. Private key parameters are refused.
label:stringOptional human-readable label.
Generated example:
json
{
"label": "",
"publicKey": "{\"kty\":\"EC\",\"crv\":\"P-256\",...}"
}Responses
201 Created
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Private Key
- Method:
GET - Path:
/projects/{pid}/keys/{kid}/private - Operation ID:
getPrivateKey - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
kid(required):string, minLength:1The key's id field.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"privateKey": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Mint Token
- Method:
POST - Path:
/projects/{pid}/keys/{kid}/token - Operation ID:
mintToken - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
kid(required):string, minLength:1The key's id field.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
exp:string, format:date-timeExpiry strictly in the future, at most 30 days from the request. Omitted means the token never expires.
publish:array of stringPatterns the token may publish, relative to its root; must fit the key scope.
root:stringOptional connection root claim. Defaults to the key scope root when scoped, otherwise the immutable project id; an explicit root must fit the key scope.
subscribe:array of stringPatterns the token may subscribe to, relative to its root; must fit the key scope.
Generated example:
json
{
"root": "",
"publish": [
""
],
"subscribe": [
""
],
"exp": "2026-10-22T12:00:00.000Z"
}Responses
200 Success
Content type: application/json
Generated example:
json
{
"token": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Disable Key
- Method:
POST - Path:
/projects/{pid}/keys/{kid}/disable - Operation ID:
disableKey - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
kid(required):string, minLength:1The key's id field.
Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Enable Key
- Method:
POST - Path:
/projects/{pid}/keys/{kid}/enable - Operation ID:
enableKey - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
kid(required):string, minLength:1The key's id field.
Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Key
- Method:
DELETE - Path:
/projects/{pid}/keys/{kid} - Operation ID:
deleteKey - Tags: Keys
Token permissions: keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
kid(required):string, minLength:1The key's id field.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Session Limits
- Method:
GET - Path:
/projects/{pid}/limits - Operation ID:
getSessionLimits - Tags: Limits
Token permissions: settings:read. Project role: read. Caps on the live sessions one token, and one remote address, may hold on each relay. A change applies to the next connect and never closes a running session.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"token": null,
"remote": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Set Session Limits
- Method:
PATCH - Path:
/projects/{pid}/limits - Operation ID:
setSessionLimits - Tags: Limits
Token permissions: settings:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
remote:integer | null, minimum:1, maximum:1000000Live sessions one remote address (an IPv4 address or an IPv6 /64) may hold on each relay, from 1 to 1000000; null is unlimited.
token:integer | null, minimum:1, maximum:1000000Live sessions one token may hold on each relay, from 1 to 1000000; null is unlimited.
Generated example:
json
{
"token": null,
"remote": null
}Content type: application/merge-patch+json
no additional properties
remote:integer | null, minimum:1, maximum:1000000Live sessions one remote address (an IPv4 address or an IPv6 /64) may hold on each relay, from 1 to 1000000; null is unlimited.
token:integer | null, minimum:1, maximum:1000000Live sessions one token may hold on each relay, from 1 to 1000000; null is unlimited.
Generated example:
json
{
"token": null,
"remote": null
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Auth Endpoint
- Method:
GET - Path:
/projects/{pid}/auth/endpoint - Operation ID:
getAuthEndpoint - Tags: Auth
Token permissions: keys:read. Project role: write. Your own HTTPS endpoint that decides tokenless sessions, which replaces the project's public rules while set. Sessions with a MoQ token are still verified against the project's keys. A token without keys:write sees only the URL's origin, since its path can carry a credential.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"url": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Set Auth Endpoint
- Method:
PUT - Path:
/projects/{pid}/auth/endpoint - Operation ID:
setAuthEndpoint - Tags: Auth
Token permissions: keys:write. Project role: write. Saves the endpoint. The save that creates it returns 201 with its one-time signing secret; a later save changes the URL, keeps the secret, and returns 200. Retry with the same Idempotency-Key to recover the secret from a lost reply.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
url(required):string, minLength:1, maxLength:2000An https URL to a public host name, with no IP address and no user:password.
Generated example:
json
{
"url": ""
}Responses
200 Success
Content type: application/json
201 Created
Content type: application/json
Generated example:
json
{
"url": "",
"secret": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Auth Endpoint
- Method:
DELETE - Path:
/projects/{pid}/auth/endpoint - Operation ID:
deleteAuthEndpoint - Tags: Auth
Token permissions: keys:write. Project role: write. The saved public rules apply again, and the signing secret is discarded.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Test Auth Endpoint
- Method:
POST - Path:
/projects/{pid}/auth/endpoint/test - Operation ID:
testAuthEndpoint - Tags: Auth
Token permissions: keys:write. Project role: write. Sends the saved endpoint one signed connect request, as a relay would, and returns what it answered. Admits no one. Refused with 404 before an endpoint is saved.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
path:string, maxLength:1000The path a viewer dials, relative to the project. Defaults to the project root.
query:string, maxLength:4000The query string the viewer presents, without the leading ?. jwt is reserved for MoQ tokens.
Generated example:
json
{
"path": "",
"query": ""
}Responses
200 Success
Content type: application/json
Generated example:
json
{
"request": {
"id": "",
"event": "",
"node": "",
"transport": "",
"path": "",
"query": ""
},
"answer": {
"kind": "",
"grant": {
"additionalProperty": null
}
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Mint Live Token
- Method:
POST - Path:
/projects/{pid}/live/token - Operation ID:
mintLiveToken - Tags: Live
Token permissions: keys:write. Project role: read. Relay tokens that watch the project's broadcasts and its live dashboard statistics for one hour; mint again before expiresAt. A credential, so it needs keys:write. Refused with 403 while the project is paused; see Project.suspension.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"project": {
"token": "",
"root": ""
},
"stats": {
"token": "",
"root": ""
},
"expiresAt": "2026-10-22T12:00:00.000Z"
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Recording Rules
- Method:
GET - Path:
/projects/{pid}/recording/rules - Operation ID:
listRecordingRules - Tags: Recording
Token permissions: media:read. Project role: read. Ordered by createdAt ascending, then id ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of RecordingRuleThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"label": null,
"patterns": [
""
],
"vodEnabled": true,
"retentionDays": 1,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z",
"bucketId": null,
"deleting": true,
"uploadRefusal": null,
"bucket": {
"endpoint": "",
"region": "",
"bucket": "",
"destination": "",
"delivery": true
},
"deletePending": 0
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Recording Rule
- Method:
POST - Path:
/projects/{pid}/recording/rules - Operation ID:
createRecordingRule - Tags: Recording
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
patterns(required):array, minItems:1, maxItems:32Broadcast path patterns relative to the project, 1 to 32; a PATCH replaces the list.
Items:
string, maxLength:200bucket:object, no additional propertiesOmit for managed storage; supply customer bucket credentials once for BYOB. BYOB owns retention. Cardless projects cannot start recording after exhausting their account allowance.
accessKeyId(required):string, minLength:1, maxLength:200Access key id with write access.
bucket(required):string, minLength:1, maxLength:200S3 bucket name.
endpoint(required):string, minLength:1, maxLength:400S3-compatible endpoint, an https URL on a public host.
region(required):string, minLength:1, maxLength:100S3 region used for signing.
secretAccessKey(required):string, minLength:1, maxLength:400Secret access key; write-only, encrypted at rest and never returned.
delivery:booleanServe playback from the bucket, which needs read access too. Defaults to false.
destination:string, maxLength:400Object prefix inside the bucket; omitted is the root.
label:string, maxLength:80Optional display label, at most 80 characters.
retentionDays: default:7Managed retention in days. More than 7 days requires a payment method; BYOB retention is owned by the bucket owner.
Any of:
number, possible values:1number, possible values:7number, possible values:30number, possible values:90number, possible values:180number, possible values:365
vodEnabled:booleanWhether matching broadcasts are recorded. Defaults to true.
Generated example:
json
{
"label": "",
"patterns": [
""
],
"vodEnabled": true,
"retentionDays": 7,
"bucket": {
"endpoint": "",
"region": "",
"bucket": "",
"accessKeyId": "",
"secretAccessKey": "",
"destination": "",
"delivery": true
}
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"label": null,
"patterns": [
""
],
"vodEnabled": true,
"retentionDays": 1,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z",
"bucketId": null,
"deleting": true,
"uploadRefusal": null,
"bucket": {
"endpoint": "",
"region": "",
"bucket": "",
"destination": "",
"delivery": true
},
"deletePending": 0
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Recording Rule
- Method:
DELETE - Path:
/projects/{pid}/recording/rules/{id} - Operation ID:
deleteRecordingRule - Tags: Recording
Token permissions: media:write. Project role: write. Disable the rule first. Refused with 409 invalid_state while the rule has recordings not yet being deleted; delete them first, one at a time or with deleteRuleRecordings. The rule stays listed with deleting set until its storage drains in the background.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Responses
202 Accepted. The body is a receipt; the work completes asynchronously.
Content type: application/json
Generated example:
json
{
"status": "",
"pending": 1
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Recording Rule
- Method:
PATCH - Path:
/projects/{pid}/recording/rules/{id} - Operation ID:
updateRecordingRule - Tags: Recording
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
bucket:string | nullRename the customer bucket; customer buckets only.
delivery:booleanServe playback from the customer bucket, which needs read access; re-probed when enabled.
region:string | nullChange the customer bucket's region; customer buckets only.
retentionDaysManaged retention in days. More than 7 days requires a payment method; BYOB retention is owned by the bucket owner.
Any of:
number, possible values:1number, possible values:7number, possible values:30number, possible values:90number, possible values:180number, possible values:365
vodEnabled:booleanWhether matching broadcasts are recorded.
Generated example:
json
{
"vodEnabled": true,
"retentionDays": 7,
"bucket": null,
"region": null,
"delivery": true
}Content type: application/merge-patch+json
no additional properties
bucket:string | nullRename the customer bucket; customer buckets only.
delivery:booleanServe playback from the customer bucket, which needs read access; re-probed when enabled.
region:string | nullChange the customer bucket's region; customer buckets only.
retentionDaysManaged retention in days. More than 7 days requires a payment method; BYOB retention is owned by the bucket owner.
Any of:
number, possible values:1number, possible values:7number, possible values:30number, possible values:90number, possible values:180number, possible values:365
vodEnabled:booleanWhether matching broadcasts are recorded.
Generated example:
json
{
"vodEnabled": true,
"retentionDays": 7,
"bucket": null,
"region": null,
"delivery": true
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Rule Recordings
- Method:
DELETE - Path:
/projects/{pid}/recording/rules/{id}/sessions - Operation ID:
deleteRuleRecordings - Tags: Recording
Token permissions: media:write. Project role: write. Deletes every recording the rule holds and keeps the rule. Completes asynchronously: each recording leaves the listing once queued (a live one after its recorder stops), and its storage drains in the background, metered until it is gone.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Responses
202 Accepted. The body is a receipt; the work completes asynchronously.
Content type: application/json
Generated example:
json
{
"status": "",
"pending": 1
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Recordings
- Method:
GET - Path:
/projects/{pid}/recording/sessions - Operation ID:
listRecordings - Tags: Recording
Token permissions: media:read. Project role: read. Lists recordings newest first, a page at a time. To keep a copy current, pass the sinceCursor of an earlier response as since: the response holds the recordings that changed after it and the ids removed since, and its own sinceCursor continues from there.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
since:stringOpaque sinceCursor from an earlier response. Returns the recordings that changed after it, in items, and the ids that left the listing, in removed, instead of a page. Not combined with cursor.
Responses
200 Success
Content type: application/json
items(required): array of SessionThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
removed(required):array of stringWith since: ids of recordings that left the listing after it, such as by deletion. Otherwise empty.
reset(required):booleanWith since: true when its changes are no longer available, or more than limit changed. items and nextCursor are then the first page, which replaces every recording you hold.
sinceCursor(required):string | nullPass as since to get the changes after this response. Null on a page continued with cursor: the first page's covers the pages after it.
totals(required): array of RecordingRuleTotals |nullTotals per recording rule over every recording listed, not just this page, as of sinceCursor. A rule without recordings is absent. Null on a page continued with cursor.
Generated example:
json
{
"items": [
{
"id": "",
"broadcastPath": "",
"status": "",
"startedAt": "2026-10-22T12:00:00.000Z",
"endedAt": "2026-10-22T12:00:00.000Z",
"playlistUrl": null,
"region": null,
"bytes": 1,
"durationMs": 1,
"deleting": true,
"cleanupFailed": true,
"exportStatus": null,
"exportFailure": null,
"regression": null
}
],
"nextCursor": null,
"removed": [
""
],
"reset": true,
"sinceCursor": null,
"totals": [
{
"ruleId": "",
"recordings": 0,
"live": 0,
"bytes": 0
}
]
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Recording
- Method:
GET - Path:
/projects/{pid}/recording/sessions/{id} - Operation ID:
getRecording - Tags: Recording
Token permissions: media:read. Project role: read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The recording's id, percent-encoded as one path segment: each
/is%2F.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"id": "",
"broadcastPath": "",
"status": "",
"startedAt": "2026-10-22T12:00:00.000Z",
"endedAt": "2026-10-22T12:00:00.000Z",
"playlistUrl": null,
"region": null,
"bytes": 1,
"durationMs": 1,
"deleting": true,
"cleanupFailed": true,
"exportStatus": null,
"exportFailure": null,
"regression": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Recording
- Method:
DELETE - Path:
/projects/{pid}/recording/sessions/{id} - Operation ID:
deleteRecording - Tags: Recording
Token permissions: media:write. Project role: write. Completes asynchronously: the recording leaves the listing once queued (a live one after its recorder stops), and its storage drains in the background, metered until it is gone.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The recording's id, percent-encoded as one path segment: each
/is%2F.
Responses
202 Accepted. The body is a receipt; the work completes asynchronously.
Content type: application/json
Generated example:
json
{
"status": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Play Recording
- Method:
GET - Path:
/projects/{pid}/recording/sessions/{id}/play - Operation ID:
playRecording - Tags: Recording
Token permissions: media:read. Project role: read. Returns the recording's playlist URL with a short-lived token for fetching it and its media. Refused with 409 when the recording's own bucket does not allow delivery.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The recording's id, percent-encoded as one path segment: each
/is%2F.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"url": "",
"token": "",
"expiresAt": "2026-10-22T12:00:00.000Z",
"live": true,
"span": {
"start": "2026-10-22T12:00:00.000Z",
"end": "2026-10-22T12:00:00.000Z",
"segments": 1
},
"initial": {
"start": "2026-10-22T12:00:00.000Z",
"end": "2026-10-22T12:00:00.000Z"
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Recording Credentials
- Method:
GET - Path:
/projects/{pid}/recording/s3 - Operation ID:
getRecordingCredentials - Tags: Recording
Token permissions: keys:write. Project role: owner. S3 credentials for tools such as aws-cli and rclone to list and download managed recordings at endpoint, path-style. They grant nothing alone: every request also needs a subscribe token from mintToken as aws_session_token (x-amz-security-token), which limits reads to the broadcasts it subscribes to and expires with it. Any region signs; bucket is only a label. The same project returns the same credentials. Downloads are metered as delivery; recordings in your own bucket are not listed.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"endpoint": "",
"region": "",
"bucket": "",
"accessKeyId": "",
"secretAccessKey": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Agent Rules
- Method:
GET - Path:
/projects/{pid}/agent/rules - Operation ID:
listAgentRules - Tags: Agent
Token permissions: media:read. Project role: read. Ordered by createdAt ascending, then id ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of AgentRuleThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"patterns": [
""
],
"enabled": true,
"config": {
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 4,
"stt": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"llm": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"tts": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
}
},
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Agent Rule
- Method:
POST - Path:
/projects/{pid}/agent/rules - Operation ID:
createAgentRule - Tags: Agent
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
config(required):object, no additional propertiesFull voice configuration with write-only provider keys. Creating or enabling a voice rule requires paid collection (card, net terms, or billing exemption).
llm(required):object, no additional propertiesLanguage-model provider.
apiKey(required):string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
provider(required):string, possible values:"openai"Provider id.
model:string, maxLength:80Provider model; omitted uses its default.
options:objectProvider-specific options, checked against that provider's allowlist.
Additional properties:
string | number | boolean
stt(required):object, no additional propertiesSpeech-to-text provider.
apiKey(required):string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
provider(required):string, possible values:"deepgram"Provider id.
model:string, maxLength:80Provider model; omitted uses its default.
options:objectProvider-specific options, checked against that provider's allowlist.
Additional properties:
string | number | boolean
systemPrompt(required):string, maxLength:8000Instruction text, at most 8000 characters.
tts(required):object, no additional propertiesText-to-speech provider.
apiKey(required):string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
provider(required):string, possible values:"cartesia"Provider id.
model:string, maxLength:80Provider model; omitted uses its default.
options:objectProvider-specific options, checked against that provider's allowlist.
Additional properties:
string | number | boolean
greeting:string | null, maxLength:2000Initial spoken greeting, at most 2000 characters; null or omitted for none.
maxSessions:numberSimultaneous sessions for this rule, 1 to 4. Defaults to the project ceiling.
turnDetection:string, possible values:"silero", "stt_endpointing", "client"Turn detection strategy. Defaults to silero.
patterns(required):array, minItems:1, maxItems:32Broadcast path patterns relative to the project, 1 to 32; a PATCH replaces the list.
Items:
string, maxLength:200enabled:booleanWhether the rule applies. Defaults to true on create.
Generated example:
json
{
"patterns": [
""
],
"enabled": true,
"config": {
"stt": {
"provider": "deepgram",
"model": "",
"apiKey": "",
"options": {
"additionalProperty": ""
}
},
"llm": {
"provider": "openai",
"model": "",
"apiKey": "",
"options": {
"additionalProperty": ""
}
},
"tts": {
"provider": "cartesia",
"model": "",
"apiKey": "",
"options": {
"additionalProperty": ""
}
},
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 1
}
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"patterns": [
""
],
"enabled": true,
"config": {
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 4,
"stt": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"llm": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"tts": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
}
},
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Agent Rule
- Method:
DELETE - Path:
/projects/{pid}/agent/rules/{id} - Operation ID:
deleteAgentRule - Tags: Agent
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Agent Rule
- Method:
PATCH - Path:
/projects/{pid}/agent/rules/{id} - Operation ID:
updateAgentRule - Tags: Agent
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
config:object, no additional propertiesVoice configuration changes. Changing a provider requires its apiKey.
greeting:string | null, maxLength:2000Initial spoken greeting, at most 2000 characters; null or omitted for none.
llm:object, no additional propertiesLanguage-model changes.
apiKey:string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
model:string | null, maxLength:80Provider model; null restores its default.
options:object | nullMerge-patched provider options; a null member or null clears.
Additional properties:
string | number | boolean | nullprovider:string, possible values:"openai"Provider id.
maxSessions:numberSimultaneous sessions for this rule, 1 to 4. Defaults to the project ceiling.
stt:object, no additional propertiesSpeech-to-text changes.
apiKey:string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
model:string | null, maxLength:80Provider model; null restores its default.
options:object | nullMerge-patched provider options; a null member or null clears.
Additional properties:
string | number | boolean | nullprovider:string, possible values:"deepgram"Provider id.
systemPrompt:string, maxLength:8000Instruction text, at most 8000 characters.
tts:object, no additional propertiesText-to-speech changes.
apiKey:string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
model:string | null, maxLength:80Provider model; null restores its default.
options:object | nullMerge-patched provider options; a null member or null clears.
Additional properties:
string | number | boolean | nullprovider:string, possible values:"cartesia"Provider id.
turnDetection:string, possible values:"silero", "stt_endpointing", "client"Turn detection strategy. Defaults to silero.
enabled:booleanWhether the rule applies. Defaults to true on create.
Generated example:
json
{
"enabled": true,
"config": {
"stt": {
"provider": "deepgram",
"model": null,
"apiKey": "",
"options": null
},
"llm": {
"provider": "openai",
"model": null,
"apiKey": "",
"options": null
},
"tts": {
"provider": "cartesia",
"model": null,
"apiKey": "",
"options": null
},
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 1
}
}Content type: application/merge-patch+json
no additional properties
config:object, no additional propertiesVoice configuration changes. Changing a provider requires its apiKey.
greeting:string | null, maxLength:2000Initial spoken greeting, at most 2000 characters; null or omitted for none.
llm:object, no additional propertiesLanguage-model changes.
apiKey:string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
model:string | null, maxLength:80Provider model; null restores its default.
options:object | nullMerge-patched provider options; a null member or null clears.
Additional properties:
string | number | boolean | nullprovider:string, possible values:"openai"Provider id.
maxSessions:numberSimultaneous sessions for this rule, 1 to 4. Defaults to the project ceiling.
stt:object, no additional propertiesSpeech-to-text changes.
apiKey:string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
model:string | null, maxLength:80Provider model; null restores its default.
options:object | nullMerge-patched provider options; a null member or null clears.
Additional properties:
string | number | boolean | nullprovider:string, possible values:"deepgram"Provider id.
systemPrompt:string, maxLength:8000Instruction text, at most 8000 characters.
tts:object, no additional propertiesText-to-speech changes.
apiKey:string, minLength:1, maxLength:400Your provider API key; write-only, encrypted at rest and never returned.
model:string | null, maxLength:80Provider model; null restores its default.
options:object | nullMerge-patched provider options; a null member or null clears.
Additional properties:
string | number | boolean | nullprovider:string, possible values:"cartesia"Provider id.
turnDetection:string, possible values:"silero", "stt_endpointing", "client"Turn detection strategy. Defaults to silero.
enabled:booleanWhether the rule applies. Defaults to true on create.
Generated example:
json
{
"enabled": true,
"config": {
"stt": {
"provider": "deepgram",
"model": null,
"apiKey": "",
"options": null
},
"llm": {
"provider": "openai",
"model": null,
"apiKey": "",
"options": null
},
"tts": {
"provider": "cartesia",
"model": null,
"apiKey": "",
"options": null
},
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 1
}
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Sync Targets
- Method:
GET - Path:
/projects/{pid}/sync/targets - Operation ID:
listSyncTargets - Tags: Sync
Token permissions: media:read. Project role: read. Ordered by createdAt ascending, then id ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of SyncTargetThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"kind": "",
"label": "",
"publishPrefixes": [
""
],
"publishConfigured": true,
"publishOrigin": null,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Sync Target
- Method:
POST - Path:
/projects/{pid}/sync/targets - Operation ID:
createSyncTarget - Tags: Sync
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
kind(required):string, possible values:"cloudflare", "custom"Immutable target kind: cloudflare or custom.
label:string, maxLength:80Human-readable label, trimmed; empty means unset.
publishPrefixes:array, maxItems:20Broadcast path prefixes relative to the project to publish to the target.
Items:
string, maxLength:200publishUrl:string | null, maxLength:2000Publish URL including its credential; write-only. null clears it.
Generated example:
json
{
"kind": "cloudflare",
"label": "",
"publishPrefixes": [
""
],
"publishUrl": null
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"kind": "",
"label": "",
"publishPrefixes": [
""
],
"publishConfigured": true,
"publishOrigin": null,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Sync Target
- Method:
PATCH - Path:
/projects/{pid}/sync/targets/{id} - Operation ID:
updateSyncTarget - Tags: Sync
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
expectedUpdatedAt:string, format:date-timeThe updatedAt of the version being edited. Omit only for an intentional last-writer-wins update.
label:string, maxLength:80Human-readable label, trimmed; empty means unset.
publishPrefixes:array, maxItems:20Broadcast path prefixes relative to the project to publish to the target.
Items:
string, maxLength:200publishUrl:string | null, maxLength:2000Publish URL including its credential; write-only. null clears it.
Generated example:
json
{
"label": "",
"publishPrefixes": [
""
],
"publishUrl": null,
"expectedUpdatedAt": "2026-10-22T12:00:00.000Z"
}Content type: application/merge-patch+json
no additional properties
expectedUpdatedAt:string, format:date-timeThe updatedAt of the version being edited. Omit only for an intentional last-writer-wins update.
label:string, maxLength:80Human-readable label, trimmed; empty means unset.
publishPrefixes:array, maxItems:20Broadcast path prefixes relative to the project to publish to the target.
Items:
string, maxLength:200publishUrl:string | null, maxLength:2000Publish URL including its credential; write-only. null clears it.
Generated example:
json
{
"label": "",
"publishPrefixes": [
""
],
"publishUrl": null,
"expectedUpdatedAt": "2026-10-22T12:00:00.000Z"
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Sync Target
- Method:
DELETE - Path:
/projects/{pid}/sync/targets/{id} - Operation ID:
deleteSyncTarget - Tags: Sync
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Webhooks
- Method:
GET - Path:
/projects/{pid}/webhooks - Operation ID:
listWebhooks - Tags: Webhooks
Token permissions: media:read. Project role: write. Ordered by createdAt ascending, then id ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
dropped(required):numberEvents dropped because the delivery queue was full.
items(required): array of WebhookThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"url": "",
"events": [
""
],
"pattern": "",
"format": "",
"enabled": true,
"disabledReason": null,
"secret": "",
"failures": 1,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}
],
"nextCursor": null,
"dropped": 1
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Webhook
- Method:
POST - Path:
/projects/{pid}/webhooks - Operation ID:
createWebhook - Tags: Webhooks
Token permissions: media:write, keys:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
events(required):array, minItems:1, maxItems:5Event names to deliver; at least one.
Items:
string, possible values:"broadcast.started", "broadcast.ended", "recording.started", "recording.ready", "recording.failed"url(required):string, minLength:1, maxLength:2000HTTPS endpoint on a public host that receives signed deliveries.
format:string, possible values:"json", "slack", "discord"Delivery body, fixed at creation:
json(default) is the signed envelope;slackanddiscordpost an unsigned message to that platform's incoming-webhook URL.pattern:string, maxLength:500Broadcast path pattern relative to the project. Defaults to
**on create.
Generated example:
json
{
"url": "",
"events": [
"broadcast.started"
],
"pattern": "",
"format": "json"
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"url": "",
"events": [
""
],
"pattern": "",
"format": "",
"enabled": true,
"disabledReason": null,
"secret": "",
"failures": 1,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Webhook
- Method:
PATCH - Path:
/projects/{pid}/webhooks/{id} - Operation ID:
updateWebhook - Tags: Webhooks
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
enabled:booleantrue re-enables an endpoint that repeated failures disabled.
events:array, minItems:1, maxItems:5Event names to deliver; at least one.
Items:
string, possible values:"broadcast.started", "broadcast.ended", "recording.started", "recording.ready", "recording.failed"pattern:string, maxLength:500Broadcast path pattern relative to the project. Defaults to
**on create.url:string, minLength:1, maxLength:2000HTTPS endpoint on a public host that receives signed deliveries.
Generated example:
json
{
"url": "",
"events": [
"broadcast.started"
],
"pattern": "",
"enabled": true
}Content type: application/merge-patch+json
no additional properties
enabled:booleantrue re-enables an endpoint that repeated failures disabled.
events:array, minItems:1, maxItems:5Event names to deliver; at least one.
Items:
string, possible values:"broadcast.started", "broadcast.ended", "recording.started", "recording.ready", "recording.failed"pattern:string, maxLength:500Broadcast path pattern relative to the project. Defaults to
**on create.url:string, minLength:1, maxLength:2000HTTPS endpoint on a public host that receives signed deliveries.
Generated example:
json
{
"url": "",
"events": [
"broadcast.started"
],
"pattern": "",
"enabled": true
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Webhook
- Method:
DELETE - Path:
/projects/{pid}/webhooks/{id} - Operation ID:
deleteWebhook - Tags: Webhooks
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Test Webhook
- Method:
POST - Path:
/projects/{pid}/webhooks/{id}/test - Operation ID:
testWebhook - Tags: Webhooks
Token permissions: media:write. Project role: write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Responses
202 Accepted. The body is a receipt; the work completes asynchronously.
Content type: application/json
Generated example:
json
{
"eventId": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Webhook Deliveries
- Method:
GET - Path:
/projects/{pid}/webhooks/{id}/deliveries - Operation ID:
listWebhookDeliveries - Tags: Webhooks
Token permissions: media:read. Project role: write. Ordered by createdAt descending, then id descending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
id(required):string, minLength:1The resource's id field.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of DeliveryThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"eventId": "",
"type": "",
"state": "",
"attempts": 1,
"status": null,
"error": null,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Usage
- Method:
GET - Path:
/projects/{pid}/usage - Operation ID:
listUsage - Tags: Usage
Token permissions: usage:read. Project role: read. Ordered by periodStart ascending. A cursor retains the resolved from/to window and period for all pages.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
period:string, possible values:"minute", "hour", "day", "month", "year", "forever", default:"day"UTC calendar aggregation grain; defaults to day. from/to select whole periods by their start, without clipping quantities.
from:string, format:date-timeInclusive RFC 3339 period-start bound. Defaults to 30 days before to.
to:string, format:date-timeExclusive RFC 3339 period-start bound. Defaults to the request time; periods are selected by start, not clipped.
Responses
200 Success
Content type: application/json
allowances(required):objectMonthly pages only: each settled month's frozen allowance by its periodStart, or null while the account split is pending. Members only.
Additional properties:
from(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
items(required): array of UsageThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
period(required):stringThe resolved aggregation grain.
project(required):stringThe project's immutable id.
to(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
Generated example:
json
{
"items": [
{
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false
}
],
"nextCursor": null,
"project": "",
"period": "",
"from": "2026-10-22T12:00:00.000Z",
"to": "2026-10-22T12:00:00.000Z",
"allowances": {
"additionalProperty": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
}
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Current Usage
- Method:
GET - Path:
/projects/{pid}/usage/current - Operation ID:
getCurrentUsage - Tags: Usage
Token permissions: usage:read. Project role: read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"project": "",
"usage": {
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false,
"freeAllowance": {
"egressBytes": 1,
"storedGbSeconds": 1
},
"freeEgressBytes": 1,
"freeVodEgressBytes": 1,
"freeStoredGbSeconds": 1,
"freeRecordingBytes": 0,
"freeMicros": 1,
"netMicros": 1
},
"pool": {
"periodStart": "2026-10-22T12:00:00.000Z",
"available": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"projected": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"drawn": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"projects": 1
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Invoices
- Method:
GET - Path:
/projects/{pid}/invoices - Operation ID:
listInvoices - Tags: Invoices
Token permissions: billing:read. Project role: owner. Ordered by periodStart descending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of InvoiceThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"periodStart": "2026-10-22T12:00:00.000Z",
"grossMicros": 1000000,
"freeMicros": 1000000,
"netMicros": 1000000,
"creditAppliedMicros": 1000000,
"principalMicros": 1000000,
"amountChargedMicros": 1000000,
"status": "",
"hostedInvoiceUrl": null,
"poolProjects": null,
"createdAt": "2026-10-22T12:00:00.000Z"
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Spend Cap
- Method:
GET - Path:
/projects/{pid}/spend-cap - Operation ID:
getSpendCap - Tags: Spend-cap
Token permissions: billing:read. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"spendCapMicros": null,
"suspended": true,
"overFreeTier": true,
"spendCapReached": true,
"capReached": true,
"freeLimited": true,
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
]
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Set Spend Cap
- Method:
PATCH - Path:
/projects/{pid}/spend-cap - Operation ID:
setSpendCap - Tags: Spend-cap
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
spendCapMicros(required):number | null, minimum:1000000, maximum:1000000000000Monthly spend cap in micro-USD (1,000,000 = USD 1), from USD 1 to USD 1,000,000; null removes it.
Generated example:
json
{
"spendCapMicros": null
}Content type: application/merge-patch+json
no additional properties
spendCapMicros(required):number | null, minimum:1000000, maximum:1000000000000Monthly spend cap in micro-USD (1,000,000 = USD 1), from USD 1 to USD 1,000,000; null removes it.
Generated example:
json
{
"spendCapMicros": null
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Payment
- Method:
GET - Path:
/projects/{pid}/payment - Operation ID:
getPayment - Tags: Payment
Token permissions: billing:read. Project role: owner. The card summary, gate, contact, and spend cap.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"spendCapMicros": null,
"suspended": true,
"overFreeTier": true,
"spendCapReached": true,
"capReached": true,
"freeLimited": true,
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
],
"enabled": true,
"billingExempt": true,
"publishableKey": "",
"exposure": {
"periodStart": "2026-10-22T12:00:00.000Z",
"monthNetMicros": 1000000,
"spendCapMicros": 1000000,
"spendCapRemainingMicros": 1000000,
"spendCapReached": true,
"creditLimitMicros": 1000000,
"creditLimitRemainingMicros": 1000000,
"invoicedPrincipalMicros": 1000000,
"accruedPrincipalMicros": 1000000,
"absorbedMicros": 1000000,
"headroomMicros": 1000000,
"headroomSource": null,
"usableHeadroomMicros": 1000000,
"identityHold": true
},
"billingContact": "",
"billingRecipient": "",
"forgivenStatements": true,
"hasPaymentMethod": true,
"collectionMode": "",
"hasStripeCustomer": true,
"netTerms": "",
"netTermsDays": 1,
"creditLimitRequest": {
"creditLimitMicros": 1000000,
"reason": "",
"requestedAt": "2026-10-22T12:00:00.000Z"
},
"paymentLabel": null,
"paymentLast4": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Remove Payment Method
- Method:
DELETE - Path:
/projects/{pid}/payment - Operation ID:
removePaymentMethod - Tags: Payment
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"suspended": true,
"overFreeTier": true,
"spendCapReached": true,
"capReached": true,
"freeLimited": true,
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
]
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Credit Balance
- Method:
GET - Path:
/projects/{pid}/credit - Operation ID:
getCreditBalance - Tags: Credit
Token permissions: billing:read. Project role: read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
balanceMicros(required):integerAvailable in-app credit in micro-USD.
project(required):stringImmutable project id.
Generated example:
json
{
"project": "",
"balanceMicros": 1
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Payment Setup Link
- Method:
POST - Path:
/projects/{pid}/payment/setup-link - Operation ID:
createPaymentSetupLink - Tags: Payment
Token permissions: billing:write. Project role: owner. Hand this Stripe-hosted card-entry link to the cardholder. A signed Stripe completion records the card only while the issuer still owns the same billing account. No payment is taken by Checkout.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
url(required):string, format:uriStripe-hosted URL. Share only with the person managing payment.
Generated example:
json
{
"url": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Payment Setup Intent
- Method:
POST - Path:
/projects/{pid}/payment/setup-intent - Operation ID:
createPaymentSetupIntent - Tags: Payment
Token permissions: billing:write. Project role: owner. Embedded alternative to the hosted setup link. Confirm through Stripe.js, then call confirmPaymentMethod.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
clientSecret(required):stringStripe SetupIntent secret for the card-entry browser only.
Generated example:
json
{
"clientSecret": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Confirm Payment Method
- Method:
POST - Path:
/projects/{pid}/payment/confirm - Operation ID:
confirmPaymentMethod - Tags: Payment
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
setupIntentId(required):string, minLength:1The SetupIntent confirmed by Stripe.js.
Generated example:
json
{
"setupIntentId": ""
}Responses
200 Success
Content type: application/json
All of:
- BillingStatus
objectpaymentLabel(required):stringSaved method label.
paymentLast4(required):string | nullLast four digits, or null.
Generated example:
json
{
"suspended": true,
"overFreeTier": true,
"spendCapReached": true,
"capReached": true,
"freeLimited": true,
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
],
"paymentLabel": "",
"paymentLast4": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Billing Portal Link
- Method:
POST - Path:
/projects/{pid}/payment/portal - Operation ID:
createBillingPortalLink - Tags: Payment
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
url(required):string, format:uriStripe-hosted URL. Share only with the person managing payment.
Generated example:
json
{
"url": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Pay Now
- Method:
POST - Path:
/projects/{pid}/payment/retry - Operation ID:
payNow - Tags: Payment
Token permissions: billing:write. Project role: owner. Collect outstanding invoices using the card on file, through the existing settlement rules.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Set Billing Contact
- Method:
PATCH - Path:
/projects/{pid}/payment/contact - Operation ID:
setBillingContact - Tags: Payment
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
contact(required):string, maxLength:320Billing email; empty restores the owner's address.
Generated example:
json
{
"contact": ""
}Content type: application/merge-patch+json
no additional properties
contact(required):string, maxLength:320Billing email; empty restores the owner's address.
Generated example:
json
{
"contact": ""
}Responses
200 Success
Content type: application/json
billingContact(required):stringExplicit billing email; empty uses the owner's address.
billingRecipient(required):stringResolved address receiving billing mail.
Generated example:
json
{
"billingContact": "",
"billingRecipient": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Set Statement Preferences
- Method:
PATCH - Path:
/projects/{pid}/payment/statements - Operation ID:
setStatementPreferences - Tags: Payment
Token permissions: billing:write. Project role: owner. Turn the monthly statement for months with nothing to pay on or off.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
forgivenStatements(required):booleanSend the monthly statement for months with nothing to pay. Months that charge or owe always send.
Generated example:
json
{
"forgivenStatements": true
}Content type: application/merge-patch+json
no additional properties
forgivenStatements(required):booleanSend the monthly statement for months with nothing to pay. Months that charge or owe always send.
Generated example:
json
{
"forgivenStatements": true
}Responses
200 Success
Content type: application/json
forgivenStatements(required):booleanSend the monthly statement for months with nothing to pay. Months that charge or owe always send.
Generated example:
json
{
"forgivenStatements": true
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Billing Identity
- Method:
GET - Path:
/projects/{pid}/payment/identity - Operation ID:
getBillingIdentity - Tags: Payment
Token permissions: billing:read. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
identity(required): BillingIdentityStripe legal identity, or null before a billing account exists.
Generated example:
json
{
"identity": {
"companyName": "",
"address": {
"line1": "",
"line2": "",
"city": "",
"state": "",
"postalCode": "",
"country": ""
},
"taxId": {
"type": "",
"value": ""
}
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Set Billing Identity
- Method:
PATCH - Path:
/projects/{pid}/payment/identity - Operation ID:
setBillingIdentity - Tags: Payment
Token permissions: billing:write. Project role: owner. Supply the complete identity; empty address fields clear them and null clears the tax ID.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
address(required):object, no additional propertiesBilling address; empty fields clear them.
city(required):string, maxLength:200City.
country(required)ISO 3166-1 alpha-2 country; empty clears the address.
Any of:
string, possible values:""string, pattern:^[A-Za-z]{2}$
line1(required):string, maxLength:200Street line 1.
line2(required):string, maxLength:200Street line 2.
postalCode(required):string, maxLength:30Postal code.
state(required):string, maxLength:200State or region.
companyName(required):string, maxLength:200The legal entity billed; empty falls back to the email.
taxId(required):object | null, no additional propertiesOne tax registration, or null to clear it.
type(required):string, possible values:"eu_vat", "gb_vat", "ch_vat", "no_vat", "us_ein", "ca_bn", "ca_gst_hst", "au_abn", "nz_gst", "jp_ct", "kr_brn", "sg_uen", "in_gst", "br_cnpj", "mx_rfc", "za_vat", "ae_trn"Stripe tax id type.
value(required):string, maxLength:50The registration number.
Generated example:
json
{
"companyName": "",
"address": {
"line1": "",
"line2": "",
"city": "",
"state": "",
"postalCode": "",
"country": ""
},
"taxId": {
"type": "eu_vat",
"value": ""
}
}Content type: application/merge-patch+json
no additional properties
address(required):object, no additional propertiesBilling address; empty fields clear them.
city(required):string, maxLength:200City.
country(required)ISO 3166-1 alpha-2 country; empty clears the address.
Any of:
string, possible values:""string, pattern:^[A-Za-z]{2}$
line1(required):string, maxLength:200Street line 1.
line2(required):string, maxLength:200Street line 2.
postalCode(required):string, maxLength:30Postal code.
state(required):string, maxLength:200State or region.
companyName(required):string, maxLength:200The legal entity billed; empty falls back to the email.
taxId(required):object | null, no additional propertiesOne tax registration, or null to clear it.
type(required):string, possible values:"eu_vat", "gb_vat", "ch_vat", "no_vat", "us_ein", "ca_bn", "ca_gst_hst", "au_abn", "nz_gst", "jp_ct", "kr_brn", "sg_uen", "in_gst", "br_cnpj", "mx_rfc", "za_vat", "ae_trn"Stripe tax id type.
value(required):string, maxLength:50The registration number.
Generated example:
json
{
"companyName": "",
"address": {
"line1": "",
"line2": "",
"city": "",
"state": "",
"postalCode": "",
"country": ""
},
"taxId": {
"type": "eu_vat",
"value": ""
}
}Responses
200 Success
Content type: application/json
identity(required): BillingIdentityStripe legal identity, or null before a billing account exists.
Generated example:
json
{
"identity": {
"companyName": "",
"address": {
"line1": "",
"line2": "",
"city": "",
"state": "",
"postalCode": "",
"country": ""
},
"taxId": {
"type": "",
"value": ""
}
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Request Net Terms
- Method:
POST - Path:
/projects/{pid}/payment/net-terms - Operation ID:
requestNetTerms - Tags: Payment
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
netTerms(required):stringNet-terms approval state; empty means no request. Known values: "", "pending", "active", "cancelling", "revoking". Additional values may appear.
Generated example:
json
{
"netTerms": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Cancel Net Terms
- Method:
DELETE - Path:
/projects/{pid}/payment/net-terms - Operation ID:
cancelNetTerms - Tags: Payment
Token permissions: billing:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
netTerms(required):stringNet-terms approval state; empty means no request. Known values: "", "pending", "active", "cancelling", "revoking". Additional values may appear.
Generated example:
json
{
"netTerms": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Request Credit Limit
- Method:
POST - Path:
/projects/{pid}/payment/credit-limit - Operation ID:
requestCreditLimit - Tags: Payment
Token permissions: billing:write. Project role: owner. Request an increase; the approved limit and charges do not change until an operator approves it.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
creditLimitMicros(required):integer, maximum:1000000000000, exclusiveMinimum:0Requested credit limit in micro-USD, above the current limit.
reason(required):string, maxLength:500Why the higher limit is needed.
Generated example:
json
{
"creditLimitMicros": 1,
"reason": ""
}Responses
200 Success
Content type: application/json
creditLimitRequest(required): CreditLimitRequestResponseThe owner's pending request, or null.
Generated example:
json
{
"creditLimitRequest": {
"creditLimitMicros": 1000000,
"reason": "",
"requestedAt": "2026-10-22T12:00:00.000Z"
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Watch Notifications
- Method:
GET - Path:
/projects/{pid}/notifications/live - Operation ID:
watchNotifications - Tags: Notifications
Token permissions: settings:read. Project role: read. A read-only WebSocket of the project's billing notices, for the members and public viewers getProject admits. Open it as a WebSocket handshake; any other request is refused with 426. A browser authenticates with its session cookie from the dashboard's origin; an agent sends its token in the Authorization header. On connect and after every change the server sends a NotificationFrame as a JSON text message; apply a frame only when its seq exceeds the last one applied. The server answers the text message ping with pong and ignores any other message, so ping an idle socket to detect a dead connection (the dashboard pings every 30 seconds and redials after 95 seconds of silence). A socket receives frames for ten minutes after its handshake; the next change after that closes it with code 1000 instead, so reconnect, which authorizes again. Hide a notice with dismissNotification.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
101 Switching Protocols: the socket is open. Each server message is a NotificationFrame; see x-websocket.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Dismiss Notification
- Method:
POST - Path:
/projects/{pid}/notifications/dismiss - Operation ID:
dismissNotification - Tags: Notifications
Token permissions: settings:write. Project role: write. Hides an advisory billing notice from every member until the billing month ends. Returns the project's current notices.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
id(required):string, maxLength:64The notice's id. Only a notice whose dismissible is true can be dismissed.
Generated example:
json
{
"id": ""
}Responses
200 Success
Content type: application/json
Generated example:
json
{
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
]
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Tokens
- Method:
GET - Path:
/account/tokens - Operation ID:
listTokens - Tags: Tokens
Token permissions: credentials:read. Unrevoked tokens; an expired one stays listed until revoked. Ordered by createdAt descending, then id descending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of ApiTokenThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"name": "",
"prefix": "",
"permissions": {
"settings": "",
"keys": "",
"media": "",
"usage": "",
"lifecycle": "",
"members": "",
"billing": "",
"credentials": "",
"account": "",
"admin": ""
},
"projects": [
""
],
"audience": null,
"clientId": null,
"expiresAt": "2026-10-22T12:00:00.000Z",
"lastUsedAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z"
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Create Token
- Method:
POST - Path:
/account/tokens - Operation ID:
createToken - Tags: Tokens
Token permissions: credentials:write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Header parameters
Idempotency-Key(required):string, minLength:1, maxLength:512Required on every POST create. A quoted Structured Field string containing 1 to 255 ASCII characters, for example "request-123". Keep the same key and exact request bytes when retrying. Results, including one-time private material, replay for 24 hours per caller. Interrupted attempts recover within that window. Changed input returns 422; an attempt that cannot yet recover returns 409 idempotency_in_progress.
Request body
Required: true
Content type: application/json
no additional properties
name(required):string, minLength:1, maxLength:100Human-readable label.
permissions(required): PermissionsInputA level per permission family; an omitted family is none. See Permissions.
expiresAt:string | null, format:date-timeExpiry in the future. Omit or null for never; a token with admin expires within 90 days.
projects:(array of string) | null, minItems:1, maxItems:100Project ids to restrict it to, which allows only the project families. Omit or null for every project the account reaches.
Generated example:
json
{
"name": "github-actions",
"permissions": {
"settings": "none",
"keys": "none",
"media": "none",
"usage": "none",
"lifecycle": "none",
"members": "none",
"billing": "none",
"credentials": "none",
"account": "none",
"admin": "none"
},
"projects": [
""
],
"expiresAt": "2026-10-22T12:00:00.000Z"
}Responses
201 Created
Content type: application/json
Generated example:
json
{
"id": "",
"name": "",
"prefix": "",
"permissions": {
"settings": "",
"keys": "",
"media": "",
"usage": "",
"lifecycle": "",
"members": "",
"billing": "",
"credentials": "",
"account": "",
"admin": ""
},
"projects": [
""
],
"audience": null,
"clientId": null,
"expiresAt": "2026-10-22T12:00:00.000Z",
"lastUsedAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z",
"secret": ""
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Revoke Current Token
- Method:
DELETE - Path:
/account/tokens/current - Operation ID:
revokeCurrentToken - Tags: Tokens
Any token. Revokes the calling token: logout for an agent. A session cookie is refused.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Revoke Token
- Method:
DELETE - Path:
/account/tokens/{id} - Operation ID:
revokeToken - Tags: Tokens
Token permissions: credentials:write. Anything still using it gets 401 right away. A token revokes itself without credentials.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
id(required):string, minLength:1The token's id field.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Token
- Method:
PATCH - Path:
/account/tokens/{id} - Operation ID:
updateToken - Tags: Tokens
Token permissions: credentials:write. Narrows a token in place: a family may drop and never rise, and a project list may only lose projects. Restricting an all-projects token to projects needs every family outside the project ones at none.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
id(required):string, minLength:1The token's id field.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
permissionsAll of:
A level per permission family; an omitted family is none. See Permissions.
anyLower levels for the families named; omitted ones stay.
projects:array of string, minItems:1, maxItems:100The projects it keeps: a subset of its list, or any of yours for an all-projects token.
Generated example:
json
{
"permissions": {
"settings": "none",
"keys": "none",
"media": "none",
"usage": "none",
"lifecycle": "none",
"members": "none",
"billing": "none",
"credentials": "none",
"account": "none",
"admin": "none"
},
"projects": [
""
]
}Content type: application/merge-patch+json
no additional properties
permissionsAll of:
A level per permission family; an omitted family is none. See Permissions.
anyLower levels for the families named; omitted ones stay.
projects:array of string, minItems:1, maxItems:100The projects it keeps: a subset of its list, or any of yours for an all-projects token.
Generated example:
json
{
"permissions": {
"settings": "none",
"keys": "none",
"media": "none",
"usage": "none",
"lifecycle": "none",
"members": "none",
"billing": "none",
"credentials": "none",
"account": "none",
"admin": "none"
},
"projects": [
""
]
}Responses
200 Success
Content type: application/json
Generated example:
json
{
"id": "",
"name": "",
"prefix": "",
"permissions": {
"settings": "",
"keys": "",
"media": "",
"usage": "",
"lifecycle": "",
"members": "",
"billing": "",
"credentials": "",
"account": "",
"admin": ""
},
"projects": [
""
],
"audience": null,
"clientId": null,
"expiresAt": "2026-10-22T12:00:00.000Z",
"lastUsedAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z"
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Account
- Method:
GET - Path:
/account - Operation ID:
getAccount - Tags: Account
Token permissions: account:read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"id": "",
"email": "",
"name": "",
"isAdmin": true,
"ownedProjectCap": 1,
"domainLoginRequired": true,
"domainAccessExpiresAt": 1
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Account
- Method:
PATCH - Path:
/account - Operation ID:
updateAccount - Tags: Account
Token permissions: account:write.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
name:string, minLength:2, maxLength:100Account display name, between 2 and 100 characters. Omit to leave unchanged.
Generated example:
json
{
"name": ""
}Content type: application/merge-patch+json
no additional properties
name:string, minLength:2, maxLength:100Account display name, between 2 and 100 characters. Omit to leave unchanged.
Generated example:
json
{
"name": ""
}Responses
200 Success
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Account
- Method:
DELETE - Path:
/account - Operation ID:
deleteAccount - Tags: Account
Token permissions: account:write. Deletes the account and its owned projects in bounded steps. Every owned project is checked before any is deleted, then they are deleted a page at a time, each re-checked first. With Prefer: respond-async, a 202 means more remains: repeat with its nextStep as step until a 204. Banned projects or unpaid usage refuse deletion. Preview the affected projects first with getAccountDeletionPreview.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Query parameters
step:stringOpaque nextStep from the previous 202 response; omit to start deleting.
Header parameters
Prefer:stringSend respond-async (RFC 7240) to accept a 202 continuation. Without it, or a step, an account too large for one request is refused with 409 before anything is deleted.
Responses
202 Not finished. Repeat the request with nextStep as step to continue.
Content type: application/json
Generated example:
json
{
"nextStep": ""
}204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Account Usage
- Method:
GET - Path:
/account/usage - Operation ID:
getAccountUsage - Tags: Usage
Token permissions: billing:read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"periodStart": "2026-10-22T12:00:00.000Z",
"pooled": true,
"allowance": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"drawn": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"projects": [
{
"id": "",
"name": null,
"costMicros": 0,
"egressBytes": 1,
"storedGbSeconds": 1,
"share": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"freeMicros": 0,
"netMicros": 0
}
]
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Export Account
- Method:
GET - Path:
/account/export - Operation ID:
exportAccount - Tags: Export
Token permissions: account:read. Exports the account and every project it can see, in id order, a page at a time. Each page reads the account as it stands; keep the first page's.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"items": [
{
"id": "",
"name": null,
"role": "",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"domain": null,
"domainRole": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"billingIdentity": {
"companyName": "",
"address": {
"line1": "",
"line2": "",
"city": "",
"state": "",
"postalCode": "",
"country": ""
},
"taxId": {
"type": "",
"value": ""
}
},
"usage": {
"currentMonth": {
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false,
"freeAllowance": {
"egressBytes": 1,
"storedGbSeconds": 1
},
"freeEgressBytes": 1,
"freeVodEgressBytes": 1,
"freeStoredGbSeconds": 1,
"freeRecordingBytes": 0,
"freeMicros": 1,
"netMicros": 1
}
}
}
],
"nextCursor": null,
"exportedAt": "2026-10-22T12:00:00.000Z",
"account": {
"id": "",
"email": "",
"name": "",
"isAdmin": true,
"ownedProjectCap": 1,
"domainLoginRequired": true,
"domainAccessExpiresAt": 1
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Account Deletion Preview
- Method:
GET - Path:
/account/deletion-preview - Operation ID:
getAccountDeletionPreview - Tags: Deletion-preview
Token permissions: account:read. Lists the owned projects account deletion would destroy, in id order, a page at a time.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"items": [
{
"id": "",
"name": "",
"outstanding": true,
"banned": true,
"otherMembers": 0
}
],
"nextCursor": null,
"projects": [
{
"id": "",
"name": "",
"outstanding": true,
"banned": true,
"otherMembers": 0
}
]
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Passkeys
- Method:
GET - Path:
/account/passkeys - Operation ID:
listPasskeys - Tags: Passkeys
Token permissions: credentials:read. Passkeys that sign in to the account. Enrol one from the dashboard; that stays human. Ordered by createdAt descending, then id descending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of PasskeyThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"lastUsedAt": "2026-10-22T12:00:00.000Z",
"stale": true
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Delete Passkey
- Method:
DELETE - Path:
/account/passkeys/{id} - Operation ID:
deletePasskey - Tags: Passkeys
Token permissions: credentials:write. It stops signing in at once; sessions it already started continue.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
id(required):string, minLength:1The passkey's id field.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Revoke Current Session
- Method:
DELETE - Path:
/account/sessions/current - Operation ID:
revokeCurrentSession - Tags: Sessions
Any token. Signs out the calling browser session: logout for a person. The response clears its cookie. A token is refused; it revokes itself with revokeCurrentToken.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Revoke Sessions
- Method:
DELETE - Path:
/account/sessions - Operation ID:
revokeSessions - Tags: Sessions
Token permissions: credentials:write. Signs out everywhere: ends every browser session and revokes every API token and approved device grant on the account, the calling token included. A browser caller stays signed in: the response reissues its cookie, still bound to the session's original absolute expiry.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Members
- Method:
GET - Path:
/projects/{pid}/members - Operation ID:
listMembers - Tags: Members
Token permissions: members:read. Project role: read. Ordered by createdAt ascending, then accountId ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of ProjectMemberThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"accountId": "",
"email": "",
"role": "",
"createdAt": ""
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Update Member
- Method:
PATCH - Path:
/projects/{pid}/members/{accountId} - Operation ID:
updateMember - Tags: Members
Token permissions: members:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
accountId(required):string, minLength:1Member account id from the roster.
Request body
JSON Merge Patch: omitted fields remain unchanged, arrays replace, and null clears nullable fields.
Required: true
Content type: application/json
no additional properties
role(required):string, possible values:"read", "write"Member access; ownership moves only through an accepted transfer.
Generated example:
json
{
"role": "read"
}Content type: application/merge-patch+json
no additional properties
role(required):string, possible values:"read", "write"Member access; ownership moves only through an accepted transfer.
Generated example:
json
{
"role": "read"
}Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Remove Member
- Method:
DELETE - Path:
/projects/{pid}/members/{accountId} - Operation ID:
removeMember - Tags: Members
Token permissions: members:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
accountId(required):string, minLength:1Member account id from the roster.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
List Invitations
- Method:
GET - Path:
/projects/{pid}/invites - Operation ID:
listInvitations - Tags: Invites
Token permissions: members:read. Project role: read. Ordered by createdAt ascending, then email ascending.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Query parameters
limit:integer, minimum:1, maximum:200Maximum items per page, from 1 to 200.
cursor:stringOpaque nextCursor from the previous response. Keep the same resource and filters when continuing; omit for the first page.
Responses
200 Success
Content type: application/json
items(required): array of ProjectInvitationThis page's items, in the list's documented order.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"email": "",
"role": "",
"createdAt": ""
}
],
"nextCursor": null
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Invite Member
- Method:
POST - Path:
/projects/{pid}/invites - Operation ID:
inviteMember - Tags: Invites
Token permissions: members:write. Project role: owner. Existing accounts join immediately; other addresses receive a pending invite claimed on sign-in. Re-inviting a member leaves its role unchanged. Each call may resend mail under the existing inviter and recipient budgets; Idempotency-Key is not supported for this action. A 429 with Retry-After saves the pending invite but sends no email.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
email(required):string, format:emailEmail address to invite.
role:string, possible values:"read", "write"Access to grant; defaults to write.
Generated example:
json
{
"email": "",
"role": "read"
}Responses
201 Created
Content type: application/json
pending(required):booleanTrue when the email has no account yet. The invite is claimed on sign-in or by acceptInvitation.
Generated example:
json
{
"pending": true
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Revoke Invitation
- Method:
DELETE - Path:
/projects/{pid}/invites - Operation ID:
revokeInvitation - Tags: Invites
Token permissions: members:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
email(required):string, format:emailInvited email address.
Generated example:
json
{
"email": ""
}Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Accept Invitation
- Method:
POST - Path:
/projects/{pid}/invites/accept - Operation ID:
acceptInvitation - Tags: Invites
Token permissions: members:write. Claims only the authenticated account's email invitation. No membership is needed; a token cannot accept for another account. Sign-in also claims pending invitations automatically.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Get Ownership Transfer
- Method:
GET - Path:
/projects/{pid}/transfer - Operation ID:
getOwnershipTransfer - Tags: Transfer
Token permissions: members:read. Project role: read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
200 Success
Content type: application/json
Generated example:
json
{
"pending": {
"toAccountId": "",
"toEmail": "",
"fromAccountId": "",
"fromEmail": ""
}
}4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Offer Ownership Transfer
- Method:
POST - Path:
/projects/{pid}/transfer - Operation ID:
offerOwnershipTransfer - Tags: Transfer
Token permissions: members:write. Project role: owner. Replaces the outstanding offer; banned projects cannot be transferred.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
email(required):string, format:emailExisting direct Editor member to receive ownership.
Generated example:
json
{
"email": ""
}Responses
201 Created
Content type: application/json
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Cancel Ownership Transfer
- Method:
DELETE - Path:
/projects/{pid}/transfer - Operation ID:
cancelOwnershipTransfer - Tags: Transfer
Token permissions: members:write. Project role: owner.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Accept Ownership Transfer
- Method:
POST - Path:
/projects/{pid}/transfer/accept - Operation ID:
acceptOwnershipTransfer - Tags: Transfer
Token permissions: members:write. Project role: read. Only the recipient's own account can accept. Existing owner caps, ban, net-terms and billing handoff checks apply.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Request body
Required: true
Content type: application/json
no additional properties
sameEntity(required):booleanTrue retains the billed company and removes its card; false clears billing identity and writes off unpaid invoices. The recipient chooses explicitly.
Generated example:
json
{
"sameEntity": true
}Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Decline Ownership Transfer
- Method:
POST - Path:
/projects/{pid}/transfer/decline - Operation ID:
declineOwnershipTransfer - Tags: Transfer
Token permissions: members:write. Project role: read.
Servers: Inherited servers
Authentication
bearerAuth: HTTP bearer (
moqpro_)An account API token from the dashboard's account settings,
moqpro_and 46 base62 characters. A token holds a level (none, read, or write) per permission family, and each operation's x-permissions names the levels it needs. The project families are settings, keys (keys & secrets), media (recording, transcode, agent, sync, webhooks), and usage; keys:write is the only level that reveals a secret or mints a credential. The owner families are lifecycle (create and delete projects), members (members, invites, transfer), and billing; the account families are credentials (tokens, passkeys, sessions) and account (profile, export, deletion). A token restricted to projects reaches only those and holds only project families. Either way, the account's role on each project still applies. Any token can revoke itself.
Or:
sessionCookie: API key in cookie
__Host-moq_sessionThe dashboard's session.
Path parameters
pid(required):string, minLength:1Immutable public project id from Project.id; vanity names are refused.
Responses
204 Success. The response has no body.
4XX, 5XX
4XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.5XXRequest refused. 400 invalid input; 401 authentication; 403 permission; 404 missing resource; 409 conflict (see code; idempotency_in_progress means in flight, keep the same key); 415 unsupported JSON media type; 422 changed idempotent input; 429 rate limited; 500 internal error; 503 unavailable.
Content type: application/json
Start device login
- Method:
POST - Path:
/oauth/device - Operation ID:
authorizeDevice - Tags: OAuth
Servers: Inherited servers
Authentication
No authentication required.
Request body
Required: true
Content type: application/x-www-form-urlencoded
no additional properties
client_id(required):string, possible values:"moq-pro"This CLI's registered OAuth client id.
name:string, minLength:1, maxLength:100Requester-chosen token name; defaults to moq-pro CLI.
projects:string, minLength:1, maxLength:5000Space-separated project ids. Omit for all current and future projects the account can access.
scope:string, default:"write", minLength:1, maxLength:1000Permissions requested, space-separated: family:level entries such as media:write or billing:read, or the presets read and write, which set every project family (settings, keys, media, usage) at that level; write on all projects adds lifecycle:write. The highest level asked for a family wins. Families outside the project ones need all projects; admin is never granted here.
Generated example:
json
{
"client_id": "moq-pro",
"name": "",
"scope": "write",
"projects": ""
}Responses
200 Show the URL and code to the human. Never approve automatically.
Content type: application/json
device_code(required):stringSecret polling code for the token exchange; never show it.
expires_in(required):integerSeconds until the device_code expires.
interval(required):integerMinimum seconds between token polls.
user_code(required):stringShort code the human confirms in the browser.
verification_uri(required):string, format:uriWhere the human approves the login.
verification_uri_complete(required):string, format:uriverification_uri with the user_code filled in.
Generated example:
json
{
"device_code": "",
"user_code": "",
"verification_uri": "",
"verification_uri_complete": "",
"expires_in": 1,
"interval": 1
}400 Invalid client, scope, or request.
Content type: application/json
error(required):stringRFC 6749 error code.
error_description:stringHuman-readable explanation.
Generated example:
json
{
"error": "",
"error_description": ""
}429 IP rate limit reached. Stop and start login again later.
Content type: application/json
error(required):stringRFC 6749 error code.
error_description:stringHuman-readable explanation.
Generated example:
json
{
"error": "",
"error_description": ""
}Poll device login
- Method:
POST - Path:
/oauth/token - Operation ID:
exchangeDeviceCode - Tags: OAuth
Servers: Inherited servers
Authentication
No authentication required.
Request body
Required: true
Content type: application/x-www-form-urlencoded
no additional properties
client_id(required):string, possible values:"moq-pro"This CLI's registered OAuth client id.
device_code(required):string, pattern:^[A-Za-z0-9_-]{43}$The device_code from the device login response.
grant_type(required):string, possible values:"urn:ietf:params:oauth:grant-type:device_code"The RFC 8628 device-code grant type.
Generated example:
json
{
"client_id": "moq-pro",
"grant_type": "urn:ietf:params:oauth:grant-type:device_code",
"device_code": ""
}Responses
200 An ordinary, revocable account token that expires after 90 days. No refresh token; log in again.
Content type: application/json
access_token(required):stringAccount API token for the Authorization: Bearer header.
scope(required):stringPermissions granted, space-separated family:level entries for each family above none.
token_type(required):stringAlways Bearer. Known values: "Bearer". Additional values may appear.
Generated example:
json
{
"access_token": "",
"token_type": "",
"scope": ""
}400 authorization_pending: keep polling at interval. slow_down: increase interval by 5 seconds for all subsequent polls. access_denied, expired_token, invalid_grant: stop.
Content type: application/json
error(required):stringRFC 6749 error code.
error_description:stringHuman-readable explanation.
Generated example:
json
{
"error": "",
"error_description": ""
}429 IP rate limit reached. Stop and start login again later.
Content type: application/json
error(required):stringRFC 6749 error code.
error_description:stringHuman-readable explanation.
Generated example:
json
{
"error": "",
"error_description": ""
}Webhooks
broadcast.started
- Method:
POST - Webhook:
broadcast.started
Signed JSON delivery to your configured endpoint. Verify the raw request body and Moq-Signature before processing. Delivery, retry and rotation contract: https://doc.moq.pro/webhooks.
Servers: Inherited servers
Authentication
No authentication required.
Header parameters
Moq-Signature(required):stringt=,v1=<lowercase hex HMAC-SHA256(secret, t + '.' + raw body)>. Reject timestamps more than 300 seconds from your server time.
Request body
Required: true
Content type: application/json
created_at(required):stringWhen the API emitted this event, in UTC.
data(required):objectat(required):stringSource observation time in UTC, independent of the envelope creation time.
path(required):stringBroadcast path relative to the project.
backfill:booleanA live path discovered in a snapshot, including when started events turn on. Known values: true. Additional values may appear.
id(required):stringStable event identifier. Deduplicate on this, including across endpoints.
project(required):stringImmutable project pid.
type(required):stringKnown values: "broadcast.started". Additional values may appear.
Generated example:
json
{
"id": "",
"type": "",
"created_at": "",
"project": "",
"data": {
"path": "",
"at": "",
"backfill": true
}
}Responses
2XX Event durably accepted. Any non-2xx response fails this attempt; transient failures may retry.
broadcast.ended
- Method:
POST - Webhook:
broadcast.ended
Signed JSON delivery to your configured endpoint. Verify the raw request body and Moq-Signature before processing. Delivery, retry and rotation contract: https://doc.moq.pro/webhooks.
Servers: Inherited servers
Authentication
No authentication required.
Header parameters
Moq-Signature(required):stringt=,v1=<lowercase hex HMAC-SHA256(secret, t + '.' + raw body)>. Reject timestamps more than 300 seconds from your server time.
Request body
Required: true
Content type: application/json
created_at(required):stringWhen the API emitted this event, in UTC.
data(required):objectat(required):stringSource observation time in UTC, independent of the envelope creation time.
path(required):stringBroadcast path relative to the project.
reason(required):stringKnown values: "unannounced", "connection_lost". Additional values may appear.
id(required):stringStable event identifier. Deduplicate on this, including across endpoints.
project(required):stringImmutable project pid.
type(required):stringKnown values: "broadcast.ended". Additional values may appear.
Generated example:
json
{
"id": "",
"type": "",
"created_at": "",
"project": "",
"data": {
"path": "",
"at": "",
"reason": ""
}
}Responses
2XX Event durably accepted. Any non-2xx response fails this attempt; transient failures may retry.
recording.started
- Method:
POST - Webhook:
recording.started
Signed JSON delivery to your configured endpoint. Verify the raw request body and Moq-Signature before processing. Delivery, retry and rotation contract: https://doc.moq.pro/webhooks.
Servers: Inherited servers
Authentication
No authentication required.
Header parameters
Moq-Signature(required):stringt=,v1=<lowercase hex HMAC-SHA256(secret, t + '.' + raw body)>. Reject timestamps more than 300 seconds from your server time.
Request body
Required: true
Content type: application/json
created_at(required):stringWhen the API emitted this event, in UTC.
data(required):objectat(required):stringSource observation time in UTC, independent of the envelope creation time.
generationId(required):stringPhysical generation: //.
path(required):stringBroadcast path relative to the project.
recordingId(required):stringLogical recording: /.
bucket:stringCustomer bucket name. Omitted for managed recordings.
masterPlaylist:stringMaster playlist URI relative to objectPrefix, or the managed playback URL's directory.
objectPrefix:stringGeneration's object-key prefix, including its trailing /. BYOB only.
renditions:arrayEmpty at start; exported renditions when ready, acknowledged media renditions when failed.
Items:
kind(required):stringKnown values: "video", "audio". Additional values may appear.
name(required):stringplaylist(required):stringRendition playlist URI relative to the same directory as masterPlaylist.
height:integer, exclusiveMinimum:0Video height in pixels, when known.
width:integer, exclusiveMinimum:0Video width in pixels, when known.
id(required):stringStable event identifier. Deduplicate on this, including across endpoints.
project(required):stringImmutable project pid.
type(required):stringKnown values: "recording.started". Additional values may appear.
Generated example:
json
{
"id": "",
"type": "",
"created_at": "",
"project": "",
"data": {
"path": "",
"at": "",
"recordingId": "",
"generationId": "",
"bucket": "",
"objectPrefix": "",
"masterPlaylist": "",
"renditions": [
{
"name": "",
"kind": "",
"playlist": "",
"width": 1,
"height": 1
}
]
}
}Responses
2XX Event durably accepted. Any non-2xx response fails this attempt; transient failures may retry.
recording.ready
- Method:
POST - Webhook:
recording.ready
Signed JSON delivery to your configured endpoint. Verify the raw request body and Moq-Signature before processing. Delivery, retry and rotation contract: https://doc.moq.pro/webhooks.
Servers: Inherited servers
Authentication
No authentication required.
Header parameters
Moq-Signature(required):stringt=,v1=<lowercase hex HMAC-SHA256(secret, t + '.' + raw body)>. Reject timestamps more than 300 seconds from your server time.
Request body
Required: true
Content type: application/json
created_at(required):stringWhen the API emitted this event, in UTC.
data(required):objectat(required):stringSource observation time in UTC, independent of the envelope creation time.
generationId(required):stringPhysical generation: //.
path(required):stringBroadcast path relative to the project.
recordingId(required):stringLogical recording: /.
bucket:stringCustomer bucket name. Omitted for managed recordings.
durationMs:number, minimum:0Recorded media duration in milliseconds, not elapsed wall time.
masterPlaylist:stringMaster playlist URI relative to objectPrefix, or the managed playback URL's directory.
objectPrefix:stringGeneration's object-key prefix, including its trailing /. BYOB only.
regression:string | nullDiagnostic explaining why this generation ended after its source reused an epoch with conflicting or backwards media; null when none was reported. Not an enum or an export failure. Older queued events may omit it.
renditions:arrayEmpty at start; exported renditions when ready, acknowledged media renditions when failed.
Items:
kind(required):stringKnown values: "video", "audio". Additional values may appear.
name(required):stringplaylist(required):stringRendition playlist URI relative to the same directory as masterPlaylist.
height:integer, exclusiveMinimum:0Video height in pixels, when known.
width:integer, exclusiveMinimum:0Video width in pixels, when known.
id(required):stringStable event identifier. Deduplicate on this, including across endpoints.
project(required):stringImmutable project pid.
type(required):stringKnown values: "recording.ready". Additional values may appear.
Generated example:
json
{
"id": "",
"type": "",
"created_at": "",
"project": "",
"data": {
"path": "",
"at": "",
"recordingId": "",
"generationId": "",
"bucket": "",
"objectPrefix": "",
"masterPlaylist": "",
"renditions": [
{
"name": "",
"kind": "",
"playlist": "",
"width": 1,
"height": 1
}
],
"regression": null,
"durationMs": 0
}
}Responses
2XX Event durably accepted. Any non-2xx response fails this attempt; transient failures may retry.
recording.failed
- Method:
POST - Webhook:
recording.failed
Signed JSON delivery to your configured endpoint. Verify the raw request body and Moq-Signature before processing. Delivery, retry and rotation contract: https://doc.moq.pro/webhooks.
Servers: Inherited servers
Authentication
No authentication required.
Header parameters
Moq-Signature(required):stringt=,v1=<lowercase hex HMAC-SHA256(secret, t + '.' + raw body)>. Reject timestamps more than 300 seconds from your server time.
Request body
Required: true
Content type: application/json
created_at(required):stringWhen the API emitted this event, in UTC.
data(required):objectat(required):stringSource observation time in UTC, independent of the envelope creation time.
generationId(required):stringPhysical generation: //.
mediaWritten(required):booleanWhether this generation acknowledged any uploaded media before failing.
path(required):stringBroadcast path relative to the project.
reason(required):stringBucket refused an upload, export could not be rendered, or platform storage/export failed. Known values: "bucket_refusal", "export_failure", "platform_error". Additional values may appear.
recordingId(required):stringLogical recording: /.
bucket:stringCustomer bucket name. Omitted for managed recordings.
masterPlaylist:stringMaster playlist URI relative to objectPrefix, or the managed playback URL's directory.
objectPrefix:stringGeneration's object-key prefix, including its trailing /. BYOB only.
regression:string | nullDiagnostic explaining why this generation ended after its source reused an epoch with conflicting or backwards media; null when none was reported. Not an enum or an export failure. Older queued events may omit it.
renditions:arrayEmpty at start; exported renditions when ready, acknowledged media renditions when failed.
Items:
kind(required):stringKnown values: "video", "audio". Additional values may appear.
name(required):stringplaylist(required):stringRendition playlist URI relative to the same directory as masterPlaylist.
height:integer, exclusiveMinimum:0Video height in pixels, when known.
width:integer, exclusiveMinimum:0Video width in pixels, when known.
id(required):stringStable event identifier. Deduplicate on this, including across endpoints.
project(required):stringImmutable project pid.
type(required):stringKnown values: "recording.failed". Additional values may appear.
Generated example:
json
{
"id": "",
"type": "",
"created_at": "",
"project": "",
"data": {
"path": "",
"at": "",
"recordingId": "",
"generationId": "",
"bucket": "",
"objectPrefix": "",
"masterPlaylist": "",
"renditions": [
{
"name": "",
"kind": "",
"playlist": "",
"width": 1,
"height": 1
}
],
"regression": null,
"reason": "",
"mediaWritten": true
}
}Responses
2XX Event durably accepted. Any non-2xx response fails this attempt; transient failures may retry.
webhook.test
- Method:
POST - Webhook:
webhook.test
Signed JSON delivery to your configured endpoint. Verify the raw request body and Moq-Signature before processing. Delivery, retry and rotation contract: https://doc.moq.pro/webhooks.
Servers: Inherited servers
Authentication
No authentication required.
Header parameters
Moq-Signature(required):stringt=,v1=<lowercase hex HMAC-SHA256(secret, t + '.' + raw body)>. Reject timestamps more than 300 seconds from your server time.
Request body
Required: true
Content type: application/json
created_at(required):stringWhen the API emitted this event, in UTC.
data(required):objectendpoint(required):stringThe endpoint receiving this test delivery.
id(required):stringStable event identifier. Deduplicate on this, including across endpoints.
project(required):stringImmutable project pid.
type(required):stringKnown values: "webhook.test". Additional values may appear.
Generated example:
json
{
"id": "",
"type": "",
"created_at": "",
"project": "",
"data": {
"endpoint": ""
}
}Responses
2XX Event durably accepted. Any non-2xx response fails this attempt; transient failures may retry.
Schemas
AdminProjectPage
Type: object
items(required):arrayThis page's items, in the list's documented order.
Items:
Any of:
objectaccount(required):object | nullThe account: the project's owner, or the signup on a project-less row.
createdAt(required):string, format:date-timeWhen the account signed up. RFC 3339, UTC.
email(required):stringAccount sign-in email.
id(required):stringAccount id.
billingKnown(required):booleanFalse until this project's billing fields are first published: billingRecipient through stripeRefused are then unknown, not empty, and the row counts as attention.
billingRecipient(required):string | nullWhere invoices are mailed, or null.
createdAt(required):string, format:date-timeWhen the project was created. RFC 3339, UTC.
creditLimitMicros(required):integer | nullNet-terms credit limit, or null when unset. Micro-USD (1,000,000 = USD 1).
creditLimitRequestMicros(required):integer | nullOwner's pending credit-limit request, or null. Micro-USD (1,000,000 = USD 1).
hasPaymentMethod(required):booleanA card is on file.
id(required):stringImmutable public project id, the {pid} path parameter.
invoicedDaysPastDue(required):integer, minimum:0Days the oldest unpaid net-terms invoice is past due.
invoicedMicros(required):integerInvoiced on net terms and unpaid. Micro-USD (1,000,000 = USD 1).
name(required):string | nullProject name, or null when unnamed.
netTerms(required):stringNet-terms state: empty for card billing, then pending approval, active (invoiced on terms), cancelling, or revoking. Known values: "", "pending", "active", "cancelling", "revoking". Additional values may appear.
ownerEmail(required):string | nullOwner's email, or null for an ownerless project.
spendCapMicros(required):integer | nullOwner's monthly spend cap, or null for none. Micro-USD (1,000,000 = USD 1).
staleAt(required):string | null, format:date-timeWhen the heartbeat counts as stale, or null when quiesced. RFC 3339, UTC.
stripeRefused(required):array of stringStripe ids queued for removal that Stripe refused; remove each by hand.
stuckHeartbeats(required):integer, minimum:0Consecutive billing heartbeats that failed to publish.
ticking(required):booleanThe billing heartbeat still has work, so updatedAt can go stale.
uncollectibleMicros(required):integerDebt Stripe stopped collecting that nobody has written off. Micro-USD (1,000,000 = USD 1).
updatedAt(required):string | null, format:date-timeWhen the figures were last published, or null if never. RFC 3339, UTC.
usage(required):object | nullThis month's published figures, or null when the latest summary is older (the project is idle).
absorbedMicros(required):integerMetered past the spend cap or credit limit; never billed. Micro-USD (1,000,000 = USD 1).
costMicros(required):integerMonth-to-date metered cost before the free tier. Micro-USD (1,000,000 = USD 1).
egressExternalBytes(required):integer, minimum:0Live delivery to viewers this month. Decimal bytes.
freeMicros(required):integerMonth-to-date cost the free tier covered. Micro-USD (1,000,000 = USD 1).
freeTierFraction(required):number, minimum:0Share of the free allowance used, where 1 is exhausted; saturates rather than overflowing.
netMicros(required):integerMonth-to-date billable net after the free tier. Micro-USD (1,000,000 = USD 1).
storedGbSeconds(required):number, minimum:0Managed storage held this month, GB·second, decimal GB.
vodEgressBytes(required):integer, minimum:0Recording delivery this month. Decimal bytes.
vodRecordingBytes(required):integer, minimum:0Managed recording written this month. Decimal bytes.
freeAllowance:objectThe allowance the figures were measured against; absent from older summaries.
egressBytes(required):integer, minimum:0Delivery allowance this month. Decimal bytes.
storedGbSeconds(required):number, minimum:0Storage allowance this month, GB·second, decimal GB.
objectsort=newest only: an account without a live project.
account(required):objectThe account: the project's owner, or the signup on a project-less row.
createdAt(required):string, format:date-timeWhen the account signed up. RFC 3339, UTC.
email(required):stringAccount sign-in email.
id(required):stringAccount id.
id(required):nullNull: this account owns no live project.
month(required):string, format:date-timeStart of the billing month the figures cover. RFC 3339, UTC.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
now(required):string, format:date-timeServer time of the read. RFC 3339, UTC.
oldestUpdatedAt(required):string | null, format:date-timeOldest publish among this page's ticking rows, or null when none has one. RFC 3339, UTC.
totals(required):objectThe month's platform totals over the usage listing, whatever the sort or page.
absorbedMicros(required):integerMetered past caps and limits this month; never billed. Micro-USD (1,000,000 = USD 1).
attention(required):integer, minimum:0Listed projects in an attention state.
billed(required):integer, minimum:0Listed projects that owe money.
costMicros(required):integerMetered cost this month. Micro-USD (1,000,000 = USD 1).
egressExternalBytes(required):integer, minimum:0Live delivery this month. Decimal bytes.
listed(required):integer, minimum:0Projects in the usage listing.
netMicros(required):integerBillable net this month. Micro-USD (1,000,000 = USD 1).
storedGbSeconds(required):number, minimum:0Managed storage this month, GB·second, decimal GB.
Generated example:
json
{
"items": [
{
"account": {
"id": "",
"email": "",
"createdAt": "2026-10-22T12:00:00.000Z"
},
"id": "p123example",
"name": null,
"ownerEmail": null,
"billingKnown": true,
"billingRecipient": null,
"netTerms": "",
"creditLimitMicros": 1000000,
"spendCapMicros": 1000000,
"creditLimitRequestMicros": 1000000,
"hasPaymentMethod": true,
"invoicedMicros": 1000000,
"invoicedDaysPastDue": 0,
"uncollectibleMicros": 1000000,
"stuckHeartbeats": 0,
"stripeRefused": [
""
],
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z",
"ticking": true,
"staleAt": "2026-10-22T12:00:00.000Z",
"usage": {
"egressExternalBytes": 0,
"vodEgressBytes": 0,
"storedGbSeconds": 0,
"vodRecordingBytes": 0,
"costMicros": 1000000,
"freeMicros": 1000000,
"netMicros": 1000000,
"absorbedMicros": 1000000,
"freeTierFraction": 0,
"freeAllowance": {
"egressBytes": 0,
"storedGbSeconds": 0
}
}
}
],
"nextCursor": null,
"month": "2026-10-22T12:00:00.000Z",
"now": "2026-10-22T12:00:00.000Z",
"oldestUpdatedAt": "2026-10-22T12:00:00.000Z",
"totals": {
"listed": 0,
"billed": 0,
"attention": 0,
"egressExternalBytes": 0,
"storedGbSeconds": 0,
"costMicros": 1000000,
"netMicros": 1000000,
"absorbedMicros": 1000000
}
}ApiError
Type: object
code(required):stringKnown values: "invalid_request", "unauthenticated", "forbidden", "not_found", "conflict", "rate_limited", "unavailable", "internal_error", "already_exists", "limit_reached", "invalid_state", "idempotency_in_progress". Additional values may appear.
message(required):stringHuman-readable explanation; do not match on it.
errors:arrayEach invalid input value, on a 400 validation refusal.
Items:
code(required):stringValidation issue code, such as invalid_type or unrecognized_keys.
message(required):stringHuman-readable explanation of the issue.
path(required):array of (string | number)Location of the invalid value; empty for the whole input.
lockedUntil:string, format:date-timeWhen a refused rename may be retried, RFC 3339; set only for a rename lock.
Generated example:
json
{
"code": "",
"message": "",
"errors": [
{
"path": [
""
],
"code": "",
"message": ""
}
],
"lockedUntil": ""
}CreatedApiToken
All of:
- ApiToken
objectsecret(required):stringThe token, on creation only. Only its hash is kept; save it before discarding the response.
Permissions
Type: object, no additional properties
A level per permission family: none, read, or write. Project families (settings, keys, media, usage) reach the token's projects; the rest need an all-projects token. keys write is the only level that reveals a secret or mints a credential.
account(required):stringAccount: profile, data export, and deletion. Known values: "none", "read", "write". Additional values may appear.
admin(required):stringSite admin: operator routes, for a site admin. Known values: "none", "read", "write". Additional values may appear.
billing(required):stringBilling: payment, spend caps, invoices, credit, and account usage. Known values: "none", "read", "write". Additional values may appear.
credentials(required):stringCredentials: API tokens, passkeys, and sessions. Known values: "none", "read", "write". Additional values may appear.
keys(required):stringKeys & secrets: signing keys and the auth endpoint; write also reveals every secret and mints relay tokens. Known values: "none", "read", "write". Additional values may appear.
lifecycle(required):stringProject lifecycle: create and delete projects. Known values: "none", "write". Additional values may appear.
media(required):stringMedia rules: recording, transcode, agent, sync, and webhooks. Known values: "none", "read", "write". Additional values may appear.
members(required):stringMembers & invites: members, invitations, and ownership transfer. Known values: "none", "read", "write". Additional values may appear.
settings(required):stringProject settings: the project itself, its session limits, and its notices. Known values: "none", "read", "write". Additional values may appear.
usage(required):stringUsage & stats: metered usage. Known values: "none", "read". Additional values may appear.
Generated example:
json
{
"settings": "",
"keys": "",
"media": "",
"usage": "",
"lifecycle": "",
"members": "",
"billing": "",
"credentials": "",
"account": "",
"admin": ""
}ApiToken
Type: object
audience(required):string | nullmcp for a token an MCP client signed in for, the only kind /mcp accepts; null otherwise. Known values: "mcp", null. Additional values may appear.
clientId(required):string | nullThe client ID metadata document URL of the MCP client the token was issued to, or null. Its host is who published the client; the name is the client's own claim.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
expiresAt(required):string | null, format:date-timeWhen it stops working, or null for never.
id(required):stringOpaque resource identifier.
lastUsedAt(required):string | null, format:date-timeLast authenticated call, to the minute, or null before any.
name(required):stringHuman-readable label.
permissions(required): PermissionsA level per permission family: none, read, or write. Project families (settings, keys, media, usage) reach the token's projects; the rest need an all-projects token. keys write is the only level that reveals a secret or mints a credential.
prefix(required):stringThe secret's first characters, to recognize it; never enough to use it.
projects(required):(array of string) | nullThe project ids it is restricted to, or null for every project the account reaches.
Generated example:
json
{
"id": "",
"name": "",
"prefix": "",
"permissions": {
"settings": "",
"keys": "",
"media": "",
"usage": "",
"lifecycle": "",
"members": "",
"billing": "",
"credentials": "",
"account": "",
"admin": ""
},
"projects": [
""
],
"audience": null,
"clientId": null,
"expiresAt": "2026-10-22T12:00:00.000Z",
"lastUsedAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z"
}AdminProject
Type: object
banned(required):booleanSticky abuse ban set by an operator.
billingExempt(required):booleanA platform project that is never billed.
billingRecipient(required):string | nullWhere invoices are mailed, or null.
capReached(required):booleanThe owner's spend cap is reached and gates traffic.
createdAt(required):string, format:date-timeWhen the project was created. RFC 3339, UTC.
creditBalanceMicros(required):integerUnspent credit. Micro-USD (1,000,000 = USD 1).
creditLedger(required):arrayEvery credit grant, draw, claw-back, and restore.
Items:
actor(required):stringOperator account id, or empty for a system-recorded draw.
actorEmail(required):string | nullThe actor's email, or null.
amountMicros(required):integerSigned: grants and restores are positive, draws and claw-backs negative. Micro-USD (1,000,000 = USD 1).
createdAt(required):string, format:date-timeWhen the entry was recorded. RFC 3339, UTC.
id(required):stringLedger entry id.
kind(required):stringgrant (operator), applied (drawn against an invoice), revoked (operator claw-back), or restored (a draw returned when its invoice was forgiven). Known values: "grant", "applied", "revoked", "restored". Additional values may appear.
periodStart(required):string | null, format:date-timeThe billing month an applied entry drew against, or null. RFC 3339, UTC.
reason(required):stringThe operator's note; empty for system entries.
creditLimitRequest(required): CreditLimitRequestResponseThe owner's pending request, or null.
enforceSuspension(required):booleanWhether a suspended project's traffic is currently cut off.
exposure(required): BillingExposurefreeLimited(required):booleanThe free-tier limit gates this project's traffic.
hasPaymentMethod(required):booleanA card is on file.
id(required):stringImmutable public project id, the {pid} path parameter.
invoices(required):arrayThe project's invoices.
Items:
amountChargedMicros(required):integerWhat was charged. Micro-USD (1,000,000 = USD 1).
amountRemainingMicros(required):integer | nullStripe's unpaid remainder, or null until a reconcile reports it. Micro-USD (1,000,000 = USD 1).
creditAppliedMicros(required):integerCredit drawn against this invoice. Micro-USD (1,000,000 = USD 1).
freeMicros(required):integerCost the free tier covered. Micro-USD (1,000,000 = USD 1).
grossMicros(required):integerMetered cost before the free tier. Micro-USD (1,000,000 = USD 1).
heldReleased(required):booleanAn operator released this held invoice for charging.
netMicros(required):integerBillable net after the free tier. Micro-USD (1,000,000 = USD 1).
periodStart(required):string, format:date-timeStart of the billed month; the {periodStart} path parameter. RFC 3339, UTC.
principalMicros(required):integerExactly what Stripe is asked to collect. Micro-USD (1,000,000 = USD 1).
status(required):stringInvoice ledger state: pending, paid, failed, no_card, held, invoiced, forgiven, invoice_void, invoice_uncollectible, invoice_writeoff_pending, or invoice_written_off.
stripeInvoiceId(required):string | nullThe Stripe invoice id, or null when none was issued.
superseded(required):arrayVoided Stripe invoices this month was reissued from, oldest first.
Items:
invoiceId(required):stringThe ledger row that moved on.
pending(required):booleanThe replacement is still a draft the customer has not been sent.
reason(required):stringWhy it was reissued, such as recipient.
replacedBy(required):stringThe Stripe invoice that replaced it.
stripeInvoiceId(required):stringThe voided Stripe invoice.
supersededAt(required):string, format:date-timeWhen it was voided. RFC 3339, UTC.
name(required):string | nullProject name, or null when unnamed.
netTerms(required):stringNet-terms state: empty for card billing, then pending approval, active (invoiced on terms), cancelling, or revoking. Known values: "", "pending", "active", "cancelling", "revoking". Additional values may appear.
netTermsActorEmail(required):string | nullWho approved net terms, or null.
netTermsAt(required):string | null, format:date-timeWhen net terms last changed state, or null if never. RFC 3339, UTC.
netTermsDays(required):integer, minimum:0The agreed payment window in days.
ownerEmail(required):string | nullOwner's email, or null for an ownerless project.
ownerIsAdmin(required):booleanThe owner is a site admin, who bypasses the cap.
ownerOwnedProjects(required):integer, minimum:0Project slots the owner holds; can exceed the cap.
ownerProjectCap(required):integer | nullHow many projects the owner may own, or null without an owner.
stripeRefused(required):array of stringStripe ids queued for removal that Stripe refused; remove each by hand.
suspended(required):booleanBilling suspension flag; gates traffic only while enforceSuspension is true.
usage(required): nullableMonth-to-date usage and cost, or null when the billing read failed.
All of:
- CurrentUsageQuantities
objectegressInternalBytes(required):numberRelay-to-relay bytes inside the fleet, an internal cost input; never billed.
announceCursorSeconds:numberRelay announce work in seconds, an internal cost input; never billed.
announceRouteSeconds:numberRelay announce work in seconds, an internal cost input; never billed.
moqWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
rtmpWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
srtWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
syncWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
webrtcWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
websocketWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
webtransportWireEgressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
wireEgressExternalBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
wireIngressBytes:number, default:0Wire bytes including transport overhead, an internal cost input; never billed.
Generated example:
json
{
"id": "p123example",
"name": null,
"ownerEmail": null,
"billingRecipient": null,
"ownerProjectCap": null,
"ownerOwnedProjects": 0,
"ownerIsAdmin": true,
"suspended": true,
"freeLimited": true,
"capReached": true,
"enforceSuspension": true,
"banned": true,
"billingExempt": true,
"hasPaymentMethod": true,
"stripeRefused": [
""
],
"netTerms": "",
"netTermsDays": 0,
"netTermsAt": "2026-10-22T12:00:00.000Z",
"exposure": {
"periodStart": "2026-10-22T12:00:00.000Z",
"monthNetMicros": 1000000,
"spendCapMicros": 1000000,
"spendCapRemainingMicros": 1000000,
"spendCapReached": true,
"creditLimitMicros": 1000000,
"creditLimitRemainingMicros": 1000000,
"invoicedPrincipalMicros": 1000000,
"accruedPrincipalMicros": 1000000,
"absorbedMicros": 1000000,
"headroomMicros": 1000000,
"headroomSource": null,
"usableHeadroomMicros": 1000000,
"identityHold": true
},
"creditLimitRequest": {
"creditLimitMicros": 1000000,
"reason": "",
"requestedAt": "2026-10-22T12:00:00.000Z"
},
"netTermsActorEmail": null,
"createdAt": "2026-10-22T12:00:00.000Z",
"usage": {
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false,
"freeAllowance": {
"egressBytes": 1,
"storedGbSeconds": 1
},
"freeEgressBytes": 1,
"freeVodEgressBytes": 1,
"freeStoredGbSeconds": 1,
"freeRecordingBytes": 0,
"freeMicros": 1,
"netMicros": 1,
"egressInternalBytes": 1,
"wireEgressExternalBytes": 0,
"wireIngressBytes": 0,
"moqWireEgressBytes": 0,
"webtransportWireEgressBytes": 0,
"websocketWireEgressBytes": 0,
"rtmpWireEgressBytes": 0,
"srtWireEgressBytes": 0,
"webrtcWireEgressBytes": 0,
"syncWireEgressBytes": 0,
"announceRouteSeconds": 1,
"announceCursorSeconds": 1
},
"creditBalanceMicros": 1000000,
"creditLedger": [
{
"id": "",
"amountMicros": 1000000,
"kind": "",
"reason": "",
"actor": "",
"periodStart": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z",
"actorEmail": null
}
],
"invoices": [
{
"periodStart": "2026-10-22T12:00:00.000Z",
"grossMicros": 1000000,
"freeMicros": 1000000,
"netMicros": 1000000,
"creditAppliedMicros": 1000000,
"amountChargedMicros": 1000000,
"principalMicros": 1000000,
"amountRemainingMicros": 1000000,
"status": "",
"heldReleased": true,
"stripeInvoiceId": null,
"superseded": [
{
"stripeInvoiceId": "",
"invoiceId": "",
"replacedBy": "",
"reason": "",
"supersededAt": "2026-10-22T12:00:00.000Z",
"pending": true
}
]
}
]
}BillingExposure
Type: object | null
absorbedMicros(required):integer, minimum:0Metered past the cap or limit; never billed.
accruedPrincipalMicros(required):integer, minimum:0Accrued principal not yet invoiced.
creditLimitMicros(required):integer | null, minimum:0Operator ceiling, or null for none.
creditLimitRemainingMicros(required):integer | null, minimum:0Remaining operator ceiling, or null for none.
headroomMicros(required):integer | null, minimum:0The lower remaining ceiling, or null when neither is set.
headroomSource(required):string | nullWhich ceiling supplies the headroom, or null. Known values: "cap", "limit", null. Additional values may appear.
identityHold(required):booleanThe approved billing identity no longer matches Stripe.
invoicedPrincipalMicros(required):integer, minimum:0Invoiced and unpaid principal.
monthNetMicros(required):integer, minimum:0Month-to-date billable net, clamped to the cap, before credit.
periodStart(required):string, format:date-timeStart of the month measured.
spendCapMicros(required):integer | null, minimum:0Owner ceiling, or null for none.
spendCapReached(required):booleanThe spend cap is exhausted.
spendCapRemainingMicros(required):integer | null, minimum:0Remaining owner ceiling, or null for none.
usableHeadroomMicros(required):integer | null, minimum:0What a new period can admit; zero while held or below the minimum charge.
CreditLimitRequest
Type: object | null
The owner's pending request, or null.
creditLimitMicros(required):integer, minimum:0The requested credit limit in micro-USD.
reason(required):stringWhy the owner needs a higher limit.
requestedAt(required):string, format:date-timeWhen the owner requested the increase.
CurrentUsageQuantities
All of:
- Usage
objectfreeEgressBytes(required):numberLive delivery payload bytes covered by the shared account allowance, capped at that allowance. Do not add to egressExternalBytes.
freeMicros(required):numberAllowance credit in micro-USD (1000000 = USD 1), the difference between frozen gross costMicros and netMicros. Account credit is separate.
freeStoredGbSeconds(required):numberManaged-storage GB·second covered by the storage allowance, capped at that allowance. Already part of storedGbSeconds.
freeVodEgressBytes(required):numberRecording-delivery payload bytes covered by the same delivery allowance after live delivery takes its share. Already part of vodEgressBytes.
netMicros(required):numberCurrent customer charge after allowances in micro-USD, before account credit; between zero and frozen costMicros. Uses the lesser of current overage and frozen gross less allowance value.
freeAllowance:objectThis project's share of account allowance: egressBytes is delivery payload bytes and storedGbSeconds is managed-storage GB·second. Absent on older responses means the whole monthly allowance, not zero.
egressBytes(required):numberDelivery allowance in payload bytes, decimal.
storedGbSeconds(required):numberManaged-storage allowance in GB·second, decimal GB.
freeRecordingBytes:number, default:0Managed recording payload bytes covered by the archive allowance. Already part of vodRecordingBytes; defaults to zero on older responses.
Usage
Type: object
costMicros(required):numberFrozen gross customer cost in micro-USD (1000000 = USD 1), before allowances and account credit. Never recomputed by this projection.
egressExternalBytes(required):numberLive payload bytes delivered outside the fleet, a billable quantity. Includes the live protocol subsets; do not add those subsets again.
periodStart(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
storedGbSeconds(required):numberManaged storage integral in GB·second (decimal GB); divide by 86400 for GB·days. This is the billable storage quantity.
agentSeconds:numberLive voice agent-seconds, a billable quantity. Provider API charges are separate; absent on older history means zero.
byobEgressBytes:number, default:0Customer-bucket upload payload bytes. A display subset of vodEgressBytes in current history; older billing eras include it in vodRecordingBytes or egressExternalBytes instead. Never add this subset to its containing total or charge it again. Missing older-history values mean zero.
byobIngressBytes:number, default:0Structurally zero: customer-bucket uploads have no ingress side. Included for the uniform transport split; never billed separately.
connectedSeconds:numberConnection-seconds summed over the period. Display only, never billed. Absence on older history or live/open rows means unavailable, not zero.
egressAnnounced:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
egressDatagrams:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
egressFetches:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
egressFrames:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
egressGroups:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
egressSubscriptions:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
hlsEgressBytes:number, default:0Payload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
hlsIngressBytes:number, default:0Payload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
ingressAnnounced:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
ingressBytes:numberPublisher payload bytes received. Display only, never billed; absent on older history means zero.
ingressDatagrams:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
ingressFetches:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
ingressFrames:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
ingressGroups:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
ingressSubscriptions:number, default:0Delivery operation count, display only and never billed. Datagrams are a subset of groups; subscriptions and fetches are per track, not viewer counts. Missing older-history values mean zero.
partial:booleanWhether the source period is incomplete. Omitted means a complete historical period.
peakConnections:numberPeak simultaneous connection count (maximum over constituent minutes). Display only, never billed. Absence means unavailable, not zero.
periodEnd:string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
retainedDeltaBytes:numberSigned managed-storage byte change over the period. Display only; negative means deletion/expiry. Absence means unknown, not zero.
rtmpEgressBytes:numberPayload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
rtmpIngressBytes:numberPayload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
srtEgressBytes:numberPayload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
srtIngressBytes:numberPayload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
syncEgressBytes:number, default:0Payload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
syncIngressBytes:number, default:0Payload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
transcode1080Seconds:numberEncoded rendition-seconds at this resolution, a billable quantity. Absent on older history means zero.
transcode480Seconds:numberEncoded rendition-seconds at this resolution, a billable quantity. Absent on older history means zero.
transcode720Seconds:numberEncoded rendition-seconds at this resolution, a billable quantity. Absent on older history means zero.
vodEgressBytes:numberRecording-delivery bytes, a billable quantity including playback and BYOB uploads. Shares the delivery allowance with live egress; absent on older history means zero.
vodRecordingBytes:number, default:0Managed recording bytes written, a billable quantity. Older history may include BYOB writes; the BYOB subset overlaps rather than adding another charge.
webrtcEgressBytes:numberPayload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
webrtcIngressBytes:numberPayload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
websocketEgressBytes:number, default:0Payload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
websocketIngressBytes:number, default:0Payload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
webtransportEgressBytes:number, default:0Payload bytes for this transport, a display subset of egressExternalBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
webtransportIngressBytes:number, default:0Payload bytes for this transport, a display subset of ingressBytes. Never add to its parent total or bill separately. Missing older-history values mean zero; ingress is free.
Generated example:
json
{
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false
}Project
Type: object
billingExempt(required):booleanWhether this project is exempt from billing.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
domain(required):string | nullVerified email domain admitted to this project, or null.
domainRole(required):stringRole granted to matching verified email domains.
id(required):stringImmutable public project identifier used in URLs; never a database row id.
name(required):string | nullMutable project name, or null for an unnamed project.
enforcedPublicThe public rules the edge and recording playback enforce: null while an auth endpoint decides.
Any of:
object, no additional propertiesv(required):number, const:1Pattern version 1:
foomatches onlyfoo; usefoo/**for a subtree.publish:array of stringPatterns anyone may publish to; omitted grants none.
subscribe:array of stringPatterns anyone may subscribe to; omitted grants none.
object, no additional propertiespublish:array of stringPatterns anyone may publish to; omitted grants none.
subscribe:array of stringPatterns anyone may subscribe to; omitted grants none.
v:number, const:0Legacy prefix version:
foomatches the subtreefoo/**.
null
ownerEmail:string | nullThe owner's email, whom members ask to lift a billing pause; null for an anonymous viewer. getProject only.
publicAnonymous publish/subscribe patterns as saved; null disables anonymous grants. Kept while an auth endpoint replaces them.
Any of:
object, no additional propertiesv(required):number, const:1Pattern version 1:
foomatches onlyfoo; usefoo/**for a subtree.publish:array of stringPatterns anyone may publish to; omitted grants none.
subscribe:array of stringPatterns anyone may subscribe to; omitted grants none.
object, no additional propertiespublish:array of stringPatterns anyone may publish to; omitted grants none.
subscribe:array of stringPatterns anyone may subscribe to; omitted grants none.
v:number, const:0Legacy prefix version:
foomatches the subtreefoo/**.
null
redirects:arrayPrevious names retained as redirects until their RFC 3339 expiry.
Items:
expiresAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
path(required):stringThe previous name.
role:stringThe current caller role on this project.
suspension:objectWhether and why the project is paused or warned about billing. getProject only.
banned(required):booleanPaused by a moq.pro operator. Contact support.
capReached(required):booleanPaused because the project reached its monthly spend cap. Lifts next month, or when the owner raises the cap.
freeLimited(required):booleanPaused because the project has no card on file and used twice its share of the account monthly free tier. Lifts when the owner adds a card.
overFreeTier(required):booleanA warning: the project has no card on file and is over its share of the account monthly free tier. It pauses at twice that share.
paused(required):booleanWhether the project is refused now: new connections, playback, Sync, and live tokens. The other fields say why.
spendCapReached(required):booleanThe project reached its monthly spend cap.
suspended(required):booleanBilling suspended the project, for an overdue invoice or the no-card limit. paused says whether that is enforced.
Generated example:
json
{
"id": "",
"name": null,
"billingExempt": true,
"domain": null,
"domainRole": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"role": "",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"enforcedPublic": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"redirects": [
{
"path": "",
"expiresAt": "2026-10-22T12:00:00.000Z"
}
],
"suspension": {
"paused": true,
"banned": true,
"freeLimited": true,
"capReached": true,
"suspended": true,
"overFreeTier": true,
"spendCapReached": true
},
"ownerEmail": null
}Key
Type: object
algorithm(required):stringSigning algorithm used by this key.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
disabledAt(required):string | null, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
id(required):stringOpaque resource identifier.
keyType(required):stringSymmetric shared secret or asymmetric signing key. Known values: "symmetric", "asymmetric". Additional values may appear.
label(required):string | nullOptional human-readable label; null means unset.
privateKey:stringOne-time private key on creation only; absent from lists and state updates. Save it before discarding the response.
scope:objectImmutable upper bound on token grants from this key.
root(required):stringConnection root carried by this stored key scope, often the project name or immutable id. Required when scope is present; no implicit default.
get:array of stringLegacy subscribe grants, if present on an older stored key.
publish:array of stringAllowed publish patterns relative to the root.
put:array of stringLegacy publish grants, if present on an older stored key.
subscribe:array of stringAllowed subscribe patterns relative to the root.
Generated example:
json
{
"id": "",
"algorithm": "",
"keyType": "",
"label": null,
"disabledAt": "2026-10-22T12:00:00.000Z",
"createdAt": "2026-10-22T12:00:00.000Z",
"scope": {
"root": "",
"publish": [
""
],
"subscribe": [
""
],
"put": [
""
],
"get": [
""
]
},
"privateKey": ""
}PrivateKey
Type: object
privateKey(required):stringThe key's private JWK, serialized. It signs tokens as this key; keep it secret.
Generated example:
json
{
"privateKey": ""
}Token
Type: object
token(required):stringSigned JWT for the relay, as the
jwtquery parameter or a bearer.
Generated example:
json
{
"token": ""
}SessionLimits
Type: object
remote(required):integer | null, minimum:1, maximum:1000000Live sessions one remote address (an IPv4 address or an IPv6 /64) may hold on each relay, from 1 to 1000000; null is unlimited.
token(required):integer | null, minimum:1, maximum:1000000Live sessions one token may hold on each relay, from 1 to 1000000; null is unlimited.
Generated example:
json
{
"token": null,
"remote": null
}AuthEndpoint
Type: object
url(required):string | nullThe https URL asked to admit each tokenless session, or null when the project's public rules decide.
Generated example:
json
{
"url": null
}CreatedAuthEndpoint
Type: object
secret(required):stringOne-time signing secret, returned only by the save that creates the endpoint. The endpoint verifies each request's Moq-Signature with it, as for webhooks. Save it before discarding the response.
url(required):stringThe https URL asked to admit each tokenless session.
Generated example:
json
{
"url": "",
"secret": ""
}AuthEndpointTest
Type: object
answer(required)What the endpoint answered.
One of:
objectgrant(required):objectThe grant the endpoint answered, as the edge reads it.
Additional properties:
anykind(required):stringThe endpoint admitted the session. Known values: "grant". Additional values may appear.
objectkind(required):stringThe endpoint refused the session. Known values: "refused". Additional values may appear.
status(required):integerThe refusing HTTP status: 401 or 403.
objecterror(required):stringWhat is wrong with the answer.
kind(required):stringThe endpoint answered 2xx without a valid grant, which refuses the session. Known values: "invalid". Additional values may appear.
objecterror(required):stringWhat failed.
kind(required):stringThe endpoint failed to answer. Known values: "unavailable". Additional values may appear.
status:integerThe HTTP status, when the endpoint answered.
request(required):objectThe signed request the endpoint received.
event(required):stringThe event asked about. Known values: "connect". Additional values may appear.
id(required):stringRandom id for this test session.
node(required):stringThe relay asking; moq.pro-test for a test.
path(required):stringThe dialed path, relative to the project.
transport(required):stringHow the session reached the relay.
query:stringThe raw query string, without the leading ?.
Generated example:
json
{
"request": {
"id": "",
"event": "",
"node": "",
"transport": "",
"path": "",
"query": ""
},
"answer": {
"kind": "",
"grant": {
"additionalProperty": null
}
}
}LiveToken
Type: object
expiresAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
project(required):objectWatches the project's broadcasts.
root(required):stringThe connection path to dial on the relay, which the token is scoped to.
token(required):stringA relay JWT that subscribes to everything under root.
stats(required):objectWatches the project's live dashboard statistics.
root(required):stringThe connection path to dial on the relay, which the token is scoped to.
token(required):stringA relay JWT that subscribes to everything under root.
Generated example:
json
{
"project": {
"token": "",
"root": ""
},
"stats": {
"token": "",
"root": ""
},
"expiresAt": "2026-10-22T12:00:00.000Z"
}RecordingRule
Type: object
bucket(required): BucketCustomer bucket metadata, or null for managed storage.
bucketId(required):string | nullOpaque customer bucket id, or null for managed storage.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
deletePending(required):integer, minimum:0Recordings still waiting for this rule deletion to drain; zero when idle.
deleting(required):booleanWhether asynchronous deletion is draining this resource.
id(required):stringOpaque resource identifier.
label(required):string | nullOptional human-readable label; null means unset.
patterns(required):array of stringBroadcast path patterns matched by this rule; arrays replace the existing list when patched.
retentionDays(required):numberManaged recording retention in days; one of the declared retention presets. Defaults to 7 on create.
updatedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
uploadRefusal(required):string | nullWhy the bucket refused an upload, which stopped recording until the rule is re-enabled; null when recording.
vodEnabled(required):booleanWhether this rule records matching broadcasts. Defaults to true on create.
Generated example:
json
{
"id": "",
"label": null,
"patterns": [
""
],
"vodEnabled": true,
"retentionDays": 1,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z",
"bucketId": null,
"deleting": true,
"uploadRefusal": null,
"bucket": {
"endpoint": "",
"region": "",
"bucket": "",
"destination": "",
"delivery": true
},
"deletePending": 0
}Bucket
Type: object | null
Customer bucket metadata, or null for managed storage.
bucket(required):stringS3 bucket name. Managed storage is represented by null on the enclosing recording rule bucket field.
delivery(required):booleanWhether customer-bucket playback/delivery is enabled.
destination(required):stringObject prefix inside the customer bucket.
endpoint(required):stringS3-compatible endpoint URL. Callers with keys:write and the write role see the configured URL, which may carry credentials; others see only its origin.
region(required):stringS3 region used for signing.
DeletingRule
Type: object
pending(required):numberRecordings still draining before the rule disappears.
status(required):stringThe rule's storage is draining. Known values: "deleting". Additional values may appear.
Generated example:
json
{
"status": "",
"pending": 1
}DeletingRecordings
Type: object
pending(required):numberHow many of the rule's recordings are being deleted.
status(required):stringThe recordings are draining. Known values: "deleting". Additional values may appear.
Generated example:
json
{
"status": "",
"pending": 1
}Session
Type: object
broadcastPath(required):stringBroadcast path relative to the project.
bytes(required):numberRecorded media bytes, excluding transport overhead.
cleanupFailed(required):booleanWhether object deletion needs another attempt.
deleting(required):booleanWhether asynchronous deletion is draining this resource.
durationMs(required):numberRecorded media duration in milliseconds.
endedAt(required):string | null, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
exportFailure(required):string | nullExport failure reason, or null.
exportStatus(required):string | nullBucket export state, or null if not applicable. Known values: "pending", "ready", "failed", null. Additional values may appear.
id(required):stringOpaque resource identifier.
playlistUrl(required):string | nullPlayback playlist URL, or null until media is ready.
region(required):string | nullS3 region used for signing.
regression(required):string | nullDiagnostic from the newest retained generation by generation number that reported conflicting or backwards media under a reused source epoch; null if none did. Free text, not an enum. A later generation may be live; committed media can still play or export successfully.
startedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
status(required):stringRecording lifecycle: LIVE is ingesting, ENDED has closed, and DELETED is removed; deleting separately marks an asynchronous drain. Known values: "LIVE", "ENDED", "DELETED". Additional values may appear.
Generated example:
json
{
"id": "",
"broadcastPath": "",
"status": "",
"startedAt": "2026-10-22T12:00:00.000Z",
"endedAt": "2026-10-22T12:00:00.000Z",
"playlistUrl": null,
"region": null,
"bytes": 1,
"durationMs": 1,
"deleting": true,
"cleanupFailed": true,
"exportStatus": null,
"exportFailure": null,
"regression": null
}RecordingRuleTotals
Type: object
bytes(required):integer, minimum:0Their stored size. A live recording's size trails what it has written so far.
live(required):integer, minimum:0Of those, recordings still in progress.
recordings(required):integer, minimum:0Recordings the rule holds, live ones included.
ruleId(required):stringThe recording rule that holds these recordings.
Generated example:
json
{
"ruleId": "",
"recordings": 0,
"live": 0,
"bytes": 0
}Playback
Type: object
expiresAt(required):string, format:date-timeWhen the token expires. Call again for a fresh one.
initial(required):object | nullThe window the playlist starts with; an omitted bound is open.
end:string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
start:string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
live(required):booleanThe recording is still ingesting, so the playlist grows.
span(required):object | nullThe retained media span, and the most segments one rendition holds across it.
end(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
segments(required):numberThe most segments one rendition holds across the span.
start(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
token(required):stringGrants this recording's playlists and media. Send it on every request as
Authorization: Beareror thejwtquery parameter.url(required):stringThe recording's HLS playlist.
Generated example:
json
{
"url": "",
"token": "",
"expiresAt": "2026-10-22T12:00:00.000Z",
"live": true,
"span": {
"start": "2026-10-22T12:00:00.000Z",
"end": "2026-10-22T12:00:00.000Z",
"segments": 1
},
"initial": {
"start": "2026-10-22T12:00:00.000Z",
"end": "2026-10-22T12:00:00.000Z"
}
}DeletingRecording
Type: object
status(required):stringstoppingwhile a live recording's recorder stops; its storage drains after. Known values: "deleting", "stopping". Additional values may appear.
Generated example:
json
{
"status": ""
}S3Credentials
Type: object
accessKeyId(required):stringS3 access-key identifier. Requires write authority and must be kept private.
bucket(required):stringS3 bucket name. Managed storage is represented by null on the enclosing recording rule bucket field.
endpoint(required):stringS3-compatible endpoint URL for these credentials. This operation requires write authority.
region(required):stringS3 region used for signing.
secretAccessKey(required):stringS3 signing secret. Requires write authority; never place it in a public URL.
Generated example:
json
{
"endpoint": "",
"region": "",
"bucket": "",
"accessKeyId": "",
"secretAccessKey": ""
}AgentRule
Type: object
config(required): AgentConfigFull keyless voice configuration. Provider keys are write-only and stay encrypted in storage.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
enabled(required):booleanWhether this configuration is enabled.
id(required):stringOpaque resource identifier.
patterns(required):array of stringBroadcast path patterns matched by this rule; arrays replace the existing list when patched.
updatedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
Generated example:
json
{
"id": "",
"patterns": [
""
],
"enabled": true,
"config": {
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 4,
"stt": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"llm": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"tts": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
}
},
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}AgentConfig
Type: object
Full keyless voice configuration. Provider keys are write-only and stay encrypted in storage.
greeting(required):string | nullInitial spoken greeting, or null for none; null in PATCH clears it.
llm(required):objectLanguage-model provider configuration; apiKey is never returned.
hasKey(required):booleanWhether an encrypted provider key is configured; never the key itself.
model(required):string | nullProvider model, or null for its default.
options(required):objectProvider-specific options. Only the selected provider options are supported.
Additional properties:
string | number | booleanprovider(required):stringProvider identifier.
maxSessions(required):integer, minimum:1, maximum:4Maximum simultaneous sessions for this rule, from 1 to the project ceiling. Defaults to that ceiling on create.
stt(required):objectSpeech-to-text provider configuration; apiKey is never returned.
hasKey(required):booleanWhether an encrypted provider key is configured; never the key itself.
model(required):string | nullProvider model, or null for its default.
options(required):objectProvider-specific options. Only the selected provider options are supported.
Additional properties:
string | number | booleanprovider(required):stringProvider identifier.
systemPrompt(required):string, maxLength:8000Instruction text, at most 8000 characters; required on create and unchanged when omitted in PATCH.
tts(required):objectText-to-speech provider configuration; apiKey is never returned.
hasKey(required):booleanWhether an encrypted provider key is configured; never the key itself.
model(required):string | nullProvider model, or null for its default.
options(required):objectProvider-specific options. Only the selected provider options are supported.
Additional properties:
string | number | booleanprovider(required):stringProvider identifier.
turnDetection(required):stringTurn detection strategy. Defaults to silero on create. Known values: "silero", "stt_endpointing", "client". Additional values may appear.
Generated example:
json
{
"systemPrompt": "",
"greeting": null,
"turnDetection": "silero",
"maxSessions": 4,
"stt": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"llm": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
},
"tts": {
"provider": "",
"model": null,
"hasKey": true,
"options": {
"additionalProperty": ""
}
}
}SyncTarget
Type: object
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
id(required):stringOpaque resource identifier.
kind(required):stringImmutable sync target kind: cloudflare or custom. Known values: "cloudflare", "custom". Additional values may appear.
label(required):stringTrimmed human-readable label; an empty string means unset. Defaults to an empty string on create.
publishConfigured(required):booleanWhether a publish credential is configured.
publishOrigin(required):string | nullCredential-free publish origin, or null when withheld/unconfigured.
publishPrefixes(required):array of stringPublished path prefixes relative to the project.
updatedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
Generated example:
json
{
"id": "",
"kind": "",
"label": "",
"publishPrefixes": [
""
],
"publishConfigured": true,
"publishOrigin": null,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}Webhook
Type: object
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
disabledReason(required):string | nullReason for automatic disable, or null.
enabled(required):booleanWhether this configuration is enabled.
events(required):arraySubscribed event names.
Items:
stringKnown values: "broadcast.started", "broadcast.ended", "recording.started", "recording.ready", "recording.failed". Additional values may appear.
failures(required):numberConsecutive delivery failures.
format(required):stringDelivery body: the signed
jsonenvelope, or an unsignedslackordiscordmessage. Known values: "json", "slack", "discord". Additional values may appear.id(required):stringOpaque resource identifier.
pattern(required):stringBroadcast path pattern for this webhook.
updatedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
url(required):stringWebhook HTTPS endpoint URL; may carry a credential and requires write authority.
secret:stringOne-time signing secret on creation only; never returned by reads or updates.
Generated example:
json
{
"id": "",
"url": "",
"events": [
""
],
"pattern": "",
"format": "",
"enabled": true,
"disabledReason": null,
"secret": "",
"failures": 1,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}TestedWebhook
Type: object
eventId(required):stringThe queued test event; find its delivery by this id.
Generated example:
json
{
"eventId": ""
}Delivery
Type: object
attempts(required):numberNumber of delivery attempts.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
error(required):string | nullLast delivery error, or null.
eventId(required):stringOpaque webhook event identifier.
id(required):stringOpaque resource identifier.
state(required):stringDelivery state. Known values: "pending", "delivered", "failed". Additional values may appear.
status(required):number | nullLast webhook response HTTP status code, or null before an HTTP response (including transport failures).
type(required):stringWebhook event type.
updatedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
Generated example:
json
{
"id": "",
"eventId": "",
"type": "",
"state": "",
"attempts": 1,
"status": null,
"error": null,
"createdAt": "2026-10-22T12:00:00.000Z",
"updatedAt": "2026-10-22T12:00:00.000Z"
}Allowance
Type: object | null
egressBytes(required):number, minimum:0Shared delivery allowance in payload bytes (live plus recording delivery); decimal GB = 1000000000 bytes.
storedGbSeconds(required):number, minimum:0Shared managed-storage allowance in GB·second, decimal GB.
CurrentUsage
Type: object
pool(required): Poolproject(required):stringThe project's immutable id.
usage(required): CurrentUsageQuantities
Generated example:
json
{
"project": "",
"usage": {
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false,
"freeAllowance": {
"egressBytes": 1,
"storedGbSeconds": 1
},
"freeEgressBytes": 1,
"freeVodEgressBytes": 1,
"freeStoredGbSeconds": 1,
"freeRecordingBytes": 0,
"freeMicros": 1,
"netMicros": 1
},
"pool": {
"periodStart": "2026-10-22T12:00:00.000Z",
"available": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"projected": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"drawn": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"projects": 1
}
}Pool
Type: object | null
available(required)All of:
anyRemaining account allowance available to this project now.
drawn(required)All of:
anyAccount allowance already consumed by this project this month.
periodStart(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
projected(required)All of:
anyProjected account allowance share available to this project at month end.
projects(required):numberNumber of projects sharing the allowance.
Invoice
Type: object
amountChargedMicros(required):integer, minimum:0Micro-USD (1,000,000 = USD 1); never cents.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
creditAppliedMicros(required):integer, minimum:0Micro-USD (1,000,000 = USD 1); never cents.
freeMicros(required):integer, minimum:0Micro-USD (1,000,000 = USD 1); never cents.
grossMicros(required):integer, minimum:0Micro-USD (1,000,000 = USD 1); never cents.
hostedInvoiceUrl(required):string | nullStripe hosted invoice URL, or null when unavailable or withheld by caller authority.
netMicros(required):integer, minimum:0Micro-USD (1,000,000 = USD 1); never cents.
periodStart(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
poolProjects(required):number | nullNumber of projects sharing this invoice allowance; null for older invoices.
principalMicros(required):integer, minimum:0Micro-USD (1,000,000 = USD 1); never cents.
status(required):stringInvoice ledger state: pending collection, paid, failed collection, no_card, held review, invoiced net terms, forgiven, invoice_void, invoice_uncollectible, invoice_writeoff_pending, or invoice_written_off.
Generated example:
json
{
"periodStart": "2026-10-22T12:00:00.000Z",
"grossMicros": 1000000,
"freeMicros": 1000000,
"netMicros": 1000000,
"creditAppliedMicros": 1000000,
"principalMicros": 1000000,
"amountChargedMicros": 1000000,
"status": "",
"hostedInvoiceUrl": null,
"poolProjects": null,
"createdAt": "2026-10-22T12:00:00.000Z"
}SpendCap
Type: object
overFreeTier(required):booleanWhether usage exceeds the account free allowance.
spendCapMicros(required):number | nullMonthly spending cap in micro-USD, or null to remove the cap.
spendCapReached(required):booleanWhether the spending cap is reached.
suspended(required):booleanWhether the project is suspended.
capReached:booleanWhether a capacity cap is reached.
freeLimited:booleanWhether the free-tier connection limit applies.
notifications:arrayAt most one billing notice for the dashboard to show.
Items:
category(required):stringWhat the notice is about. Known values: "account", "usage", "spend". Additional values may appear.
dismissible(required):booleanWhether the dashboard may hide it.
id(required):stringOpaque resource identifier.
level(required):numberWhich notice in its category: a usage percent, a spend milestone in USD, or an account state.
severity(required):stringblocking for a suspension notice, else advisory. Known values: "advisory", "blocking". Additional values may appear.
capReached:booleanWhether a capacity cap is reached.
seq:numberMonotonically increasing notice snapshot sequence.
Generated example:
json
{
"spendCapMicros": null,
"suspended": true,
"overFreeTier": true,
"spendCapReached": true,
"capReached": true,
"freeLimited": true,
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
]
}Payment
All of:
- SpendCap
objectbillingContact(required):stringExplicit billing email; empty uses the owner's address.
billingExempt(required):booleanThe project is exempt from billing.
billingRecipient(required):stringResolved billing email; empty when none is available.
collectionMode(required):stringHow the project pays. Known values: "none", "exempt", "charge_automatically", "send_invoice". Additional values may appear.
creditLimitRequest(required)All of:
The owner's pending request, or null.
anyPending request for a higher credit limit, or null.
enabled(required):booleanStripe billing is configured.
exposure(required)All of:
anyThe current cap and credit-limit headroom.
forgivenStatements(required):booleanThe monthly statement is sent for months with nothing to pay. Months that charge or owe always send.
hasPaymentMethod(required):booleanA payment method is on file.
hasStripeCustomer(required):booleanA Stripe billing account exists.
netTerms(required):stringNet-terms approval state; empty means no request. Known values: "", "pending", "active", "cancelling", "revoking". Additional values may appear.
netTermsDays(required):numberApproved payment window in days.
paymentLabel(required):string | nullPayment method label, or null.
paymentLast4(required):string | nullLast four digits of the payment method, or null.
publishableKey(required):stringStripe publishable key for embedded card entry; empty when unconfigured.
BillingStatus
Type: object
overFreeTier(required):booleanWhether usage exceeds the account free allowance.
spendCapReached(required):booleanWhether the spending cap is reached.
suspended(required):booleanWhether the project is suspended.
capReached:booleanWhether a capacity cap is reached.
freeLimited:booleanWhether the free-tier connection limit applies.
notifications:arrayAt most one billing notice for the dashboard to show.
Items:
category(required):stringWhat the notice is about. Known values: "account", "usage", "spend". Additional values may appear.
dismissible(required):booleanWhether the dashboard may hide it.
id(required):stringOpaque resource identifier.
level(required):numberWhich notice in its category: a usage percent, a spend milestone in USD, or an account state.
severity(required):stringblocking for a suspension notice, else advisory. Known values: "advisory", "blocking". Additional values may appear.
capReached:booleanWhether a capacity cap is reached.
seq:numberMonotonically increasing notice snapshot sequence.
Generated example:
json
{
"suspended": true,
"overFreeTier": true,
"spendCapReached": true,
"capReached": true,
"freeLimited": true,
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
]
}BillingIdentity
Type: object | null, no additional properties
Stripe legal identity, or null before a billing account exists.
address(required):object, no additional propertiesBilling address; empty fields clear them.
city(required):string, maxLength:200City.
country(required)ISO 3166-1 alpha-2 country; empty clears the address.
Any of:
stringKnown values: "". Additional values may appear.
string, pattern:^[A-Za-z]{2}$
line1(required):string, maxLength:200Street line 1.
line2(required):string, maxLength:200Street line 2.
postalCode(required):string, maxLength:30Postal code.
state(required):string, maxLength:200State or region.
companyName(required):string, maxLength:200The legal entity billed; empty falls back to the email.
taxId(required):object | null, no additional propertiesOne tax registration, or null to clear it.
type(required):stringStripe tax id type. Known values: "eu_vat", "gb_vat", "ch_vat", "no_vat", "us_ein", "ca_bn", "ca_gst_hst", "au_abn", "nz_gst", "jp_ct", "kr_brn", "sg_uen", "in_gst", "br_cnpj", "mx_rfc", "za_vat", "ae_trn". Additional values may appear.
value(required):string, maxLength:50The registration number.
NotificationFrame
Type: object
notifications(required):arrayAt most one billing notice for the dashboard to show.
Items:
category(required):stringWhat the notice is about. Known values: "account", "usage", "spend". Additional values may appear.
dismissible(required):booleanWhether the dashboard may hide it.
id(required):stringOpaque resource identifier.
level(required):numberWhich notice in its category: a usage percent, a spend milestone in USD, or an account state.
severity(required):stringblocking for a suspension notice, else advisory. Known values: "advisory", "blocking". Additional values may appear.
capReached:booleanWhether a capacity cap is reached.
seq(required):numberMonotonically increasing notice snapshot sequence.
Generated example:
json
{
"seq": 1,
"notifications": [
{
"id": "",
"category": "",
"level": 1,
"severity": "",
"dismissible": true,
"capReached": true
}
]
}PermissionsInput
Type: object, no additional properties
A level per permission family; an omitted family is none. See Permissions.
account:string, possible values:"none", "read", "write"Account: profile, data export, and deletion.
admin:string, possible values:"none", "read", "write"Site admin: operator routes, for a site admin.
billing:string, possible values:"none", "read", "write"Billing: payment, spend caps, invoices, credit, and account usage.
credentials:string, possible values:"none", "read", "write"Credentials: API tokens, passkeys, and sessions.
keys:string, possible values:"none", "read", "write"Keys & secrets: signing keys and the auth endpoint; write also reveals every secret and mints relay tokens.
lifecycle:string, possible values:"none", "write"Project lifecycle: create and delete projects.
media:string, possible values:"none", "read", "write"Media rules: recording, transcode, agent, sync, and webhooks.
members:string, possible values:"none", "read", "write"Members & invites: members, invitations, and ownership transfer.
settings:string, possible values:"none", "read", "write"Project settings: the project itself, its session limits, and its notices.
usage:string, possible values:"none", "read"Usage & stats: metered usage.
Generated example:
json
{
"settings": "none",
"keys": "none",
"media": "none",
"usage": "none",
"lifecycle": "none",
"members": "none",
"billing": "none",
"credentials": "none",
"account": "none",
"admin": "none"
}Account
Type: object
email(required):stringVerified sign-in email. Changing it requires human sign-in verification.
id(required):stringThe authenticated account's identifier.
isAdmin(required):booleanWhether the account is a site administrator.
name(required):stringAccount display name.
ownedProjectCap(required):numberMaximum number of projects this account may own.
domainAccessExpiresAt:numberWhen the latest Google Workspace sign-in stops granting domain access, in Unix milliseconds; absent without one. Returned by getAccount.
domainLoginRequired:booleanWhether projects shared with the email's domain stay hidden until a Google Workspace sign-in for that domain within the last 7 days. Returned by getAccount.
Generated example:
json
{
"id": "",
"email": "",
"name": "",
"isAdmin": true,
"ownedProjectCap": 1,
"domainLoginRequired": true,
"domainAccessExpiresAt": 1
}AccountUsage
Type: object
allowance(required): AccountAllowanceMonthly free allowance, shared when pooled is true.
drawn(required)All of:
Monthly free allowance, shared when pooled is true.
anyAllowance consumed, including usage from departed projects.
periodStart(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
pooled(required):booleanWhether the projects share one account allowance this month.
projects(required):arrayOwned billable projects, oldest first. Shares are estimates until settlement.
Items:
costMicros(required):integer, minimum:0Gross cost before the free allowance, in micro-USD.
egressBytes(required):numberLive and recording delivery payload bytes.
freeMicros(required):integer, minimum:0Free allowance credit, in micro-USD.
id(required):stringImmutable public project identifier used in URLs; never a database row id.
name(required):string | nullMutable project name, or null for an unnamed project.
netMicros(required):integer, minimum:0Estimated charge after the free allowance, in micro-USD.
share(required)All of:
Monthly free allowance, shared when pooled is true.
anyThis project's current share of the free allowance.
storedGbSeconds(required):numberManaged storage integral in GB·second.
Generated example:
json
{
"periodStart": "2026-10-22T12:00:00.000Z",
"pooled": true,
"allowance": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"drawn": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"projects": [
{
"id": "",
"name": null,
"costMicros": 0,
"egressBytes": 1,
"storedGbSeconds": 1,
"share": {
"egressBytes": 1000000000,
"storedGbSeconds": 86400
},
"freeMicros": 0,
"netMicros": 0
}
]
}AccountAllowance
Type: object
Monthly free allowance, shared when pooled is true.
egressBytes(required):number, minimum:0Shared delivery allowance in payload bytes (live plus recording delivery); decimal GB = 1000000000 bytes.
storedGbSeconds(required):number, minimum:0Shared managed-storage allowance in GB·second, decimal GB.
Generated example:
json
{
"egressBytes": 1000000000,
"storedGbSeconds": 86400
}AccountExport
Type: object
account(required): AccountexportedAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
items(required):arrayThis page's items, in the list's documented order.
Items:
A project visible to this account. Billing identity is included only for owned projects.
createdAt(required):string, format:date-timeRFC 3339 timestamp with a timezone; responses are normalized to UTC.
domain(required):string | nullVerified email domain admitted to this project, or null.
domainRole(required):stringRole granted to matching verified email domains.
id(required):stringImmutable public project identifier used in URLs; never a database row id.
name(required):string | nullMutable project name, or null for an unnamed project.
usage(required):objectUsage for this visible project.
currentMonth(required)All of:
anyCurrent-month usage estimate.
billingIdentity:object | nullBilling identity for owned projects only; null when none is saved.
address(required):objectThe billing address; empty fields are unset.
city(required):string, maxLength:200City.
country(required)ISO 3166-1 alpha-2 country; empty clears the address.
Any of:
stringKnown values: "". Additional values may appear.
string, pattern:^[A-Za-z]{2}$
line1(required):string, maxLength:200Street line 1.
line2(required):string, maxLength:200Street line 2.
postalCode(required):string, maxLength:30Postal code.
state(required):string, maxLength:200State or region.
companyName(required):string, maxLength:200The legal entity billed; empty falls back to the email.
taxId(required):object | nullOne tax registration, or null.
type(required):stringStripe tax id type. Known values: "eu_vat", "gb_vat", "ch_vat", "no_vat", "us_ein", "ca_bn", "ca_gst_hst", "au_abn", "nz_gst", "jp_ct", "kr_brn", "sg_uen", "in_gst", "br_cnpj", "mx_rfc", "za_vat", "ae_trn". Additional values may appear.
value(required):string, maxLength:50The registration number.
publicAnonymous publish/subscribe patterns as saved; null disables anonymous grants. Kept while an auth endpoint replaces them.
Any of:
object, no additional propertiesv(required):number, const:1Pattern version 1:
foomatches onlyfoo; usefoo/**for a subtree.publish:array of stringPatterns anyone may publish to; omitted grants none.
subscribe:array of stringPatterns anyone may subscribe to; omitted grants none.
object, no additional propertiespublish:array of stringPatterns anyone may publish to; omitted grants none.
subscribe:array of stringPatterns anyone may subscribe to; omitted grants none.
v:number, const:0Legacy prefix version:
foomatches the subtreefoo/**.
null
role:stringThe current caller role on this project.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
Generated example:
json
{
"items": [
{
"id": "",
"name": null,
"role": "",
"public": {
"v": 1,
"publish": [
""
],
"subscribe": [
""
]
},
"domain": null,
"domainRole": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"billingIdentity": {
"companyName": "",
"address": {
"line1": "",
"line2": "",
"city": "",
"state": "",
"postalCode": "",
"country": ""
},
"taxId": {
"type": "",
"value": ""
}
},
"usage": {
"currentMonth": {
"periodStart": "2026-10-22T12:00:00.000Z",
"periodEnd": "2026-10-22T12:00:00.000Z",
"egressExternalBytes": 1000000,
"ingressBytes": 1000000,
"storedGbSeconds": 60,
"retainedDeltaBytes": 1000000,
"vodRecordingBytes": 1000000,
"vodEgressBytes": 1000000,
"transcode480Seconds": 60,
"transcode720Seconds": 60,
"transcode1080Seconds": 60,
"agentSeconds": 60,
"webtransportEgressBytes": 1000000,
"webtransportIngressBytes": 1000000,
"websocketEgressBytes": 1000000,
"websocketIngressBytes": 1000000,
"rtmpEgressBytes": 1000000,
"rtmpIngressBytes": 1000000,
"srtEgressBytes": 1000000,
"srtIngressBytes": 1000000,
"webrtcEgressBytes": 1000000,
"webrtcIngressBytes": 1000000,
"syncEgressBytes": 1000000,
"syncIngressBytes": 1000000,
"hlsEgressBytes": 1000000,
"hlsIngressBytes": 1000000,
"byobEgressBytes": 1000000,
"byobIngressBytes": 1000000,
"egressFrames": 60,
"ingressFrames": 60,
"egressGroups": 60,
"ingressGroups": 60,
"egressDatagrams": 60,
"ingressDatagrams": 60,
"egressSubscriptions": 60,
"ingressSubscriptions": 60,
"egressFetches": 60,
"ingressFetches": 60,
"egressAnnounced": 60,
"ingressAnnounced": 60,
"connectedSeconds": 60,
"peakConnections": 60,
"costMicros": 60,
"partial": false,
"freeAllowance": {
"egressBytes": 1,
"storedGbSeconds": 1
},
"freeEgressBytes": 1,
"freeVodEgressBytes": 1,
"freeStoredGbSeconds": 1,
"freeRecordingBytes": 0,
"freeMicros": 1,
"netMicros": 1
}
}
}
],
"nextCursor": null,
"exportedAt": "2026-10-22T12:00:00.000Z",
"account": {
"id": "",
"email": "",
"name": "",
"isAdmin": true,
"ownedProjectCap": 1,
"domainLoginRequired": true,
"domainAccessExpiresAt": 1
}
}AccountDeletionPreview
Type: object
items(required):arrayThis page's items, in the list's documented order.
Items:
An owned project that account deletion would destroy, with its current blockers.
banned(required):booleanWhether an operator ban blocks deletion.
id(required):stringImmutable public project identifier used in URLs; never a database row id.
name(required):stringDisplay name, falling back to the project id.
otherMembers(required):integer, minimum:0Other members who would lose access.
outstanding(required):booleanWhether unpaid invoices or uninvoiced usage block deletion.
nextCursor(required):string | nullPass as cursor to continue, or null when there are no more items.
projects(required):arrayThe same projects as items, kept for clients written before this list paged. Prefer items.
Items:
An owned project that account deletion would destroy, with its current blockers.
banned(required):booleanWhether an operator ban blocks deletion.
id(required):stringImmutable public project identifier used in URLs; never a database row id.
name(required):stringDisplay name, falling back to the project id.
otherMembers(required):integer, minimum:0Other members who would lose access.
outstanding(required):booleanWhether unpaid invoices or uninvoiced usage block deletion.
Generated example:
json
{
"items": [
{
"id": "",
"name": "",
"outstanding": true,
"banned": true,
"otherMembers": 0
}
],
"nextCursor": null,
"projects": [
{
"id": "",
"name": "",
"outstanding": true,
"banned": true,
"otherMembers": 0
}
]
}AccountDeletionStep
Type: object
nextStep(required):stringRepeat deleteAccount with this as step to continue.
Generated example:
json
{
"nextStep": ""
}Passkey
Type: object
createdAt(required):string, format:date-timeWhen it was enrolled.
id(required):stringThe WebAuthn credential id, base64url; also its removal handle.
lastUsedAt(required):string | null, format:date-timeIts last sign-in, or null before any.
stale(required):booleanTrue when a later sign-out everywhere, email change, or lockdown ended it: it no longer signs in. Remove it and enrol again.
Generated example:
json
{
"id": "",
"createdAt": "2026-10-22T12:00:00.000Z",
"lastUsedAt": "2026-10-22T12:00:00.000Z",
"stale": true
}ProjectMember
Type: object
accountId(required):stringMember account id.
createdAt(required):string, format:date-timeWhen the account joined the project.
email(required):stringMember email address.
role(required):stringGranted project role. Known values: "owner", "write", "read". Additional values may appear.
Generated example:
json
{
"accountId": "",
"email": "",
"role": "",
"createdAt": ""
}ProjectInvitation
Type: object
createdAt(required):string, format:date-timeWhen the invitation was first created.
email(required):stringInvited email address.
role(required):stringRole granted when the invite is claimed. Known values: "owner", "write", "read". Additional values may appear.
Generated example:
json
{
"email": "",
"role": "",
"createdAt": ""
}OwnershipTransfer
Type: object
pending(required):object | nullOutstanding offer, visible only to the owner and recipient; null for other members.
fromAccountId(required):stringAccount offering ownership.
fromEmail(required):stringOffering owner's email address.
toAccountId(required):stringAccount offered ownership.
toEmail(required):stringRecipient email address.
Generated example:
json
{
"pending": {
"toAccountId": "",
"toEmail": "",
"fromAccountId": "",
"fromEmail": ""
}
}CreditLimitRequestResponse
Type: object | null
The owner's pending request, or null.
creditLimitMicros(required):integer, minimum:0The requested credit limit in micro-USD.
reason(required):stringWhy the owner needs a higher limit.
requestedAt(required):string, format:date-timeWhen the owner requested the increase.
SDK notification stream
The SDK's hand-written watchNotifications async iterator implements the notification WebSocket's x-websocket contract. It uses the same SDK client and bearer token as generated operations. See the agent guide for authenticated socket factories and cancellation.
API versioning
The /v1 contract grows without requiring existing clients to change.
Requests
New operations and optional request fields are additive. Existing allowed enum values remain accepted; adding request enum values is additive. A new required request field, a narrower accepted value, a removed operation, or another incompatible change requires /v2.
Responses
New response fields are additive. Ignore fields you do not use. Response enums are extensible, including webhook event types and error codes: the documented values are known values, not a complete set. Accept unknown values and use a safe fallback rather than an exhaustive switch that throws. The @moq/pro response types accept future values; request enums still describe the values the server currently accepts.
The OpenAPI contract marks these sets with x-extensible-enum. Removing a response field or changing its type incompatibly requires /v2.
Deprecation
Every announced deprecation appears in the deprecation ledger, with the affected operations, replacement, announcement date, deprecation date and sunset date. Affected responses send Deprecation, Sunset and a Link with rel="deprecation" pointing to that entry.
Deprecation uses an @-prefixed Unix timestamp (RFC 9745); Sunset uses an HTTP date (RFC 8594). Deprecation announces migration; it does not change an operation's behavior. An incompatible replacement belongs in /v2, and an announced date does not make a breaking /v1 change additive.