{"openapi":"3.1.0","info":{"title":"Replit API","version":"0.1.0","license":{"name":"Proprietary","url":"https://replit.com/terms-of-service"},"description":"API for Enterprise Account analytics and administration.\nAll operations are scoped to the Account that owns the presented API key.\n"},"servers":[{"url":"https://api.replit.com/v1","description":"Production"}],"security":[{"ApiKey":[]}],"tags":[{"name":"Account","description":"Account-level metadata and summaries."},{"name":"Workspaces","description":"Workspaces owned by the authenticated Account."},{"name":"Members","description":"Account and workspace membership data."},{"name":"Groups","description":"Workspace groups and group membership data."},{"name":"Usage","description":"Account usage and spend reporting."},{"name":"Projects","description":"Projects owned by workspaces in the authenticated Account."},{"name":"Deployments","description":"Deployments owned by a workspace in the authenticated Account."},{"name":"Budgets","description":"Account and workspace usage budgets and limits."},{"name":"Approval requests","description":"Review requests for Budget limit increases, member seats, public Project publishing, and individual Project publishes."},{"name":"Compliance","description":"Account compliance data."}],"paths":{"/workspaces":{"get":{"operationId":"listWorkspaces","tags":["Workspaces"],"summary":"List Account workspaces","description":"Returns workspaces owned by the authenticated Account, ordered by creation time and then ID in descending order.","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/WorkspaceSearch"}],"responses":{"200":{"description":"Workspace list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/workspace-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/workspaces/{workspaceId}":{"get":{"operationId":"getWorkspace","tags":["Workspaces"],"summary":"Get an Account workspace","description":"Returns one workspace owned by the authenticated Account.","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/WorkspaceIdPath"}],"responses":{"200":{"description":"Workspace details.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/workspace-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/members":{"get":{"operationId":"listMembers","tags":["Members"],"summary":"List Account members","description":"Returns the union of Account members ordered by user ID, optionally restricted to one workspace.","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"$ref":"#/components/parameters/Role"},{"$ref":"#/components/parameters/MemberSearch"}],"responses":{"200":{"description":"Member list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/member-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/members/access-requests":{"get":{"operationId":"listMemberAccessRequests","tags":["Approval requests"],"summary":"List member access requests","description":"Returns member access requests for the authenticated Account. Today these are requests from workspace viewers for a member seat.\n\nWithout a status filter, only pending requests are returned. Pass a comma-separated list of statuses to include others. Requests with status `notified` are handled by the Account's identity provider and cannot be reviewed here.\n\nResults are ordered by creation time, newest first. A pagination cursor is valid only with the same effective filters, includeEvents setting, and page size it was issued for. Reusing it with different effective settings returns `invalid_request`. Explicit default values and reordered or repeated statuses do not change these settings.\n\nEvery item includes an opaque `reviewEtag` for that request. Copy the\ncomplete quoted value unchanged into `If-Match` on the matching review\nroute; do not parse it or use the collection HTTP ETag. This enables review\nwithout a detail GET. `includeEvents` changes only whether history is included, not the\n`reviewEtag`; a detail GET remains optional when history or the detail ETag\nis needed.\n","x-replit-required-scopes":["read:*"],"parameters":[{"name":"status","in":"query","description":"Comma-separated list of statuses to include. Defaults to pending.","style":"form","explode":false,"example":["pending","denied"],"schema":{"type":"array","minItems":1,"maxItems":8,"default":["pending"],"items":{"$ref":"#/components/schemas/member-access-request-status"}}},{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"name":"includeEvents","in":"query","description":"When true, each returned request includes its ordered public history.","schema":{"type":"boolean","default":false}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Member access requests visible to the authenticated Account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/member-access-request-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/members/access-requests/{requestId}":{"get":{"operationId":"getMemberAccessRequest","tags":["Approval requests"],"summary":"Get one member access request","description":"Returns one member access request for the authenticated Account, including its public history.\n\nThe response includes a strong opaque `ETag`. Send the complete value\nunchanged in `If-None-Match` on a later detail read. A matching value returns\n304 with no body; otherwise the response is 200 with the request details.\nUse the same tag in `If-Match` when reviewing the request.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/MemberAccessRequestIdPath"},{"$ref":"#/components/parameters/IfNoneMatchHeader"}],"responses":{"200":{"description":"The requested member access request and its public history.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/MemberAccessRequestETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/member-access-request-response"}}}},"304":{"description":"The request representation has not changed since the ETag sent in If-None-Match. The body is empty.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/MemberAccessRequestETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/members/access-requests/{requestId}/reviews":{"post":{"operationId":"reviewMemberAccessRequest","tags":["Approval requests"],"summary":"Approve or deny one member access request","description":"Approve or deny one pending member access request. The API key's creator must be allowed to change member roles in the workspace.\n\nApproving promotes the requester from viewer to member when a seat is available and the workspace's membership policy allows it. A requester who is already a member or admin is fulfilled without using another seat. If the seat cannot be granted, for example because no seat is available or the workspace's roles are managed by an identity provider, the request becomes `fulfillment_failed` and no role changes.\n\nSend `If-Match` with the list item's `reviewEtag` or the detail response's\ncomplete strong `ETag`, unchanged.\nThe tag matches as long as no new event has been recorded on the request\nsince that read; changes to the requester's profile details alone do not\nmake it stale. A missing header returns 428\n(`precondition_required`); a malformed or weak value returns 400\n(`invalid_request`); a stale version returns 412\n(`precondition_failed`); and a current tag on a request that is no longer\npending returns 409 (`request_already_resolved`).\n\nA successful review returns 200 with the updated request, its public\nhistory, a new `ETag`, and `Cache-Control: no-store, no-transform`.\n`requester` is included only when the key also has `read:*`, and remains\nnull when requester details are unavailable. The ETag can differ from a\nsubsequent detail GET's ETag at the same request version.\n\nA read made immediately after a review can briefly return the request's\nprevious state. If the response is lost, wait briefly and read the request\nagain. If it is resolved, do not retry; if it is still pending, retry only\nwith the latest read's ETag.\n","x-replit-required-scopes":["write:members"],"parameters":[{"$ref":"#/components/parameters/MemberAccessRequestIdPath"},{"$ref":"#/components/parameters/MemberAccessRequestIfMatchHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/member-access-request-review"}}}},"responses":{"200":{"description":"The updated request, its public history, and its new ETag. The requester is included only when the key also has `read:*`; a write-only key receives `requester: null`.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/MemberAccessRequestETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/member-access-request-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/RequestReviewConflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"428":{"$ref":"#/components/responses/PreconditionRequired"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/groups":{"get":{"operationId":"listGroups","tags":["Groups"],"summary":"List workspace groups","description":"Returns the groups shown in the Workspace Groups UI across the authenticated Account.\n\nExample request:\n\n`GET /v1/groups?workspaceId=workspace123&limit=2`\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Group list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/group-list-response"},"examples":{"workspaceGroups":{"summary":"Workspace groups","value":{"data":[{"id":"groupAdmins","workspaceId":"workspace123","name":"Admins","type":"admin"},{"id":"groupEngineering","workspaceId":"workspace123","name":"Engineering","type":"custom"}],"pagination":{"cursor":"opaque-signed-cursor","hasMore":true}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/groups/{groupId}/users":{"get":{"operationId":"listGroupUsers","tags":["Groups"],"summary":"List users in a group","description":"Returns active users from one group visible in the Workspace Groups UI.\n\nExample request:\n\n`GET /v1/groups/groupEngineering/users?limit=2`\n\nA missing, hidden, deleted, or cross-Account group returns `404 not_found`:\n\n```json\n{\n  \"error\": {\n    \"code\": \"not_found\",\n    \"message\": \"Group not found.\",\n    \"details\": null\n  }\n}\n```\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/GroupIdPath"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Group user list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/group-user-list-response"},"examples":{"groupUsers":{"summary":"Active group users","value":{"data":[{"userId":"123"},{"userId":"456"}],"pagination":{"cursor":null,"hasMore":false}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/usage":{"get":{"operationId":"getUsage","tags":["Usage"],"summary":"Get Account usage and gross ledger cost","description":"Returns usage-ledger consumption and gross cost from the same provider used by Replit's Usage settings page.\nOmit workspaceId, groupId, userId, and projectId for Account-wide totals. Filters are intersected when combined.\n\ngroupId requires workspaceId and filters usage to users who are active group members when the request is processed. Deleted or disabled memberships, deleted users, and support seats are excluded. An explicit userId is intersected with current group membership. Users can belong to multiple groups, so totals from separate group requests are not additive. Ungrouped and unattributed usage is excluded from group-filtered requests. groupId supports totals, groupBy=member, groupBy=project, groupBy=conversations, and groupBy=timeseries; it cannot be combined with groupBy=workspace. The response does not repeat the group ID or expose group names or internal Account identifiers.\n\nExample: `GET /v1/usage?workspaceId=workspace123&groupId=groupEngineering&groupBy=member`\n\nOmit all range parameters for the current billing period. billingPeriod cannot be combined with startTime or endTime.\nCustom ranges require both startTime and endTime, use inclusive start and exclusive end boundaries, and cannot exceed 366 days.\ngroupBy adds one breakdown; granularity is valid only with groupBy=timeseries.\ngroupBy=member includes every selected metric type and is not limited to Agent usage.\nWith groupBy=project, breakdownBy=member adds a complete member breakdown and explicit unattributed-member metrics to every selected project. Pagination counts projects, and members are ordered by descending cost with userId as the tie-breaker. Requests without breakdownBy retain the existing response shape.\nExample: `GET /v1/usage?groupBy=project&breakdownBy=member&limit=100`\nBreakdown responses are limited to 10,000 project/member/metric detail rows and 8 MiB of JSON. A result exceeding these bounds returns 422 usage_breakdown_too_large without partial data. Reduce limit, narrow the interval, or apply filters to retry. A cursor can be retried with a smaller limit; adding or removing breakdownBy invalidates the cursor.\ngroupBy=conversations returns one environmentType=conversation group. attributableTotalCostUsd is conversation spend, and unattributableTotalCostUsd is all remaining spend for the selected filters.\n\nRecent usage can arrive after a response. Costs are gross usage-ledger values, not settled invoice totals. Account credits, discounts, and net charges are intentionally excluded.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"$ref":"#/components/parameters/GroupIdQuery"},{"$ref":"#/components/parameters/UserIdQuery"},{"$ref":"#/components/parameters/ProjectIdQuery"},{"$ref":"#/components/parameters/UsageBillingPeriod"},{"name":"startTime","in":"query","description":"Inclusive custom UTC interval boundary. Requires endTime.","schema":{"type":"string","format":"date-time"}},{"name":"endTime","in":"query","description":"Exclusive custom UTC interval boundary. Requires startTime.","schema":{"type":"string","format":"date-time"}},{"$ref":"#/components/parameters/UsageMetricTypes"},{"$ref":"#/components/parameters/UsageGroupBy"},{"$ref":"#/components/parameters/UsageBreakdownBy"},{"$ref":"#/components/parameters/UsageGranularity"},{"$ref":"#/components/parameters/UsageLimit"},{"$ref":"#/components/parameters/UsageCursor"}],"responses":{"200":{"description":"Usage summary.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/usage-response"},"examples":{"projectMembers":{"summary":"One project with member-attributed Agent cost and unattributed hosting cost.","value":{"data":{"interval":{"startTime":"2026-06-01T00:00:00.000Z","endTime":"2026-07-01T00:00:00.000Z"},"currency":"USD","totalCostUsd":10,"metrics":[{"id":"agent","name":"Agent","category":"ai","usage":null,"usageUnit":null,"costUsd":8},{"id":"autoscale_requests","name":"Autoscale requests","category":"project_hosting","usage":100,"usageUnit":"count","costUsd":2}],"groupBy":"project","breakdownBy":"member","groups":[{"key":{"projectId":"project1"},"totalCostUsd":10,"metrics":[{"id":"agent","name":"Agent","category":"ai","usage":null,"usageUnit":null,"costUsd":8},{"id":"autoscale_requests","name":"Autoscale requests","category":"project_hosting","usage":100,"usageUnit":"count","costUsd":2}],"breakdown":{"groups":[{"key":{"userId":"42"},"totalCostUsd":8,"metrics":[{"id":"agent","name":"Agent","category":"ai","usage":null,"usageUnit":null,"costUsd":8}]}],"unattributableTotalCostUsd":2,"unattributableMetrics":[{"id":"autoscale_requests","name":"Autoscale requests","category":"project_hosting","usage":100,"usageUnit":"count","costUsd":2}]}}],"attributableTotalCostUsd":10,"unattributableTotalCostUsd":0,"pagination":{"nextCursor":null,"hasMore":false,"totalCount":1}}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"422":{"description":"The complete member breakdown exceeds its result size limit. Reduce limit, narrow the interval, or apply filters.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"},"example":{"error":{"code":"usage_breakdown_too_large","message":"The usage breakdown is too large. Reduce limit, narrow the interval, or apply filters.","details":null}}}}},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects":{"get":{"operationId":"listProjects","tags":["Projects"],"summary":"List Account projects","description":"Returns projects from team workspaces owned by the authenticated Account, ordered by creation time and project ID descending.\nDeleted, admin-hidden, personal-workspace, and cross-Account projects are excluded.\n\nThe deployment filter uses Replit's eventually consistent live-deployment projection. A missing projection row is treated as not deployed.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"search","in":"query","description":"Case-insensitive literal match on project title, slug, or description.","schema":{"type":"string","minLength":1,"maxLength":200}},{"name":"hasDeployment","in":"query","description":"Restrict results by the current live-deployment projection.","schema":{"type":"boolean"}}],"responses":{"200":{"description":"Project list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/project-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects/public-publishing-requests":{"get":{"operationId":"listPublicPublishEnablementRequests","tags":["Approval requests"],"summary":"List public publish enablement requests","description":"Returns public publish enablement requests owned by the authenticated\nAccount. Without a status filter, only pending requests are returned. Use a\ncomma-separated status list to include other lifecycle states.\n\nResults are ordered by creation time, newest first. Cursors are bound to\nthe Account and the effective status, workspaceId, projectId, and limit\nsettings. Reusing a cursor with different effective filters or a different\nlimit returns `invalid_request`. Explicit default values and reordered or\nrepeated statuses do not change these settings.\n\nRequests remain accessible to the Account that received them after a Project\nmoves. A Project outside that Account has a null workspaceId; destination\ndetails are not returned.\nAccount and Project-filtered lists include these retained requests. Workspace\nfilters select only Projects currently in that Account's Workspace.\n\nEvery item includes an opaque `reviewEtag`. Copy the complete quoted value\nunchanged into `If-Match` on the matching review\nroute; do not parse it or use the collection HTTP ETag. This enables review\nwithout a detail GET. A detail GET remains optional when event history or\nthe detail ETag is needed.\n\nRequesters are represented by `requesterUserId`, not a user profile. List\nentries do not include event history; use the detail operation to retrieve it.\n","x-replit-required-scopes":["read:*"],"parameters":[{"name":"status","in":"query","style":"form","explode":false,"example":["pending","denied"],"schema":{"type":"array","minItems":1,"default":["pending"],"items":{"$ref":"#/components/schemas/PublicPublishEnablementRequestStatus"}}},{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"$ref":"#/components/parameters/PublicPublishEnablementProjectIdQuery"},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Public publish enablement request list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPublishEnablementRequestListResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects/public-publishing-requests/{requestId}":{"get":{"operationId":"getPublicPublishEnablementRequest","tags":["Approval requests"],"summary":"Get a public publish enablement request","description":"Returns one request with its ordered public event history. The requester\nis represented by `requesterUserId`, not a user profile.\n\nRequests remain accessible to the Account that received them after a Project\nmoves. A Project outside that Account has a null workspaceId; destination\ndetails are not returned.\n\nThe response includes a strong opaque `ETag`. Send the complete value\nunchanged in `If-None-Match` on a later detail read. A matching value returns\n304 with no body; otherwise the response is 200 with the request details.\nUse the same tag in `If-Match` when reviewing the request.\n\nThe tag changes when the request's event history or visible Workspace\nchanges, but not for every change to the response's other fields. Omit\n`If-None-Match` when you need the latest complete response.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/PublicPublishEnablementRequestIdPath"},{"$ref":"#/components/parameters/PublicPublishEnablementIfNoneMatchHeader"}],"responses":{"200":{"description":"Public publish enablement request with event history.","headers":{"ETag":{"$ref":"#/components/headers/PublicPublishEnablementRequestETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPublishEnablementRequestResponse"}}}},"304":{"description":"The conditional request matched the current ETag. The body is empty. Other response fields can change without changing the tag; omit If-None-Match to retrieve the latest complete response.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/PublicPublishEnablementRequestETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects/public-publishing-requests/{requestId}/reviews":{"post":{"operationId":"reviewPublicPublishEnablementRequest","tags":["Approval requests"],"summary":"Review a public publish enablement request","description":"Approve or deny one pending public publish enablement request owned by this\nAccount. The API key's creator must retain approval-management access for\nthe Account. Requests remain reviewable by the Account that received them\nafter a Project moves.\n\nApproval grants a Project-specific public publishing override; it does not\ncreate or publish a deployment. If the Project's current Account differs\nfrom the request's Account, approval records `fulfillment_failed` rather\nthan granting the override. Other eligibility failures return 409\n(`conflict`) and leave the request pending. Projects that are no longer\navailable for review return 404 (`not_found`).\n\nSend the list item's `reviewEtag` or the detail response's complete opaque\n`ETag` unchanged in `If-Match`. Reload after an ownership change\nand use the new tag, even if no new request event was recorded.\n\nA missing header returns 428 (`precondition_required`); a malformed or weak\nvalue returns 400 (`invalid_request`); a tag made stale by a new request\nevent or a change to the visible Workspace returns 412\n(`precondition_failed`); and a current tag on a request that is no longer\npending returns 409 (`request_already_resolved`).\n\nA successful review returns 200 with the updated request, its ordered\npublic event history, a new ETag, and `Cache-Control: no-store, no-transform`.\nCheck `data.status` to distinguish `fulfilled` from `fulfillment_failed`;\nan accepted approval does not guarantee that the override was granted.\n\nA read made immediately after a review can briefly return the request's\nprevious state. If the response is lost, wait briefly and read the\nrequest again. If it is resolved, do not\nretry; if still pending, retry only with the latest read's ETag. The\nreturned ETag changes with the request's event history or visible Workspace,\nbut not with every change to other response fields.\n","x-replit-required-scopes":["write:deployments"],"parameters":[{"$ref":"#/components/parameters/PublicPublishEnablementRequestIdPath"},{"$ref":"#/components/parameters/PublicPublishEnablementIfMatchHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPublishEnablementRequestReview"}}}},"responses":{"200":{"description":"Reviewed public publish enablement request.","headers":{"ETag":{"$ref":"#/components/headers/PublicPublishEnablementRequestETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublicPublishEnablementRequestResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ReviewConflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"428":{"$ref":"#/components/responses/PreconditionRequired"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects/publishing-requests":{"get":{"operationId":"listPublishingRequests","tags":["Approval requests"],"summary":"List publishing approval requests","description":"Returns publishing approval requests owned by the authenticated Account.\nEach request asks to publish one Project; requests to allow public\npublishing are a separate flow. Without a status filter, only pending\nrequests are returned. Use a comma-separated status list to include other\nlifecycle states.\n\nResults are ordered by creation time, newest first. Cursors are bound to\nthe Account and the effective status, workspaceId, projectId, and limit\nsettings. Reusing a cursor with different effective filters or a different\nlimit returns `invalid_request`. Explicit default values and reordered or\nrepeated statuses do not change these settings.\n\nRequests remain accessible to the Account that received them after a Project\nmoves. A Project outside that Account has a null workspaceId; destination\ndetails are not returned. Account and Project-filtered lists include these\nretained requests. Workspace filters select only Projects currently in that\nAccount's Workspace.\n\nEvery item includes an opaque `reviewEtag`. Copy the complete quoted value\nunchanged into `If-Match` on the matching review route; do not parse it or\nuse the collection HTTP ETag. This enables review without a detail GET. A\ndetail GET remains optional when event history or the detail ETag is\nneeded.\n\nRequesters are represented by `requesterUserId`, not a user profile. List\nentries do not include event history; use the detail operation to retrieve\nit.\n","x-replit-required-scopes":["read:*"],"parameters":[{"name":"status","in":"query","style":"form","explode":false,"example":["pending","denied"],"schema":{"type":"array","minItems":1,"default":["pending"],"items":{"$ref":"#/components/schemas/PublishingRequestStatus"}}},{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"name":"projectId","in":"query","description":"Restrict results to the stored Project ID on requests owned by the authenticated Account, including requests retained after that Project moves to another Account.","schema":{"type":"string","format":"uuid"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Publishing approval request list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishingRequestListResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects/publishing-requests/{requestId}":{"get":{"operationId":"getPublishingRequest","tags":["Approval requests"],"summary":"Get a publishing approval request","description":"Returns one request with its ordered public event history. The requester\nis represented by `requesterUserId`, not a user profile.\n\nRequests remain accessible to the Account that received them after a Project\nmoves. A Project outside that Account has a null workspaceId; destination\ndetails are not returned.\n\nAfter approval, `execution` describes the resulting publish:\n`execution.operationId` identifies it once publishing starts, and\n`execution.message` explains a failed publish and what to do next.\n\nThe response includes a strong opaque `ETag`. Send the complete value\nunchanged in `If-None-Match` on a later detail read. A matching value returns\n304 with no body; otherwise the response is 200 with the request details.\nUse the same tag in `If-Match` when reviewing the request.\n\nThe tag changes when the request's event history or visible Workspace\nchanges, but not for every change to the response's other fields. Omit\n`If-None-Match` when you need the latest complete response.\n","x-replit-required-scopes":["read:*"],"parameters":[{"name":"requestId","in":"path","description":"Publishing approval request identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-None-Match","in":"header","description":"ETag from an earlier publishing approval detail read. Copy the complete quoted value unchanged. A matching validator returns 304 with no body. The tag changes with the request's event history or visible Workspace, but not with every change to other response fields. Omit this header to retrieve the latest complete response. Supports standard HTTP conditional requests, including weak validators, comma-separated validators, and '*'.","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Publishing approval request with event history.","headers":{"ETag":{"description":"Strong opaque entity tag for conditional reads and reviews. It changes when the request's event history or visible Workspace changes, but not for every change to other response fields. Send the complete value unchanged in If-Match or If-None-Match. Omit If-None-Match to retrieve the latest complete response.","required":true,"schema":{"$ref":"#/components/schemas/PublishingRequestEtag"}},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishingRequestResponse"}}}},"304":{"description":"The conditional request matched the current ETag. The body is empty. Other response fields can change without changing the tag; omit If-None-Match to retrieve the latest complete response.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"description":"Strong opaque entity tag for conditional reads and reviews. It changes when the request's event history or visible Workspace changes, but not for every change to other response fields. Send the complete value unchanged in If-Match or If-None-Match. Omit If-None-Match to retrieve the latest complete response.","required":true,"schema":{"$ref":"#/components/schemas/PublishingRequestEtag"}},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/projects/publishing-requests/{requestId}/reviews":{"post":{"operationId":"reviewPublishingRequest","tags":["Approval requests"],"summary":"Review a publishing approval request","description":"Approve or deny one pending publishing approval request owned by this\nAccount. The API key's creator must retain approval-management access for\nthe Account.\n\nApproval starts publishing the Project on behalf of the original requester.\nThe review body contains only the decision and, for a denial, an optional\nreason. Approval does not wait for publishing to finish: read the request\nuntil `data.status` is `fulfilled` or `fulfillment_failed`. If publishing\nfails, `data.execution.message` explains what to do next.\n\nSend the list item's `reviewEtag` or the detail response's complete opaque\n`ETag` unchanged in `If-Match`. Reload after an ownership change and use the\nnew tag, even if no new request event was recorded.\n\nA missing header returns 428 (`precondition_required`); a malformed or weak\nvalue returns 400 (`invalid_request`); a tag made stale by a new request\nevent or a change to the visible Workspace returns 412\n(`precondition_failed`); a current tag on a request that is no longer\npending returns 409 (`request_already_resolved`); and a decision that the\nrequest cannot accept returns 409 (`conflict`).\n\nA successful review returns 200 with the updated request, its ordered\npublic event history, a new ETag, and `Cache-Control: no-store, no-transform`.\n\nA read made immediately after a review can briefly return the request's\nprevious state. If the response is lost, wait briefly and read the request\nagain. If it is resolved, do not retry; if still pending, retry only with\nthe latest read's ETag. The returned ETag changes with the request's event\nhistory or visible Workspace, but not with every change to other response\nfields.\n","x-replit-required-scopes":["write:deployments"],"parameters":[{"name":"requestId","in":"path","description":"Publishing approval request identifier.","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","description":"The ETag from the latest detail read or the matching list item's reviewEtag. Copy the complete opaque value unchanged. Reload the list or detail after an ownership change before reviewing the request.","required":true,"schema":{"$ref":"#/components/schemas/PublishingRequestEtag"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishingRequestReview"}}}},"responses":{"200":{"description":"Reviewed publishing approval request.","headers":{"ETag":{"description":"Strong opaque entity tag for conditional reads and reviews. It changes when the request's event history or visible Workspace changes, but not for every change to other response fields. Send the complete value unchanged in If-Match or If-None-Match. Omit If-None-Match to retrieve the latest complete response.","required":true,"schema":{"$ref":"#/components/schemas/PublishingRequestEtag"}},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PublishingRequestResponse"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ReviewConflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"428":{"$ref":"#/components/responses/PreconditionRequired"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/deployments":{"get":{"operationId":"listDeployments","tags":["Deployments"],"summary":"List workspace deployments","description":"Returns deployments from one workspace owned by the authenticated Account, ordered by publish time and project ID descending.\nDeleted, admin-hidden, personal-workspace, and cross-Account projects are excluded.\nWhen projectId is supplied, the project must belong to the selected workspace or the list is empty.\n","x-replit-required-scopes":["read:*"],"parameters":[{"name":"workspaceId","in":"query","required":true,"description":"Workspace owned by the authenticated Account.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"},{"name":"projectId","in":"query","description":"Restrict results to one project in the selected workspace.","schema":{"type":"string","format":"uuid"}},{"name":"status","in":"query","schema":{"$ref":"#/components/schemas/deployment-status"}}],"responses":{"200":{"description":"Deployment list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/deployment-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/deployments/{deploymentId}":{"get":{"operationId":"getDeployment","tags":["Deployments"],"summary":"Get a deployment","description":"Returns one deployment owned by a workspace in the authenticated Account.\nMissing, deleted, admin-hidden, personal-workspace, and cross-Account deployments return the same not-found response.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/DeploymentIdPath"}],"responses":{"200":{"description":"Deployment details.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/deployment-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/budgets":{"get":{"operationId":"listBudgets","tags":["Budgets"],"summary":"List Account and Workspace budgets","description":"Returns spending controls for the authenticated Account and Agent usage limits for its Workspaces, groups, and members. Account spending controls apply to usage-based spend. Workspace, group, and member limits apply to Agent usage during the current billing cycle.\n\nAccount spending controls are included unless excluded by a type or Workspace filter. A null threshold means that control is not configured. Workspace, group, and member limits are included only when configured.\n\nWhen multiple filters are provided, all filters apply. Supplying workspaceId excludes Account spending controls. Therefore, combining workspaceId with type=account_spending_controls returns an empty page.\n\nResults are ordered by type, then workspaceId, then group or member ID. Pagination cursors are tied to the authenticated Account and the original type, workspaceId, and limit values. Reusing a cursor with different parameters returns invalid_request.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"name":"type","in":"query","description":"Filter results by budget type.","schema":{"$ref":"#/components/schemas/budget-type"}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Configured spending controls and Agent usage limits.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}},"post":{"operationId":"updateBudget","tags":["Budgets"],"summary":"Set or clear a budget","description":"Sets, replaces, or clears one budget or limit using the same desired-state behavior as the Usage settings UI. Repeating an identical request leaves the existing state unchanged.","x-replit-required-scopes":["write:budgets"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-update"}}}},"responses":{"200":{"description":"Resulting budget configuration, or null after clearing it.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-update-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/Conflict"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/BudgetServiceUnavailable"}}}},"/budgets/limit-increase-requests":{"get":{"operationId":"listBudgetLimitIncreaseRequests","tags":["Approval requests"],"summary":"List Budget limit increase requests","description":"Returns Budget limit increase requests owned by the authenticated Account.\n\nRequests can target an individual member limit, a Workspace default member\nlimit, or a shared group limit. Use `type=workspace_group_limit` to list\ngroup requests. Only group requests include `groupId` and `group`.\n\nExample request:\n\n`GET /v1/budgets/limit-increase-requests?workspaceId=workspace123&type=workspace_group_limit`\n\nWithout a status filter, only pending requests are returned. The status parameter accepts a comma-separated list of statuses to return requests in any of those statuses.\n\nResults are ordered by creation time, newest first. Pagination cursors are tied to the authenticated Account and the effective status, workspaceId, type, includeEvents, and limit settings. Reusing a cursor with different effective settings returns `invalid_request`. Explicit default values and reordered or repeated statuses do not change these settings.\n\nEvery item includes an opaque `reviewEtag` for that request. Copy the\ncomplete quoted value unchanged into `If-Match` on the matching review\nroute; do not parse it or use the collection HTTP ETag. This enables review\nwithout a detail GET. `includeEvents` changes only whether history is included, not the\n`reviewEtag`; a detail GET remains optional when history or the detail ETag\nis needed. Each request's ordered public history is included when\n`includeEvents` is true.\n","x-replit-required-scopes":["read:*"],"parameters":[{"name":"status","in":"query","description":"Comma-separated list of statuses to include. Defaults to pending.","style":"form","explode":false,"example":["pending","denied"],"schema":{"type":"array","minItems":1,"maxItems":7,"default":["pending"],"items":{"$ref":"#/components/schemas/budget-limit-increase-request-status"}}},{"$ref":"#/components/parameters/WorkspaceIdQuery"},{"name":"type","in":"query","description":"Filter results by requested Budget limit type.","schema":{"$ref":"#/components/schemas/budget-limit-increase-request-type"}},{"name":"includeEvents","in":"query","description":"When true, each returned request includes its ordered public history.","schema":{"type":"boolean","default":false}},{"$ref":"#/components/parameters/Limit"},{"$ref":"#/components/parameters/Cursor"}],"responses":{"200":{"description":"Budget limit increase requests visible to the authenticated Account.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-limit-increase-request-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/budgets/limit-increase-requests/{requestId}":{"get":{"operationId":"getBudgetLimitIncreaseRequest","tags":["Approval requests"],"summary":"Get one Budget limit increase request","description":"Returns one Budget limit increase request owned by the authenticated Account, including its ordered public history.\n\nFor a `workspace_group_limit` request, `groupId` identifies the group whose\nshared limit was requested. It does not change when the group is renamed\nor another limit becomes applicable to the requester. `group` contains\nits current ID and name, or is null when the group is no longer available.\n\nThe response includes a strong opaque `ETag`. Send the complete value\nunchanged in `If-None-Match` on a later detail read. A matching value returns\n304 with no body; otherwise the response is 200 with the request details.\nUse the same tag in `If-Match` when reviewing the request.\n","x-replit-required-scopes":["read:*"],"parameters":[{"$ref":"#/components/parameters/BudgetLimitIncreaseRequestIdPath"},{"$ref":"#/components/parameters/IfNoneMatchHeader"}],"responses":{"200":{"description":"The requested Budget limit increase request and its public history.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/ETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-limit-increase-request-response"}}}},"304":{"description":"The request representation has not changed since the ETag sent in If-None-Match. The body is empty.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/ETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/budgets/limit-increase-requests/{requestId}/reviews":{"post":{"operationId":"reviewBudgetLimitIncreaseRequest","tags":["Approval requests"],"summary":"Approve or deny one Budget limit increase request","description":"Approves or denies one pending Budget limit increase request. A successful approval also applies the Budget limit change.\n\nThe API key's creator must retain Budget-management access for the target\nWorkspace; `write:budgets` alone is insufficient. The approved `amountUsd`\nis the final limit, not an increment, and must exceed the current limit.\nAn amount at or below the current limit returns 409 (`conflict`).\n\nFor a `workspace_group_limit` request, approval increases the shared limit\nof the group identified by `groupId`, not the requester's individual limit.\nOther applicable usage limits remain in effect.\n\nSend the list item's `reviewEtag` or the detail response's strong ETag\nunchanged in `If-Match`. A new event on the request makes an earlier review token stale; changes to\nthe requester's profile, Workspace details, or group name alone do not.\nA missing header returns 428 (`precondition_required`); a malformed or weak\nvalue returns 400 (`invalid_request`); a stale version returns 412\n(`precondition_failed`); and a current tag on a request that is no longer\npending returns 409 (`request_already_resolved`). A concurrent budget\nupdate can instead return 409 (`budget_update_in_progress`) with\n`Retry-After: 1`.\n\nA successful review returns 200 with the updated request, its public\nhistory, a new `ETag`, and `Cache-Control: no-store, no-transform`.\nBoth `requester` and `workspace` are always null in review responses.\nGroup requests retain `groupId`, but `group` is also null, even when the\nkey also has `read:*`. The ETag can differ from a subsequent\ndetail GET's ETag at the same request version. Either token can be used\nfor a review; use the detail GET's ETag for conditional detail reads.\nThis operation returns the updated request, not a separate review resource.\n\nA read made immediately after a review can briefly return the request's\nprevious state. If the response is lost, wait briefly and read the request\nagain. If it is resolved, do not retry; if\nstill pending, retry only if the decision is still intended and use the\nlatest read's ETag.\n","x-replit-required-scopes":["write:budgets"],"parameters":[{"$ref":"#/components/parameters/BudgetLimitIncreaseRequestIdPath"},{"$ref":"#/components/parameters/IfMatchHeader"}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-limit-increase-request-review"}}}},"responses":{"200":{"description":"The updated request with requester and workspace set to null (and group set to null for group requests), its public history, and its new ETag.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"ETag":{"$ref":"#/components/headers/ETag"},"Cache-Control":{"$ref":"#/components/headers/ApprovalRequestCacheControl"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/budget-limit-increase-request-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"404":{"$ref":"#/components/responses/NotFound"},"409":{"$ref":"#/components/responses/ReviewConflict"},"412":{"$ref":"#/components/responses/PreconditionFailed"},"428":{"$ref":"#/components/responses/PreconditionRequired"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/audit-logs":{"get":{"operationId":"listAuditLogsLegacy","deprecated":true,"tags":["Compliance"],"summary":"List Account messages using the legacy route","description":"Deprecated alias for `GET /compliance/messages`. New integrations must use `/compliance/messages` with `compliance:messages:read`.\n\nExisting API keys with `audit-logs:read` remain valid for this route and `/compliance/messages`.\n","x-replit-required-scopes":["compliance:messages:read"],"parameters":[{"name":"occurredAfter","in":"query","description":"Inclusive UTC RFC 3339 lower bound on returned events' `occurredAt`, with at most six fractional digits. Required without a cursor.","schema":{"type":"string","format":"date-time","pattern":"^(?!0000-)\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?Z$"}},{"name":"occurredBefore","in":"query","description":"Exclusive UTC RFC 3339 upper bound on returned events' `occurredAt`, with at most six fractional digits. Required without a cursor and no more than 24 hours after `occurredAfter`.","schema":{"type":"string","format":"date-time","pattern":"^(?!0000-)\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?Z$"}},{"name":"limit","in":"query","description":"Maximum complete events to return. Defaults to 25.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25}},{"name":"messageRef","in":"query","description":"Optional opaque message identifier for an exact match. Do not parse or transform this value.","schema":{"type":"string","minLength":1,"maxLength":500}},{"name":"cursor","in":"query","description":"Opaque continuation cursor from the previous response.","schema":{"type":"string","minLength":1,"maxLength":4096}}],"responses":{"200":{"description":"Message event list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/audit-log-list-response"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}},"/compliance/messages":{"get":{"operationId":"listAuditLogs","tags":["Compliance"],"summary":"List Account messages","description":"Enriches retained `project.message_sent` audit events with the full text of the user's prompt in the `promptText` field. Results are scoped to the Account associated with the API key. The Account cannot be specified in the request.\n\nThe first request must provide an `occurredAfter` and `occurredBefore` window over `occurredAt` no longer than 24 hours. The optional `messageRef` parameter returns only events with an exact match for the opaque `messageRef` value. Do not parse or transform this value. Continuation cursors expire after one hour. If window, limit, or `messageRef` parameters accompany a cursor, they must match the original request.\n\nEvents are ordered by `occurredAt` and `eventId` ascending. Each response contains only complete events and is limited to 8 MiB of uncompressed UTF-8 JSON. If one event exceeds that limit, the request returns `422 audit_log_content_too_large` instead of truncating its content.\n\nEvents can become available after their `occurredAt`. The returned `observedAt` records when Replit received the event, can be later than `occurredAt`, and is not used to filter this operation. This API does not provide a completion watermark or a guaranteed bound on late arrivals. Polling with overlapping windows reduces the risk of missing late events but cannot guarantee completeness. Deduplicate events by `eventId`.\n\nExample request:\n\n`GET /v1/compliance/messages?occurredAfter=2026-08-04T00%3A00%3A00Z&occurredBefore=2026-08-05T00%3A00%3A00Z&messageRef=message123&limit=25`\n\nAn invalid cursor returns `400 invalid_cursor`:\n\n```json\n{\n  \"error\": {\n    \"code\": \"invalid_cursor\",\n    \"message\": \"Audit log cursor is invalid for this request.\",\n    \"details\": null\n  }\n}\n```\n\nAn event that cannot fit in a complete response returns `422 audit_log_content_too_large`:\n\n```json\n{\n  \"error\": {\n    \"code\": \"audit_log_content_too_large\",\n    \"message\": \"One audit log event exceeds the response size limit.\",\n    \"details\": null\n  }\n}\n```\n","x-replit-required-scopes":["compliance:messages:read"],"parameters":[{"name":"occurredAfter","in":"query","description":"Inclusive UTC RFC 3339 lower bound on returned events' `occurredAt`, with at most six fractional digits. Required without a cursor.","schema":{"type":"string","format":"date-time","pattern":"^(?!0000-)\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?Z$","example":"2026-08-04T00:00:00Z"}},{"name":"occurredBefore","in":"query","description":"Exclusive UTC RFC 3339 upper bound on returned events' `occurredAt`, with at most six fractional digits. Required without a cursor and no more than 24 hours after `occurredAfter`.","schema":{"type":"string","format":"date-time","pattern":"^(?!0000-)\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{1,6})?Z$","example":"2026-08-05T00:00:00Z"}},{"name":"limit","in":"query","description":"Maximum complete events to return. Defaults to 25.","schema":{"type":"integer","minimum":1,"maximum":100,"default":25,"example":25}},{"name":"messageRef","in":"query","description":"Optional opaque message identifier for an exact match. Do not parse or transform this value.","schema":{"type":"string","minLength":1,"maxLength":500,"example":"message123"}},{"name":"cursor","in":"query","description":"Opaque continuation cursor from the previous response.","schema":{"type":"string","minLength":1,"maxLength":4096,"example":"opaque-continuation-cursor"}}],"responses":{"200":{"description":"Audit log event list.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/audit-log-list-response"},"examples":{"messageSentEvents":{"summary":"Agent message event","value":{"data":[{"eventId":"8a4be785-24a8-5f65-b544-a5e5b6b4fb26","observedAt":"2026-08-04T10:00:02Z","occurredAt":"2026-08-04T10:00:00Z","action":"project.message_sent","schemaVersion":1,"actor":{"type":"user","userId":"123"},"workspace":{"id":"workspace123"},"project":{"id":"project123"},"sessionId":"session123","messageRef":"message123","promptText":"Summarize the deployment changes in this project."}],"pagination":{"cursor":"opaque-signed-cursor","hasMore":true}}}}}}},"400":{"$ref":"#/components/responses/BadRequest"},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"},"422":{"$ref":"#/components/responses/UnprocessableEntity"},"429":{"$ref":"#/components/responses/RateLimited"},"500":{"$ref":"#/components/responses/InternalError"},"503":{"$ref":"#/components/responses/ServiceUnavailable"}}}}},"components":{"securitySchemes":{"ApiKey":{"type":"http","scheme":"bearer","bearerFormat":"Replit API key","description":"Account API key beginning with `rpl_`."}},"headers":{"RequestId":{"description":"Stable identifier for this request, suitable for support inquiries.","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"example":"req_B7sD2V0nQ9f4"}},"RateLimitLimit":{"description":"Maximum requests allowed in the most constrained applicable rate-limit window.","required":true,"schema":{"type":"integer","minimum":1}},"RateLimitRemaining":{"description":"Requests remaining in the window reported by X-RateLimit-Limit.","required":true,"schema":{"type":"integer","format":"int64","minimum":0}},"RateLimitReset":{"description":"Unix timestamp in seconds when the window reported by X-RateLimit-Limit resets.","required":true,"schema":{"type":"integer","format":"int64","minimum":0}},"WwwAuthenticate":{"description":"Authentication challenge for the Replit API bearer-key scheme.","required":true,"schema":{"type":"string","example":"Bearer realm=\"Replit API\""}},"RetryAfter":{"description":"Seconds until another request may be attempted.","required":true,"schema":{"type":"integer","minimum":0}},"MemberAccessRequestETag":{"description":"Strong opaque entity tag for the returned approval-request details. Copy the complete value unchanged into If-None-Match for a conditional detail read or If-Match for a review. Do not construct or parse this value.","required":true,"schema":{"type":"string","minLength":3,"maxLength":25,"pattern":"^\"[1-9][0-9]{0,9}-[0-9a-f]{12}\"$","example":"\"3-9f2c1a7b4e0d\""}},"ApprovalRequestCacheControl":{"description":"Approval-request detail and review responses are not cacheable and must not be transformed.","required":true,"schema":{"type":"string","const":"no-store, no-transform"}},"PublicPublishEnablementRequestETag":{"description":"Strong opaque entity tag for conditional reads and reviews. It changes when the request's event history or visible Workspace changes, but not for every change to other response fields. Send the complete value unchanged in If-Match or If-None-Match. Omit If-None-Match to retrieve the latest complete response.","required":true,"schema":{"type":"string","minLength":20,"maxLength":29,"pattern":"^\"[1-9][0-9]{0,9}\\.[A-Za-z0-9_-]{16}\"$","example":"\"3.47DEQpj8HBSa-_TI\""}},"ETag":{"description":"Strong opaque entity tag for the returned approval-request details. Copy the complete value unchanged into If-None-Match for a conditional detail read or If-Match for a review. Do not construct or parse this value.","required":true,"schema":{"type":"string","minLength":3,"maxLength":25,"example":"\"3-9f2c1a7b4e0d\""}}},"schemas":{"workspace-summary":{"type":"object","additionalProperties":false,"required":["id","name","slug","memberCount","projectCount"],"properties":{"id":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$","example":"01HW01ABCDEF"},"name":{"type":"string","minLength":2,"maxLength":50,"example":"Engineering"},"slug":{"type":"string","minLength":2,"maxLength":28,"pattern":"^[0-9A-Za-z-]+$","example":"eng"},"memberCount":{"type":"integer","minimum":0},"projectCount":{"type":"integer","minimum":0}}},"account-summary-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["account","seats","workspaces","scim","settings"],"properties":{"account":{"type":"object","additionalProperties":false,"required":["id","name","createdAt"],"properties":{"id":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20,"example":"12345"},"name":{"type":["string","null"],"minLength":1,"example":"Acme Engineering"},"createdAt":{"type":"string","format":"date-time"}}},"seats":{"description":"Seat totals include active users and pending invitations. Each person or invite is counted once at the highest role held across all Account workspaces. Admins combines Account admins with workspace admins; support seats are excluded.","type":"object","additionalProperties":false,"required":["admins","members","viewers","guests","membersCap"],"properties":{"admins":{"type":"integer","minimum":0},"members":{"type":"integer","minimum":0},"viewers":{"type":"integer","minimum":0},"guests":{"type":"integer","minimum":0},"membersCap":{"description":"Maximum paid-seat allocation across admins, members, and guests. Compare the cap with admins + members + guests; viewer seats are tracked separately and do not consume this cap.","type":["integer","null"],"minimum":0}}},"workspaces":{"description":"Up to 100 workspaces owned by the Account. Use GET /workspaces to page through every workspace when the Account has more.","type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/workspace-summary"}},"scim":{"type":"object","additionalProperties":false,"required":["enabled","isDirectorySyncActive"],"properties":{"enabled":{"description":"Whether the Account is backed by a WorkOS organization, which is provisioned when SCIM is set up and also underpins audit logs. True does not by itself guarantee an active directory sync; use isDirectorySyncActive for that.","type":"boolean"},"isDirectorySyncActive":{"description":"Whether the Account has completed WorkOS directory sync, meaning SCIM provisioning is actively running.","type":"boolean"}}},"settings":{"type":"object","additionalProperties":false,"required":["requirePrivateDeployments","restrictPublicDeploymentsToAdmins","requireGitRemoteBeforeDeployment","restrictGitRemoteBypassToAdmins","requireSecurityScanOnDeployment","restrictSecurityScanBypassToAdmins"],"properties":{"requirePrivateDeployments":{"description":"All deployments must be private.","type":"boolean"},"restrictPublicDeploymentsToAdmins":{"description":"Public deployments are allowed but only admins of the affected workspace may create them. Independent of requirePrivateDeployments.","type":"boolean"},"requireGitRemoteBeforeDeployment":{"description":"A connected Git remote is required before deploying.","type":"boolean"},"restrictGitRemoteBypassToAdmins":{"description":"Only admins of the affected workspace may bypass the Git remote requirement.","type":"boolean"},"requireSecurityScanOnDeployment":{"description":"A security scan is required on deployment.","type":"boolean"},"restrictSecurityScanBypassToAdmins":{"description":"Only admins of the affected workspace may bypass the security scan requirement.","type":"boolean"}}}}}}},"api-error":{"type":"object","additionalProperties":false,"required":["error"],"properties":{"error":{"type":"object","additionalProperties":false,"required":["code","message","details"],"properties":{"code":{"type":"string","enum":["invalid_request","unauthenticated","forbidden","cross_workspace_access","workspace_not_found","not_found","budget_update_in_progress","conflict","request_already_resolved","precondition_failed","precondition_required","rate_limited","internal_error","service_unavailable","invalid_cursor","expired_cursor","audit_log_content_too_large","usage_breakdown_too_large"]},"message":{"type":"string","minLength":1,"maxLength":500,"example":"The request parameters are invalid."},"details":{"description":"Structured context, or null when no details apply.","type":["object","null"],"maxProperties":20,"additionalProperties":true}}}}},"workspace":{"type":"object","additionalProperties":false,"required":["id","name","slug","memberCount","projectCount","admins","createdAt"],"properties":{"id":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$","example":"01HW01ABCDEF"},"name":{"type":"string","minLength":2,"maxLength":50,"example":"Engineering"},"slug":{"type":"string","minLength":2,"maxLength":28,"pattern":"^[0-9A-Za-z-]+$","example":"eng"},"memberCount":{"type":"integer","minimum":0},"projectCount":{"type":"integer","minimum":0},"admins":{"description":"Up to 100 workspace admins. This preview is truncated when the workspace has more; memberCount reflects the full membership size.","type":"array","maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["userId","username"],"properties":{"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"username":{"type":"string","minLength":1,"maxLength":255}}}},"createdAt":{"type":"string","format":"date-time"}}},"pagination":{"oneOf":[{"type":"object","additionalProperties":false,"required":["cursor","hasMore"],"properties":{"cursor":{"description":"Opaque cursor for the next page.","type":"string","minLength":1,"maxLength":2048},"hasMore":{"type":"boolean","const":true}}},{"type":"object","additionalProperties":false,"required":["cursor","hasMore"],"properties":{"cursor":{"description":"Null when no page remains.","type":"null"},"hasMore":{"type":"boolean","const":false}}}]},"workspace-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/workspace"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"workspace-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"$ref":"#/components/schemas/workspace"}}},"member-role":{"type":"string","enum":["admin","member","viewer","guest"]},"member":{"type":"object","additionalProperties":false,"required":["user","workspaces","isAccountAdmin","lastSeen"],"properties":{"user":{"type":"object","additionalProperties":false,"required":["id","username","email","firstName","lastName"],"properties":{"id":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"username":{"type":"string","minLength":1,"maxLength":255},"email":{"type":"string","format":"email","maxLength":320},"firstName":{"type":["string","null"],"maxLength":255},"lastName":{"type":["string","null"],"maxLength":255}}},"workspaces":{"description":"Up to 100 workspace memberships visible to the authenticated Account key.","type":"array","maxItems":100,"items":{"type":"object","additionalProperties":false,"required":["id","name","slug","role","isDisabled","joinedAt"],"properties":{"id":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"name":{"type":"string","minLength":2,"maxLength":50},"slug":{"type":"string","minLength":2,"maxLength":28,"pattern":"^[0-9A-Za-z-]+$"},"role":{"$ref":"#/components/schemas/member-role"},"isDisabled":{"description":"Whether this workspace membership is disabled.","type":"boolean"},"joinedAt":{"type":"string","format":"date-time"}}}},"isAccountAdmin":{"description":"Whether the user administers the Account independently of workspace roles.","type":"boolean"},"lastSeen":{"description":"Most recent recorded Replit activity, or null when unavailable.","type":["string","null"],"format":"date-time"}}},"member-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/member"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"member-access-request-status":{"type":"string","description":"Where the request is in its lifecycle.\n\n- `pending`: waiting for an admin to approve or deny it.\n- `approved`: an admin approved it and the seat change is being applied.\n- `fulfillment_started`: the seat change is in progress.\n- `fulfilled`: the requester now has a member seat.\n- `fulfillment_failed`: an admin approved it, but the seat could not be granted, for example because no seat was available or the workspace's roles are managed by an identity provider. No role changed.\n- `denied`: an admin denied it.\n- `canceled`: the request was withdrawn.\n- `notified`: the request was handed to the Account's identity provider, which manages roles for this workspace. Replit does not review these requests.\n","enum":["pending","notified","approved","fulfillment_started","fulfilled","fulfillment_failed","denied","canceled"]},"approval-requester":{"type":"object","additionalProperties":false,"required":["id","username","email","firstName","lastName"],"properties":{"id":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"username":{"type":"string","minLength":1,"maxLength":255},"email":{"type":"string","format":"email","maxLength":320},"firstName":{"type":["string","null"],"maxLength":255},"lastName":{"type":["string","null"],"maxLength":255}}},"member-access-request-event":{"type":"object","additionalProperties":false,"description":"One entry in a request's ordered public history.","required":["sequence","eventType","fromStatus","toStatus","actor","publicNote","occurredAt"],"properties":{"sequence":{"type":"integer","minimum":1,"description":"Position in the request history. Sequence 1 is the creation event."},"eventType":{"type":"string","enum":["request_started","request_approved","request_denied","request_canceled","request_fulfillment_started","request_fulfilled","request_fulfillment_failed"]},"fromStatus":{"description":"Status before this event. Null only on the creation event.","oneOf":[{"$ref":"#/components/schemas/member-access-request-status"},{"type":"null"}]},"toStatus":{"$ref":"#/components/schemas/member-access-request-status"},"actor":{"description":"Who performed the action recorded by this event.","oneOf":[{"type":"object","additionalProperties":false,"required":["type","userId"],"properties":{"type":{"const":"user"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20}}},{"type":"object","additionalProperties":false,"required":["type","apiKeyId"],"properties":{"type":{"const":"api_key"},"apiKeyId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","systemId"],"properties":{"type":{"const":"system"},"systemId":{"type":"string","minLength":1,"maxLength":255}}}]},"publicNote":{"description":"Public note recorded with the event, such as a denial reason.","type":["string","null"]},"occurredAt":{"type":"string","format":"date-time","description":"When the event was recorded.","example":"2026-08-04T10:00:00Z"}}},"member-access-request-list-item":{"type":"object","additionalProperties":false,"required":["id","type","status","workspaceId","requesterUserId","requester","reason","alreadyMember","version","createdAt","updatedAt","reviewEtag"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable identifier for this request."},"type":{"type":"string","description":"The access change requested. Today only a viewer asking for a member seat.","enum":["member_seat_upgrade"]},"status":{"$ref":"#/components/schemas/member-access-request-status"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$","description":"Workspace the requester wants a member seat in."},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20,"description":"Account user who asked for the seat."},"requester":{"description":"Current requester identity when the user remains visible to the Account. Null when the user is not visible.","oneOf":[{"$ref":"#/components/schemas/approval-requester"},{"type":"null"}]},"reason":{"type":["string","null"],"maxLength":2000,"description":"The requester's message. Null when the request was recorded without one."},"alreadyMember":{"type":["boolean","null"],"description":"True when the requester already held a member seat at approval time, so approval changed nothing. Null until the request is fulfilled."},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use reviewEtag, not this field, when reviewing a listed request."},"createdAt":{"type":"string","format":"date-time","example":"2026-08-04T10:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-08-04T10:05:00Z"},"events":{"type":"array","maxItems":100,"description":"Ordered public history, ascending by sequence. Present on list reads only when includeEvents=true.","items":{"$ref":"#/components/schemas/member-access-request-event"}},"reviewEtag":{"type":"string","pattern":"^\"[1-9][0-9]{0,9}\"$","minLength":3,"maxLength":12,"description":"Opaque review token for this request. Copy the complete value unchanged into If-Match; do not parse it or use the collection HTTP ETag.","example":"\"3\""}}},"member-access-request-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/member-access-request-list-item"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"member-access-request":{"type":"object","additionalProperties":false,"required":["id","type","status","workspaceId","requesterUserId","requester","reason","alreadyMember","version","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable identifier for this request."},"type":{"type":"string","description":"The access change requested. Today only a viewer asking for a member seat.","enum":["member_seat_upgrade"]},"status":{"$ref":"#/components/schemas/member-access-request-status"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$","description":"Workspace the requester wants a member seat in."},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20,"description":"Account user who asked for the seat."},"requester":{"description":"Current requester identity when the user remains visible to the Account. Null when the user is not visible.","oneOf":[{"$ref":"#/components/schemas/approval-requester"},{"type":"null"}]},"reason":{"type":["string","null"],"maxLength":2000,"description":"The requester's message. Null when the request was recorded without one."},"alreadyMember":{"type":["boolean","null"],"description":"True when the requester already held a member seat at approval time, so approval changed nothing. Null until the request is fulfilled."},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use the ETag header, not this field, for conditional requests."},"createdAt":{"type":"string","format":"date-time","example":"2026-08-04T10:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-08-04T10:05:00Z"},"events":{"type":"array","maxItems":100,"description":"Ordered public history, ascending by sequence. Always present on single-request reads. Present on list reads only when includeEvents=true.","items":{"$ref":"#/components/schemas/member-access-request-event"}}}},"member-access-request-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/member-access-request"},{"type":"object","required":["events"],"properties":{"events":{"type":"array","maxItems":100,"description":"Ordered public history, ascending by sequence.","items":{"$ref":"#/components/schemas/member-access-request-event"}}}}]}}},"member-access-request-review":{"description":"The review outcome.","oneOf":[{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"approved"}}},{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"denied"},"reason":{"type":"string","minLength":1,"maxLength":10000,"pattern":"^[^\\u0000]*$","description":"Denial reason recorded on the request's review event and returned in its event history. Must not contain NUL characters."}}}]},"group":{"type":"object","additionalProperties":false,"required":["id","workspaceId","name","type"],"properties":{"id":{"description":"Opaque group identifier.","type":"string","minLength":1,"maxLength":255},"workspaceId":{"description":"Workspace that owns the group.","type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"name":{"type":"string","maxLength":255},"type":{"type":"string","enum":["custom","admin","member","guest"]}},"example":{"id":"group123","workspaceId":"workspace123","name":"Engineering","type":"custom"}},"group-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/group"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"group-user":{"type":"object","additionalProperties":false,"required":["userId"],"properties":{"userId":{"description":"Replit user identifier returned by the Members API.","type":"string","pattern":"^[1-9][0-9]*$","maxLength":20}},"example":{"userId":"123"}},"group-user-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/group-user"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"usage-metric":{"type":"object","additionalProperties":false,"required":["id","name","category","usage","usageUnit","costUsd"],"properties":{"id":{"description":"Stable public metric identifier. This value is independent of Replit's internal billing identifiers. Unmapped internal metrics are combined as other with no usage quantity.","type":"string","enum":["agent","replit_ai_integrations","tools","autoscale_deployment_compute","autoscale_deployment","autoscale_requests","azure_container_app_usage","azure_vm_compute","always_on_deployment_compute","scheduled_deployment_compute","scheduled_deployment_executions","deployment_data_transfer","development_compute","project_traffic","project_storage","production_database_compute","production_database_storage","production_database_logical_storage","production_database_pitr_storage","production_database_backup_storage","assistant_edits","agent_checkpoints","sandbox_compute","object_storage_advanced_operations","object_storage_basic_operations","object_storage","object_storage_data_transfer","other"]},"name":{"description":"Customer-facing metric name.","type":"string","minLength":1,"maxLength":100},"category":{"description":"Coarse category shared with the Replit Usage settings page.","type":"string","enum":["ai","project_hosting","project_traffic_and_data","storage","other"]},"usage":{"description":"Native metered quantity, or null when the metric is pre-rated.","type":["number","null"],"minimum":0},"usageUnit":{"description":"Unit for usage, or null when the metric is pre-rated.","type":["string","null"]},"costUsd":{"description":"Gross ledger cost recorded before Account credits, discounts, and invoice adjustments.","type":"number","minimum":0}}},"usage-member-group":{"type":"object","additionalProperties":false,"required":["key","totalCostUsd","metrics"],"properties":{"key":{"type":"object","additionalProperties":false,"required":["userId"],"properties":{"userId":{"type":"string","maxLength":20,"pattern":"^[1-9][0-9]*$"}}},"totalCostUsd":{"description":"Gross project cost attributable to this member.","type":"number","minimum":0},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/usage-metric"}}}},"usage-group":{"type":"object","additionalProperties":false,"required":["key","totalCostUsd","metrics"],"properties":{"key":{"oneOf":[{"type":"object","additionalProperties":false,"required":["workspaceId"],"properties":{"workspaceId":{"type":"string","minLength":1,"maxLength":255}}},{"type":"object","additionalProperties":false,"required":["userId"],"properties":{"userId":{"type":"string","maxLength":20,"pattern":"^[1-9][0-9]*$"}}},{"type":"object","additionalProperties":false,"required":["projectId"],"properties":{"projectId":{"type":"string","minLength":1,"maxLength":255}}},{"type":"object","additionalProperties":false,"required":["date"],"properties":{"date":{"description":"UTC day for a timeseries group.","type":"string","format":"date"}}},{"type":"object","additionalProperties":false,"required":["environmentType"],"properties":{"environmentType":{"description":"Constant key for usage attributed to conversations.","type":"string","const":"conversation"}}}]},"totalCostUsd":{"description":"Gross ledger cost attributable to this group.","type":"number","minimum":0},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/usage-metric"}},"breakdown":{"description":"Present only for project groups when breakdownBy=member. Member costs plus unattributed-member cost reconcile to this project's gross cost. Missing-member usage remains subject to the request's user and group filters.","type":"object","additionalProperties":false,"required":["groups","unattributableTotalCostUsd","unattributableMetrics"],"properties":{"groups":{"description":"Complete member groups ordered by descending totalCostUsd, then ascending userId. There is no inner pagination or truncation.","type":"array","maxItems":10000,"items":{"$ref":"#/components/schemas/usage-member-group"}},"unattributableTotalCostUsd":{"description":"Gross project cost with no member attribution.","type":"number","minimum":0},"unattributableMetrics":{"type":"array","items":{"$ref":"#/components/schemas/usage-metric"}}}}}},"usage-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"type":"object","additionalProperties":false,"required":["interval","currency","totalCostUsd","metrics","groupBy","groups","attributableTotalCostUsd","unattributableTotalCostUsd","pagination"],"properties":{"interval":{"description":"Resolved half-open UTC interval used for the query.","type":"object","additionalProperties":false,"required":["startTime","endTime"],"properties":{"startTime":{"description":"Inclusive interval boundary.","type":"string","format":"date-time"},"endTime":{"description":"Exclusive interval boundary.","type":"string","format":"date-time"}}},"currency":{"type":"string","const":"USD"},"totalCostUsd":{"description":"Gross ledger cost recorded for the requested filters before Account credits, discounts, and invoice adjustments.","type":"number","minimum":0},"metrics":{"type":"array","items":{"$ref":"#/components/schemas/usage-metric"}},"groupBy":{"description":"Echoes the requested grouping, or null when totals only were requested.","type":["string","null"],"enum":["workspace","member","project","conversations","timeseries",null]},"breakdownBy":{"description":"Present only when breakdownBy=member was requested with groupBy=project. Every returned project includes its complete member breakdown.","type":"string","const":"member"},"groups":{"description":"Empty when groupBy is omitted. Entity groups are ordered by descending totalCostUsd; timeseries groups are ordered by ascending date; conversations returns one group.","type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/usage-group"}},"attributableTotalCostUsd":{"description":"Sum attributable to entity or conversation groups before pagination, or null for totals and timeseries.","type":["number","null"],"minimum":0},"unattributableTotalCostUsd":{"description":"Difference between totalCostUsd and attributableTotalCostUsd, or null for totals and timeseries.","type":["number","null"],"minimum":0},"pagination":{"description":"Group page metadata, or null when groupBy is omitted. Conversation grouping returns one complete page.","oneOf":[{"type":"null"},{"type":"object","additionalProperties":false,"required":["nextCursor","hasMore","totalCount"],"properties":{"nextCursor":{"description":"Opaque cursor for the next groups page, or null when no page remains.","type":["string","null"],"maxLength":255},"hasMore":{"type":"boolean"},"totalCount":{"description":"Total groups matching the request before pagination.","type":"integer","minimum":0}}}]}}}}},"project-workspace":{"type":"object","additionalProperties":false,"required":["id","name","slug"],"properties":{"id":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"name":{"type":"string","minLength":2,"maxLength":50},"slug":{"type":"string","minLength":2,"maxLength":28,"pattern":"^[0-9A-Za-z-]+$"}}},"project":{"type":"object","additionalProperties":false,"required":["id","creatorId","title","slug","workspace","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"creatorId":{"description":"Current project owner user ID, or null when unavailable.","type":["string","null"],"pattern":"^[1-9][0-9]*$","maxLength":20},"title":{"type":"string","maxLength":60},"slug":{"type":"string","minLength":1,"maxLength":255},"workspace":{"$ref":"#/components/schemas/project-workspace"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"description":"Last project update time, or createdAt when no update timestamp exists.","type":"string","format":"date-time"}}},"project-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/project"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"PublicPublishEnablementRequestStatus":{"type":"string","enum":["pending","approved","fulfillment_started","fulfilled","fulfillment_failed","denied","canceled"]},"PublicPublishEnablementRequestListItem":{"type":"object","additionalProperties":false,"required":["id","status","workspaceId","projectId","requesterUserId","version","createdAt","updatedAt","reviewEtag"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/PublicPublishEnablementRequestStatus"},"workspaceId":{"type":["string","null"],"description":"Current workspace in this Account, or null when the Project no longer belongs to this Account.","maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"projectId":{"type":"string","format":"uuid"},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use reviewEtag, not this field, when reviewing a listed request."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"reviewEtag":{"type":"string","minLength":20,"maxLength":29,"pattern":"^\"[1-9][0-9]{0,9}\\.[A-Za-z0-9_-]{16}\"$","description":"Opaque review token for this request. Copy the complete value unchanged into If-Match; do not parse it or use the collection HTTP ETag.","example":"\"3.47DEQpj8HBSa-_TI\""}}},"PublicPublishEnablementRequestListResponse":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/PublicPublishEnablementRequestListItem"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"PublicPublishEnablementRequestActor":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","userId"],"properties":{"type":{"const":"user"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20}}},{"type":"object","additionalProperties":false,"required":["type","apiKeyId"],"properties":{"type":{"const":"api_key"},"apiKeyId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","systemId"],"properties":{"type":{"const":"system"},"systemId":{"type":"string","minLength":1,"maxLength":255}}}]},"PublicPublishEnablementRequestEvent":{"type":"object","additionalProperties":false,"required":["sequence","eventType","fromStatus","toStatus","actor","publicNote","occurredAt"],"properties":{"sequence":{"type":"integer","minimum":1},"eventType":{"type":"string","enum":["request_started","request_approved","request_denied","request_canceled","request_fulfillment_started","request_fulfilled","request_fulfillment_failed"]},"fromStatus":{"oneOf":[{"$ref":"#/components/schemas/PublicPublishEnablementRequestStatus"},{"type":"null"}]},"toStatus":{"$ref":"#/components/schemas/PublicPublishEnablementRequestStatus"},"actor":{"$ref":"#/components/schemas/PublicPublishEnablementRequestActor"},"publicNote":{"type":["string","null"]},"occurredAt":{"type":"string","format":"date-time"}}},"PublicPublishEnablementRequestWithEvents":{"type":"object","additionalProperties":false,"required":["id","status","workspaceId","projectId","requesterUserId","version","createdAt","updatedAt","events"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/PublicPublishEnablementRequestStatus"},"workspaceId":{"type":["string","null"],"description":"Current workspace in this Account, or null when the Project no longer belongs to this Account.","maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"projectId":{"type":"string","format":"uuid"},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use the ETag header, not this field, for conditional requests. A change to the visible Workspace can change the ETag without a new event."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"$ref":"#/components/schemas/PublicPublishEnablementRequestEvent"}}}},"PublicPublishEnablementRequestResponse":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PublicPublishEnablementRequestWithEvents"}}},"schema":{"type":"string","minLength":20,"maxLength":29,"pattern":"^\"[1-9][0-9]{0,9}\\.[A-Za-z0-9_-]{16}\"$","example":"\"3.47DEQpj8HBSa-_TI\""},"PublicPublishEnablementRequestReview":{"oneOf":[{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"approved"}}},{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"denied"},"reason":{"type":"string","description":"Public denial reason returned in the request event history. Do not include confidential internal notes.","minLength":1,"maxLength":10000,"pattern":"^[^\\u0000]*$"}}}]},"PublishingRequestStatus":{"type":"string","enum":["pending","approved","fulfillment_started","fulfilled","fulfillment_failed","denied","canceled"]},"PublishingRequestEtag":{"type":"string","minLength":20,"maxLength":29,"pattern":"^\"[1-9][0-9]{0,9}\\.[A-Za-z0-9_-]{16}\"$","description":"Opaque token for this request. Copy the complete value unchanged; do not construct or parse it.","example":"\"3.47DEQpj8HBSa-_TI\""},"PublishingRequestListItem":{"type":"object","additionalProperties":false,"required":["id","status","workspaceId","projectId","requesterUserId","version","createdAt","updatedAt","reviewEtag"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/PublishingRequestStatus"},"workspaceId":{"type":["string","null"],"description":"Current workspace in this Account, or null when the Project no longer belongs to this Account.","maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"projectId":{"type":"string","format":"uuid"},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use reviewEtag, not this field, when reviewing a listed request."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"reviewEtag":{"$ref":"#/components/schemas/PublishingRequestEtag"}}},"PublishingRequestListResponse":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/PublishingRequestListItem"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"PublishingRequestActor":{"oneOf":[{"type":"object","additionalProperties":false,"required":["type","userId"],"properties":{"type":{"const":"user"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20}}},{"type":"object","additionalProperties":false,"required":["type","apiKeyId"],"properties":{"type":{"const":"api_key"},"apiKeyId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","systemId"],"properties":{"type":{"const":"system"},"systemId":{"type":"string","minLength":1,"maxLength":255}}}]},"PublishingRequestEvent":{"type":"object","additionalProperties":false,"required":["sequence","eventType","fromStatus","toStatus","actor","publicNote","occurredAt"],"properties":{"sequence":{"type":"integer","minimum":1},"eventType":{"type":"string","enum":["request_started","request_approved","request_denied","request_canceled","request_fulfillment_started","request_fulfilled","request_fulfillment_failed"]},"fromStatus":{"oneOf":[{"$ref":"#/components/schemas/PublishingRequestStatus"},{"type":"null"}]},"toStatus":{"$ref":"#/components/schemas/PublishingRequestStatus"},"actor":{"$ref":"#/components/schemas/PublishingRequestActor"},"publicNote":{"type":["string","null"]},"occurredAt":{"type":"string","format":"date-time"}}},"PublishingRequestWithEvents":{"type":"object","additionalProperties":false,"required":["id","status","workspaceId","projectId","requesterUserId","version","createdAt","updatedAt","events","execution"],"properties":{"id":{"type":"string","format":"uuid"},"status":{"$ref":"#/components/schemas/PublishingRequestStatus"},"workspaceId":{"type":["string","null"],"description":"Current workspace in this Account, or null when the Project no longer belongs to this Account.","maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"projectId":{"type":"string","format":"uuid"},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use the ETag header, not this field, for conditional requests. A change to the visible Workspace can change the ETag without a new event."},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"events":{"type":"array","items":{"$ref":"#/components/schemas/PublishingRequestEvent"}},"execution":{"type":"object","additionalProperties":false,"description":"The publish started by approval.","required":["operationId","message"],"properties":{"operationId":{"type":["string","null"],"format":"uuid","description":"Identifier of the publish started by approval, or null until publishing starts."},"message":{"type":["string","null"],"description":"Explanation and next steps when publishing fails; otherwise null."}}}}},"PublishingRequestResponse":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"$ref":"#/components/schemas/PublishingRequestWithEvents"}}},"PublishingRequestReview":{"oneOf":[{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"approved"}}},{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"denied"},"reason":{"type":"string","description":"Public denial reason returned in the request event history. Do not include confidential internal notes.","minLength":1,"maxLength":10000,"pattern":"^[^\\u0000]*$"}}}]},"deployment-status":{"description":"Current serving build lifecycle status.","type":"string","enum":["pending","building","security_scanning","running","promoting","failed","success","updating_tier","suspending","suspended","resuming"]},"deployment-project":{"type":"object","additionalProperties":false,"required":["id","title"],"properties":{"id":{"type":"string","format":"uuid"},"title":{"type":"string","maxLength":60}}},"deployment":{"type":"object","additionalProperties":false,"required":["id","project","workspace","url","deploymentPrivacy","status","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid"},"project":{"$ref":"#/components/schemas/deployment-project"},"workspace":{"$ref":"#/components/schemas/project-workspace"},"url":{"description":"Primary routable deployment URL, or null when no provider URL or verified custom domain can be resolved.","type":["string","null"],"format":"uri"},"deploymentPrivacy":{"description":"Privacy of the current serving build.","type":"string","enum":["public","password","private"]},"status":{"$ref":"#/components/schemas/deployment-status"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"description":"Latest deployment or current serving build update timestamp, falling back to createdAt.","type":"string","format":"date-time"}}},"deployment-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/deployment"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"deployment-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"$ref":"#/components/schemas/deployment"}}},"budget-type":{"type":"string","enum":["account_spending_controls","workspace_default_user_limit","workspace_group_limit","workspace_user_limit"]},"budget-account":{"type":"object","additionalProperties":false,"required":["type","currency","period","usageAlertThresholdUsd","serviceShutdownLimitUsd"],"properties":{"type":{"const":"account_spending_controls"},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"usageAlertThresholdUsd":{"description":"Notification-only threshold. Null means no usage alert is configured. When both thresholds are set, this value is lower than serviceShutdownLimitUsd.","type":["number","null"],"minimum":0.01},"serviceShutdownLimitUsd":{"description":"Threshold that suspends usage-based services. Null means no service shutdown limit is configured.","type":["number","null"],"minimum":0.01}}},"budget-workspace":{"type":"object","additionalProperties":false,"required":["type","workspaceId","currency","period","amountUsd"],"properties":{"type":{"const":"workspace_default_user_limit"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"amountUsd":{"type":"number","exclusiveMinimum":0}}},"budget-group":{"type":"object","additionalProperties":false,"required":["type","workspaceId","groupId","currency","period","amountUsd"],"properties":{"type":{"const":"workspace_group_limit"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"groupId":{"type":"string","minLength":1,"maxLength":255},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"amountUsd":{"type":"number","exclusiveMinimum":0}}},"budget-user":{"type":"object","additionalProperties":false,"required":["type","workspaceId","userId","currency","period","amountUsd"],"properties":{"type":{"const":"workspace_user_limit"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"amountUsd":{"type":"number","exclusiveMinimum":0}}},"budget":{"oneOf":[{"$ref":"#/components/schemas/budget-account"},{"$ref":"#/components/schemas/budget-workspace"},{"$ref":"#/components/schemas/budget-group"},{"$ref":"#/components/schemas/budget-user"}]},"budget-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/budget"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"budget-update-account":{"type":"object","description":"Full desired state for Account spending controls. When both thresholds are set, usageAlertThresholdUsd must be lower than serviceShutdownLimitUsd.","additionalProperties":false,"required":["type","currency","period","usageAlertThresholdUsd","serviceShutdownLimitUsd"],"properties":{"type":{"const":"account_spending_controls"},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"usageAlertThresholdUsd":{"type":["number","null"],"minimum":0.01},"serviceShutdownLimitUsd":{"type":["number","null"],"minimum":1,"maximum":2147483647,"multipleOf":1}}},"budget-update-workspace":{"type":"object","additionalProperties":false,"required":["type","workspaceId","currency","period","amountUsd"],"properties":{"type":{"const":"workspace_default_user_limit"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"amountUsd":{"type":["number","null"],"exclusiveMinimum":0}}},"budget-update-group":{"type":"object","additionalProperties":false,"required":["type","workspaceId","groupId","currency","period","amountUsd"],"properties":{"type":{"const":"workspace_group_limit"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"groupId":{"type":"string","minLength":1,"maxLength":255},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"amountUsd":{"type":["number","null"],"exclusiveMinimum":0}}},"budget-update-user":{"type":"object","additionalProperties":false,"required":["type","workspaceId","userId","currency","period","amountUsd"],"properties":{"type":{"const":"workspace_user_limit"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20},"currency":{"const":"USD"},"period":{"const":"billing_cycle"},"amountUsd":{"type":["number","null"],"exclusiveMinimum":0}}},"budget-update":{"oneOf":[{"$ref":"#/components/schemas/budget-update-account"},{"$ref":"#/components/schemas/budget-update-workspace"},{"$ref":"#/components/schemas/budget-update-group"},{"$ref":"#/components/schemas/budget-update-user"}]},"budget-update-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"oneOf":[{"$ref":"#/components/schemas/budget"},{"type":"null"}]}}},"budget-limit-increase-request-status":{"type":"string","description":"Current lifecycle status of the request.","enum":["pending","approved","fulfillment_started","fulfilled","fulfillment_failed","denied","canceled"]},"budget-limit-increase-request-type":{"type":"string","description":"Budget limit targeted by the request. workspace_user_limit raises the requester's own member limit. workspace_default_user_limit raises the workspace default member limit. workspace_group_limit raises the shared aggregate limit of the group identified by groupId, not the requester's individual limit.","enum":["workspace_default_user_limit","workspace_user_limit","workspace_group_limit"]},"budget-limit-increase-request-event":{"type":"object","additionalProperties":false,"description":"One entry in a request's ordered public history.","required":["sequence","eventType","fromStatus","toStatus","actor","publicNote","occurredAt"],"properties":{"sequence":{"type":"integer","minimum":1,"description":"Position in the request history. Sequence 1 is the creation event."},"eventType":{"type":"string","enum":["request_started","request_approved","request_denied","request_canceled","request_fulfillment_started","request_fulfilled","request_fulfillment_failed"]},"fromStatus":{"description":"Status before this event. Null only on the creation event.","oneOf":[{"$ref":"#/components/schemas/budget-limit-increase-request-status"},{"type":"null"}]},"toStatus":{"$ref":"#/components/schemas/budget-limit-increase-request-status"},"actor":{"description":"Who performed the action recorded by this event.","oneOf":[{"type":"object","additionalProperties":false,"required":["type","userId"],"properties":{"type":{"const":"user"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20}}},{"type":"object","additionalProperties":false,"required":["type","apiKeyId"],"properties":{"type":{"const":"api_key"},"apiKeyId":{"type":"string","format":"uuid"}}},{"type":"object","additionalProperties":false,"required":["type","systemId"],"properties":{"type":{"const":"system"},"systemId":{"type":"string","minLength":1,"maxLength":255}}}]},"publicNote":{"description":"Public note recorded with the event, such as a denial reason.","type":["string","null"]},"occurredAt":{"type":"string","format":"date-time","description":"When the event was recorded.","example":"2026-08-04T10:00:00Z"}}},"budget-limit-increase-request-list-item":{"type":"object","additionalProperties":false,"required":["id","type","status","workspaceId","workspace","requesterUserId","requester","limitAtRequestUsd","currentLimitUsd","requestedAmountUsd","approvedLimitUsd","appliedLimitUsd","version","createdAt","updatedAt","reviewEtag"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable identifier for this request."},"type":{"$ref":"#/components/schemas/budget-limit-increase-request-type"},"status":{"$ref":"#/components/schemas/budget-limit-increase-request-status"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$","description":"Workspace whose Budget limit the request targets."},"workspace":{"description":"Current details of the Workspace the request targets. Null when Workspace details are unavailable. Requests for deleted Workspaces or Workspaces transferred to another Account are excluded from lists.","oneOf":[{"$ref":"#/components/schemas/project-workspace"},{"type":"null"}]},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20,"description":"Account user on whose behalf the request was created."},"requester":{"description":"Current requester identity when the user remains visible to the Account. Null when requester details are unavailable.","oneOf":[{"$ref":"#/components/schemas/approval-requester"},{"type":"null"}]},"limitAtRequestUsd":{"type":"number","exclusiveMinimum":0,"description":"Budget limit that was in effect when the request was created."},"currentLimitUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Budget limit currently in effect for the request target. Null when the target no longer has a Budget limit or is no longer available."},"groupId":{"type":"string","description":"Stable group identifier captured when a workspace_group_limit request is created. Present only for group requests; does not change when the group is renamed or deleted."},"group":{"description":"Current group identity for workspace_group_limit requests. Present only for group requests. Null if the group was deleted or no longer belongs to this Workspace.","oneOf":[{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},{"type":"null"}]},"requestedAmountUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Limit the requester asked for. Null when the requester did not name an amount."},"approvedLimitUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Limit the reviewer approved. Null until the request is approved."},"appliedLimitUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Limit applied by fulfillment. Null until fulfillment; equals the approved limit once fulfilled."},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use reviewEtag, not this field, when reviewing a listed request."},"createdAt":{"type":"string","format":"date-time","example":"2026-08-04T10:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-08-04T10:05:00Z"},"events":{"type":"array","maxItems":100,"description":"Ordered public history, ascending by sequence. Present on list reads only when includeEvents=true.","items":{"$ref":"#/components/schemas/budget-limit-increase-request-event"}},"reviewEtag":{"type":"string","pattern":"^\"[1-9][0-9]{0,9}\"$","minLength":3,"maxLength":12,"description":"Opaque review token for this request. Copy the complete value unchanged into If-Match; do not parse it or use the collection HTTP ETag.","example":"\"3\""}}},"budget-limit-increase-request-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/budget-limit-increase-request-list-item"}},"pagination":{"$ref":"#/components/schemas/pagination"}}},"budget-limit-increase-request":{"type":"object","additionalProperties":false,"required":["id","type","status","workspaceId","workspace","requesterUserId","requester","limitAtRequestUsd","currentLimitUsd","requestedAmountUsd","approvedLimitUsd","appliedLimitUsd","version","createdAt","updatedAt"],"properties":{"id":{"type":"string","format":"uuid","description":"Stable identifier for this request."},"type":{"$ref":"#/components/schemas/budget-limit-increase-request-type"},"status":{"$ref":"#/components/schemas/budget-limit-increase-request-status"},"workspaceId":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$","description":"Workspace whose Budget limit the request targets."},"workspace":{"description":"Current details of the Workspace the request targets. Always null on review responses, even with read scope. On read responses, null when Workspace details are unavailable. Requests for deleted Workspaces or Workspaces transferred to another Account are excluded from lists and return 404 on detail reads.","oneOf":[{"$ref":"#/components/schemas/project-workspace"},{"type":"null"}]},"requesterUserId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20,"description":"Account user on whose behalf the request was created."},"requester":{"description":"Current requester identity on read responses when the user remains visible to the Account. Null when requester details are unavailable. Always null on review responses, even when the key also has read:*.","oneOf":[{"$ref":"#/components/schemas/approval-requester"},{"type":"null"}]},"limitAtRequestUsd":{"type":"number","exclusiveMinimum":0,"description":"Budget limit that was in effect when the request was created."},"groupId":{"type":"string","description":"Stable group identifier captured when a workspace_group_limit request is created. Present only for group requests; does not change when the group is renamed or deleted."},"group":{"description":"Current group identity for workspace_group_limit requests. Present only for group requests. Null if the group was deleted or no longer belongs to this Workspace, and always null on review responses even when the key has read scope.","oneOf":[{"type":"object","additionalProperties":false,"required":["id","name"],"properties":{"id":{"type":"string"},"name":{"type":"string"}}},{"type":"null"}]},"currentLimitUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Budget limit currently in effect for the request target. Null when the target no longer has a Budget limit or is no longer available."},"requestedAmountUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Limit the requester asked for. Null when the requester did not name an amount."},"approvedLimitUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Limit the reviewer approved. Null until the request is approved."},"appliedLimitUsd":{"type":["number","null"],"exclusiveMinimum":0,"description":"Limit applied by fulfillment. Null until fulfillment; equals the approved limit once fulfilled."},"version":{"type":"integer","minimum":1,"description":"Increments with every recorded event. Use the ETag header, not this field, for conditional requests."},"createdAt":{"type":"string","format":"date-time","example":"2026-08-04T10:00:00Z"},"updatedAt":{"type":"string","format":"date-time","example":"2026-08-04T10:05:00Z"},"events":{"type":"array","maxItems":100,"description":"Ordered public history, ascending by sequence. Always present on single-request reads. Present on list reads only when includeEvents=true.","items":{"$ref":"#/components/schemas/budget-limit-increase-request-event"}}}},"budget-limit-increase-request-response":{"type":"object","additionalProperties":false,"required":["data"],"properties":{"data":{"allOf":[{"$ref":"#/components/schemas/budget-limit-increase-request"},{"type":"object","required":["events"],"properties":{"events":{"type":"array","maxItems":100,"description":"Ordered public history, ascending by sequence.","items":{"$ref":"#/components/schemas/budget-limit-increase-request-event"}}}}]}}},"budget-limit-increase-request-review":{"description":"The review outcome and, for approvals, the final approved limit.","oneOf":[{"type":"object","additionalProperties":false,"required":["outcome","amountUsd"],"properties":{"outcome":{"const":"approved"},"amountUsd":{"type":"number","exclusiveMinimum":0,"description":"Final approved limit in USD. Must exceed the current limit and may differ from the requested amount."}}},{"type":"object","additionalProperties":false,"required":["outcome"],"properties":{"outcome":{"const":"denied"},"reason":{"type":"string","minLength":1,"maxLength":10000,"pattern":"^[^\\u0000]*$","description":"Public denial reason shown to the requester. Must not contain NUL characters."}}}]},"audit-log-event":{"type":"object","additionalProperties":false,"required":["eventId","observedAt","occurredAt","action","schemaVersion","actor","workspace","project","sessionId","messageRef","promptText"],"properties":{"eventId":{"type":"string","minLength":1,"maxLength":200,"description":"Stable identifier for this event. Use it to deduplicate events across overlapping requests.","example":"8a4be785-24a8-5f65-b544-a5e5b6b4fb26"},"observedAt":{"type":"string","format":"date-time","description":"When Replit received the event.","example":"2026-08-04T10:00:02Z"},"occurredAt":{"type":"string","format":"date-time","description":"When the source action occurred.","example":"2026-08-04T10:00:00Z"},"action":{"type":"string","const":"project.message_sent","description":"Type of audit event."},"schemaVersion":{"type":"integer","const":1,"description":"Version of this action's event schema.","example":1},"actor":{"description":"User or system that caused the event.","oneOf":[{"type":"object","additionalProperties":false,"required":["type"],"properties":{"type":{"type":"string","const":"system"}}},{"type":"object","additionalProperties":false,"required":["type","userId"],"properties":{"type":{"type":"string","const":"user"},"userId":{"type":"string","pattern":"^[1-9][0-9]*$","maxLength":20}}}]},"workspace":{"type":"object","additionalProperties":false,"description":"Workspace where the event occurred.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Workspace identifier.","example":"workspace123"}}},"project":{"type":"object","additionalProperties":false,"description":"Project where the event occurred.","required":["id"],"properties":{"id":{"type":"string","minLength":1,"maxLength":200,"description":"Project identifier.","example":"project123"}}},"sessionId":{"type":"string","minLength":1,"maxLength":500,"description":"Identifier for the Agent session containing the message.","example":"session123"},"messageRef":{"type":"string","minLength":1,"maxLength":500,"description":"Opaque identifier for the message. Do not parse this value.","example":"message123"},"promptText":{"type":"string","description":"Complete user-submitted prompt text. Treat this field as sensitive customer content.","example":"Summarize the deployment changes in this project."}}},"audit-log-list-response":{"type":"object","additionalProperties":false,"required":["data","pagination"],"properties":{"data":{"type":"array","maxItems":100,"items":{"$ref":"#/components/schemas/audit-log-event"}},"pagination":{"$ref":"#/components/schemas/pagination"}}}},"responses":{"BadRequest":{"description":"The request parameters are invalid.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"Unauthorized":{"description":"The API key is missing, malformed, unknown, revoked, or expired.","headers":{"WWW-Authenticate":{"$ref":"#/components/headers/WwwAuthenticate"},"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"Forbidden":{"description":"The API key lacks the required scope or Account entitlement.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"RateLimited":{"description":"The API key or operation exceeded its rate limit.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"InternalError":{"description":"The server encountered an unexpected error.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"ServiceUnavailable":{"description":"A required API dependency is temporarily unavailable.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"NotFound":{"description":"The requested resource does not exist or is not visible to this key.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"RequestReviewConflict":{"description":"The request is no longer pending or the decision conflicts with its current state. Read the request again before retrying.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"PreconditionFailed":{"description":"The If-Match precondition failed for the current request. Reload the request and retry.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"PreconditionRequired":{"description":"The request requires an If-Match header with the strong ETag from the latest read.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"ReviewConflict":{"description":"The request cannot accept the decision, or a required update is in progress.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"description":"Seconds until another request may be attempted, when the conflict is retryable.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"Conflict":{"description":"Another update for the requested budget is in progress.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"$ref":"#/components/headers/RetryAfter"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"BudgetServiceUnavailable":{"description":"The budget update is temporarily unavailable.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"},"Retry-After":{"description":"Seconds until another request may be attempted, when retry timing is known.","schema":{"type":"integer","minimum":0}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}},"UnprocessableEntity":{"description":"One valid event cannot fit in a complete response.","headers":{"X-Request-Id":{"$ref":"#/components/headers/RequestId"},"X-RateLimit-Limit":{"$ref":"#/components/headers/RateLimitLimit"},"X-RateLimit-Remaining":{"$ref":"#/components/headers/RateLimitRemaining"},"X-RateLimit-Reset":{"$ref":"#/components/headers/RateLimitReset"}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/api-error"}}}}},"parameters":{"Limit":{"name":"limit","in":"query","description":"Maximum number of records to return.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},"Cursor":{"name":"cursor","in":"query","description":"Opaque pagination cursor returned by the previous response.","schema":{"type":"string","minLength":1,"maxLength":2048}},"WorkspaceSearch":{"name":"search","in":"query","description":"Case-insensitive match on workspace name or slug.","schema":{"type":"string","minLength":1,"maxLength":200}},"WorkspaceIdPath":{"name":"workspaceId","in":"path","description":"Workspace identifier.","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"}},"WorkspaceIdQuery":{"name":"workspaceId","in":"query","description":"Restrict results to a workspace owned by the authenticated Account.","schema":{"type":"string","minLength":1,"maxLength":255,"pattern":"^[A-Za-z0-9]+$"}},"Role":{"name":"role","in":"query","description":"Return members with this role in at least one selected workspace.","schema":{"$ref":"#/components/schemas/member-role"}},"MemberSearch":{"name":"search","in":"query","description":"Case-insensitive match on username, email, first name, or last name.","schema":{"type":"string","minLength":1,"maxLength":200}},"MemberAccessRequestIdPath":{"name":"requestId","in":"path","description":"Member access request identifier.","required":true,"schema":{"type":"string","format":"uuid"}},"IfNoneMatchHeader":{"name":"If-None-Match","in":"header","description":"ETag from an earlier member or Budget detail read. Copy the complete quoted value unchanged. A matching validator returns 304 with no body; otherwise the response is 200 with the request details. Supports standard HTTP conditional requests, including weak validators, comma-separated validators, and '*'.","required":false,"schema":{"type":"string","description":"HTTP entity-tag validators, separated by commas, or '*'. Weak validators are supported.","example":"\"3-9f2c1a7b4e0d\""}},"MemberAccessRequestIfMatchHeader":{"name":"If-Match","in":"header","required":true,"description":"The ETag from the latest detail read or the matching list item's reviewEtag. Copy the complete opaque value unchanged. A new event on the request makes an earlier review token stale; changes to the requester's profile details alone do not.","schema":{"type":"string","minLength":3,"maxLength":25,"pattern":"^\"[1-9][0-9]{0,9}(-[0-9a-f]{12})?\"$","example":"\"3-9f2c1a7b4e0d\""}},"GroupIdPath":{"name":"groupId","in":"path","description":"Opaque group identifier.","required":true,"schema":{"type":"string","minLength":1,"maxLength":255}},"GroupIdQuery":{"name":"groupId","in":"query","description":"Restrict usage to the current active members of one group in workspaceId. Group membership is evaluated when each request is processed.","schema":{"type":"string","minLength":1,"maxLength":255}},"UserIdQuery":{"name":"userId","in":"query","description":"Restrict results to usage attributed to a Replit user ID. Omit to include all users in the selected Account or workspace scope.","schema":{"type":"string","maxLength":20,"pattern":"^[1-9][0-9]*$"}},"ProjectIdQuery":{"name":"projectId","in":"query","description":"Restrict results to usage attributed to a Replit project ID.","schema":{"type":"string","minLength":1,"maxLength":255}},"UsageBillingPeriod":{"name":"billingPeriod","in":"query","description":"Select the current or previous billing period. Defaults to current when no custom range is supplied. Cannot be combined with startTime or endTime.","schema":{"type":"string","enum":["current","previous"]}},"UsageMetricTypes":{"name":"type","in":"query","description":"Restrict totals, metrics, and groups to one or more cataloged public metric identifiers. Repeat the parameter to select multiple values.","style":"form","explode":true,"schema":{"type":"array","maxItems":50,"items":{"type":"string","enum":["agent","replit_ai_integrations","tools","autoscale_deployment_compute","autoscale_deployment","autoscale_requests","azure_container_app_usage","azure_vm_compute","always_on_deployment_compute","scheduled_deployment_compute","scheduled_deployment_executions","deployment_data_transfer","development_compute","project_traffic","project_storage","production_database_compute","production_database_storage","production_database_logical_storage","production_database_pitr_storage","production_database_backup_storage","assistant_edits","agent_checkpoints","sandbox_compute","object_storage_advanced_operations","object_storage_basic_operations","object_storage","object_storage_data_transfer"]}}},"UsageGroupBy":{"name":"groupBy","in":"query","description":"Add one breakdown dimension. Omit for totals only. Member grouping includes every selected metric type and is not limited to Agent usage. Conversation grouping returns one group for usage attributed to conversations.","schema":{"type":"string","enum":["workspace","member","project","conversations","timeseries"]}},"UsageBreakdownBy":{"name":"breakdownBy","in":"query","description":"Adds a complete member breakdown to each project. Only valid with groupBy=project. Pagination still counts projects. Supply at most once.","schema":{"type":"string","enum":["member"]}},"UsageGranularity":{"name":"granularity","in":"query","description":"Time bucket width for groupBy=timeseries. Day is the only Alpha value.","schema":{"type":"string","enum":["day"],"default":"day"}},"UsageLimit":{"name":"limit","in":"query","description":"Maximum groups to return. Ignored when groupBy is omitted.","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},"UsageCursor":{"name":"cursor","in":"query","description":"Opaque groups cursor from the previous response. Reusing it with different filters returns invalid_request.","schema":{"type":"string","minLength":1,"maxLength":2048}},"PublicPublishEnablementProjectIdQuery":{"name":"projectId","in":"query","description":"Restrict results to the stored Project ID on requests owned by the authenticated Account, including requests retained after that Project moves to another Account.","schema":{"type":"string","format":"uuid"}},"PublicPublishEnablementRequestIdPath":{"name":"requestId","in":"path","description":"Public publish enablement request identifier.","required":true,"schema":{"type":"string","format":"uuid"}},"PublicPublishEnablementIfNoneMatchHeader":{"name":"If-None-Match","in":"header","description":"ETag from an earlier public publishing detail read. Copy the complete quoted value unchanged. A matching validator returns 304 with no body. The tag changes with the request's event history or visible Workspace, but not with every change to other response fields. Omit this header to retrieve the latest complete response. Supports standard HTTP conditional requests, including weak validators, comma-separated validators, and '*'.","required":false,"schema":{"type":"string","description":"HTTP entity-tag validators, separated by commas, or '*'. Weak validators are supported.","example":"\"3.47DEQpj8HBSa-_TI\""}},"PublicPublishEnablementIfMatchHeader":{"name":"If-Match","in":"header","description":"The ETag from the latest detail read or the matching list item's reviewEtag. Copy the complete opaque value unchanged. Reload the list or detail after an ownership change before reviewing the request.","required":true,"schema":{"$ref":"#/components/schemas/schema"}},"DeploymentIdPath":{"name":"deploymentId","in":"path","description":"Deployment identifier.","required":true,"schema":{"type":"string","format":"uuid"}},"BudgetLimitIncreaseRequestIdPath":{"name":"requestId","in":"path","description":"Budget limit increase request identifier.","required":true,"schema":{"type":"string","format":"uuid"}},"IfMatchHeader":{"name":"If-Match","in":"header","description":"The ETag from the latest detail read or the matching list item's reviewEtag. Copy the complete opaque value unchanged. A new event on the request makes an earlier review token stale; changes to the requester's profile or Workspace details alone do not.","required":true,"schema":{"type":"string","minLength":3,"maxLength":25,"pattern":"^\"[1-9][0-9]{0,9}(?:-[0-9a-f]{12})?\"$","example":"\"3\""}}}}}