Admin
Platform administration (platform admins only), including the AI ops kill switch.
| Operation | Method and path |
|---|---|
| List waitlist entries | GET /v1/admin/waitlist |
| Erase a waitlist entry | DELETE /v1/admin/waitlist/{entry_id} |
| List platform invitations | GET /v1/admin/invites |
| Create a platform invitation | POST /v1/admin/invites |
| Revoke a platform invitation | POST /v1/admin/invites/{invite_id}/revoke |
| AI ops kill switch status | GET /v1/admin/ai-ops/kill-switch |
| Turn the kill switch on (agents become read-only, agent tokens revoked) | POST /v1/admin/ai-ops/kill-switch/engage |
| Turn the kill switch off (passkey required) | POST /v1/admin/ai-ops/kill-switch/disengage |
| Platform change log (AI ops tool calls and decisions) | GET /v1/admin/changes |
| Get a change | GET /v1/admin/changes/{change_id} |
List waitlist entries
Section titled “List waitlist entries”GET /v1/admin/waitlist- Operation:
listWaitlist - Scopes:
admin:platform - Paginated:
?limit=and?cursor=
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status |
query | pending, confirmed, invited, joined |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
A page of waitlist entries. | WaitlistEntryList |
Errors: 401, 403, 429, 500, as problem+json with a stable code.
Example
curl https://api.guv.dev/v1/admin/waitlist \ -H "Authorization: Bearer $GUV_TOKEN"Example response
{ "data": [ { "id": "wle_01jbx2m9k7q4r8t5v6w3y0z1pr", "email": "ada@example.co.uk", "name": "string", "building": "string", "heard_from": "string", "status": "pending", "consent_version": "string", "consented_at": "2026-10-22T13:05:00Z", "confirmed_at": "2026-10-22T13:05:00Z", "invited_at": "2026-10-22T13:05:00Z", "joined_at": "2026-10-22T13:05:00Z", "created_at": "2026-10-22T13:05:00Z" } ], "next_cursor": "string", "has_more": false}Erase a waitlist entry
Section titled “Erase a waitlist entry”DELETE /v1/admin/waitlist/{entry_id}- Operation:
deleteWaitlistEntry - Scopes:
admin:platform - Idempotency-Key: required
Parameters
| Name | In | Type | Description |
|---|---|---|---|
entry_id * |
path | string |
Responses
| Status | Meaning | Body |
|---|---|---|
204 No Content |
Entry erased. | none |
Errors: 401, 403, 404, 429, 500, as problem+json with a stable code.
Example
curl -X DELETE https://api.guv.dev/v1/admin/waitlist/ent_01jbx2m9k7q4r8t5v6w3y0z1pr \ -H "Authorization: Bearer $GUV_TOKEN" \ -H "Idempotency-Key: $(uuidgen)"List platform invitations
Section titled “List platform invitations”GET /v1/admin/invites- Operation:
listInvites - Scopes:
admin:platform - Paginated:
?limit=and?cursor=
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status |
query | active, used, expired, revoked |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
A page of invitations. | InviteList |
Errors: 401, 403, 429, 500, as problem+json with a stable code.
Example
curl https://api.guv.dev/v1/admin/invites \ -H "Authorization: Bearer $GUV_TOKEN"Example response
{ "data": [ { "id": "sgi_01jbx2m9k7q4r8t5v6w3y0z1pr", "email": "ada@example.co.uk", "waitlist_entry_id": "wle_01jbx2m9k7q4r8t5v6w3y0z1pr", "note": "string", "status": "active", "code_hint": "string", "created_at": "2026-10-22T13:05:00Z", "expires_at": "2026-10-22T13:05:00Z", "accepted_at": "2026-10-22T13:05:00Z", "used_at": "2026-10-22T13:05:00Z", "used_by_user_id": "string", "revoked_at": "2026-10-22T13:05:00Z", "created_by_user_id": "string" } ], "next_cursor": "string", "has_more": false}Create a platform invitation
Section titled “Create a platform invitation”POST /v1/admin/invites- Operation:
createInvite - Scopes:
admin:platform - Idempotency-Key: required
Request body (application/json, required): InviteCreateRequest
| Field | Type | Description |
|---|---|---|
email |
string (email) | |
waitlist_entry_id |
string | |
expires_in_days |
integer | Default 14. |
note |
string | |
send_email |
boolean | Default true. |
Responses
| Status | Meaning | Body |
|---|---|---|
201 Created |
Invitation created. The code is shown once. | InviteCreated |
Errors: 400, 401, 403, 422, 429, 500, as problem+json with a stable code.
Example
curl -X POST https://api.guv.dev/v1/admin/invites \ -H "Authorization: Bearer $GUV_TOKEN" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "email": "ada@example.co.uk", "waitlist_entry_id": "wle_01jbx2m9k7q4r8t5v6w3y0z1pr", "expires_in_days": 14, "note": "string", "send_email": true}'Example response
{ "id": "sgi_01jbx2m9k7q4r8t5v6w3y0z1pr", "email": "ada@example.co.uk", "waitlist_entry_id": "wle_01jbx2m9k7q4r8t5v6w3y0z1pr", "note": "string", "status": "active", "code_hint": "string", "created_at": "2026-10-22T13:05:00Z", "expires_at": "2026-10-22T13:05:00Z", "accepted_at": "2026-10-22T13:05:00Z", "used_at": "2026-10-22T13:05:00Z", "used_by_user_id": "string", "revoked_at": "2026-10-22T13:05:00Z", "created_by_user_id": "string", "code": "string", "url": "https://guv.dev/"}Revoke a platform invitation
Section titled “Revoke a platform invitation”POST /v1/admin/invites/{invite_id}/revoke- Operation:
revokeInvite - Scopes:
admin:platform - Idempotency-Key: required
Parameters
| Name | In | Type | Description |
|---|---|---|---|
invite_id * |
path | string |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
Invitation revoked. | Invite |
Errors: 401, 403, 409, 429, 500, as problem+json with a stable code.
Example
curl -X POST https://api.guv.dev/v1/admin/invites/inv_01jbx2m9k7q4r8t5v6w3y0z1pr/revoke \ -H "Authorization: Bearer $GUV_TOKEN" \ -H "Idempotency-Key: $(uuidgen)"Example response
{ "id": "sgi_01jbx2m9k7q4r8t5v6w3y0z1pr", "email": "ada@example.co.uk", "waitlist_entry_id": "wle_01jbx2m9k7q4r8t5v6w3y0z1pr", "note": "string", "status": "active", "code_hint": "string", "created_at": "2026-10-22T13:05:00Z", "expires_at": "2026-10-22T13:05:00Z", "accepted_at": "2026-10-22T13:05:00Z", "used_at": "2026-10-22T13:05:00Z", "used_by_user_id": "string", "revoked_at": "2026-10-22T13:05:00Z", "created_by_user_id": "string"}AI ops kill switch status
Section titled “AI ops kill switch status”GET /v1/admin/ai-ops/kill-switch- Operation:
getKillSwitch - Scopes:
admin:platform
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
OK. | KillSwitchStatus |
Errors: 400, 401, 403, 429, 500, as problem+json with a stable code.
Example
curl https://api.guv.dev/v1/admin/ai-ops/kill-switch \ -H "Authorization: Bearer $GUV_TOKEN"Example response
{ "engaged": false, "agents_read_only": false, "source": "dns_txt", "reason": "string", "engaged_by": { "type": "agent", "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "display": "Stewart Webb via agent claude-code-on-stewart-laptop", "via_agent": { "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "name": "claude-code-on-stewart-laptop" }, "on_behalf_of": { "id": "usr_01jbx2m9k7q4r8t5v6w3y0z1us", "display": "Stewart Webb" } }, "engaged_at": "2026-10-22T13:05:00Z", "signature_valid": false, "checked_at": "2026-10-22T13:05:00Z"}Turn the kill switch on (agents become read-only, agent tokens revoked)
Section titled “Turn the kill switch on (agents become read-only, agent tokens revoked)”POST /v1/admin/ai-ops/kill-switch/engagePlatform admins, the Auditor agent and anomaly detectors may engage. Nobody but a platform admin with a passkey may disengage.
- Operation:
engageKillSwitch - Scopes:
admin:platform - Idempotency-Key: required
Request body (application/json, required): KillSwitchEngage
| Field | Type | Description |
|---|---|---|
reason * |
string |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
OK. | KillSwitchStatus |
Errors: 400, 401, 403, 409, 422, 429, 500, as problem+json with a stable code.
Example
curl -X POST https://api.guv.dev/v1/admin/ai-ops/kill-switch/engage \ -H "Authorization: Bearer $GUV_TOKEN" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "reason": "string"}'Example response
{ "engaged": false, "agents_read_only": false, "source": "dns_txt", "reason": "string", "engaged_by": { "type": "agent", "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "display": "Stewart Webb via agent claude-code-on-stewart-laptop", "via_agent": { "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "name": "claude-code-on-stewart-laptop" }, "on_behalf_of": { "id": "usr_01jbx2m9k7q4r8t5v6w3y0z1us", "display": "Stewart Webb" } }, "engaged_at": "2026-10-22T13:05:00Z", "signature_valid": false, "checked_at": "2026-10-22T13:05:00Z"}Turn the kill switch off (passkey required)
Section titled “Turn the kill switch off (passkey required)”POST /v1/admin/ai-ops/kill-switch/disengage- Operation:
disengageKillSwitch - Scopes:
admin:platform - Idempotency-Key: required
Request body (application/json, required): KillSwitchDisengage
| Field | Type | Description |
|---|---|---|
reason * |
string | |
assertion * |
PasskeyAssertion |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
OK. | KillSwitchStatus |
Errors: 400, 401, 403, 409, 422, 429, 500, as problem+json with a stable code.
Example
curl -X POST https://api.guv.dev/v1/admin/ai-ops/kill-switch/disengage \ -H "Authorization: Bearer $GUV_TOKEN" \ -H "Idempotency-Key: $(uuidgen)" \ -H "Content-Type: application/json" \ -d '{ "reason": "string", "assertion": { "challenge_id": "string", "credential": { "id": "string", "rawId": "string", "type": "public-key", "response": {}, "authenticatorAttachment": "string", "clientExtensionResults": {} } }}'Example response
{ "engaged": false, "agents_read_only": false, "source": "dns_txt", "reason": "string", "engaged_by": { "type": "agent", "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "display": "Stewart Webb via agent claude-code-on-stewart-laptop", "via_agent": { "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "name": "claude-code-on-stewart-laptop" }, "on_behalf_of": { "id": "usr_01jbx2m9k7q4r8t5v6w3y0z1us", "display": "Stewart Webb" } }, "engaged_at": "2026-10-22T13:05:00Z", "signature_valid": false, "checked_at": "2026-10-22T13:05:00Z"}Platform change log (AI ops tool calls and decisions)
Section titled “Platform change log (AI ops tool calls and decisions)”GET /v1/admin/changes- Operation:
listChanges - Scopes:
admin:platform - Paginated:
?limit=and?cursor=
Parameters
| Name | In | Type | Description |
|---|---|---|---|
status |
query | string | |
tier |
query | integer | |
incident |
query | string |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
A page of Change objects. | ChangeList |
Errors: 400, 401, 403, 429, 500, as problem+json with a stable code.
Example
curl https://api.guv.dev/v1/admin/changes \ -H "Authorization: Bearer $GUV_TOKEN"Example response
{ "data": [ { "id": "chg_01jbx2m9k7q4r8t5v6w3y0z1pr", "actor": { "type": "agent", "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "display": "Stewart Webb via agent claude-code-on-stewart-laptop", "via_agent": { "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "name": "claude-code-on-stewart-laptop" }, "on_behalf_of": { "id": "usr_01jbx2m9k7q4r8t5v6w3y0z1us", "display": "Stewart Webb" } }, "tool": "restart_deployment", "tier": 0, "target": { "type": "service", "id": "svc_01jbx2m9k7q4r8t5v6w3y0z1sv", "name": "web", "url": "/v1/projects/primecarers/services/web" }, "cell": "string", "input": {}, "plan": { "plan_hash": "sha256:9f2c1e0b7a4d3c2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a0f9e8d7c6b5a49", "dry_run": true, "summary": "1 to update. +£5.00/month at current usage.", "changes": [ { "action": "update", "resource": { "type": "service", "id": "svc_01jbx2m9k7q4r8t5v6w3y0z1sv", "name": "web" }, "environment": "production", "summary": "Raise web memory limit from 1 GB to 2 GB", "diff": [ { "path": "/resources/memory_mb", "before": 1024, "after": 2048 } ], "destructive": false, "requires_approval": true, "reason": "production requires approval for changes made by agents" } ], "cost": { "current_monthly": { "amount": "18.20", "currency": "GBP", "display": "£18.20" }, "projected_monthly": { "amount": "23.20", "currency": "GBP", "display": "£23.20" }, "delta_monthly": { "amount": "5.00", "currency": "GBP", "display": "£5.00" }, "confidence": "medium" }, "policy": { "decision": "approval_required", "reasons": [ { "code": "environment_protected", "message": "production requires approval for changes made by agents", "policy": "guv.environment.protection" } ], "approver_roles": [ "owner", "admin" ] }, "requires_approval": true, "expires_at": "2026-10-23T15:00:00Z" }, "policy": { "decision": "allow", "reasons": [ {} ], "approver_roles": [ "owner" ], "tier": 0 }, "reviewer": { "verdict": "approve", "model": "string", "notes": "string" }, "approval_id": "string", "operation_id": "string", "incident_id": "string", "status": "proposed", "created_at": "2026-10-22T13:05:00Z", "finished_at": "2026-10-22T13:05:00Z" } ], "next_cursor": "string", "has_more": false}Get a change
Section titled “Get a change”GET /v1/admin/changes/{change_id}- Operation:
getChange - Scopes:
admin:platform
Parameters
| Name | In | Type | Description |
|---|---|---|---|
change_id * |
path | string |
Responses
| Status | Meaning | Body |
|---|---|---|
200 OK |
OK. | Change |
Errors: 400, 401, 403, 404, 429, 500, as problem+json with a stable code.
Example
curl https://api.guv.dev/v1/admin/changes/cha_01jbx2m9k7q4r8t5v6w3y0z1pr \ -H "Authorization: Bearer $GUV_TOKEN"Example response
{ "id": "chg_01jbx2m9k7q4r8t5v6w3y0z1pr", "actor": { "type": "agent", "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "display": "Stewart Webb via agent claude-code-on-stewart-laptop", "via_agent": { "id": "tok_01jbx2m9k7q4r8t5v6w3y0z1tk", "name": "claude-code-on-stewart-laptop" }, "on_behalf_of": { "id": "usr_01jbx2m9k7q4r8t5v6w3y0z1us", "display": "Stewart Webb" } }, "tool": "restart_deployment", "tier": 0, "target": { "type": "service", "id": "svc_01jbx2m9k7q4r8t5v6w3y0z1sv", "name": "web", "url": "/v1/projects/primecarers/services/web" }, "cell": "string", "input": {}, "plan": { "plan_hash": "sha256:9f2c1e0b7a4d3c2b1a09f8e7d6c5b4a39281706f5e4d3c2b1a0f9e8d7c6b5a49", "dry_run": true, "summary": "1 to update. +£5.00/month at current usage.", "changes": [ { "action": "update", "resource": { "type": "service", "id": "svc_01jbx2m9k7q4r8t5v6w3y0z1sv", "name": "web" }, "environment": "production", "summary": "Raise web memory limit from 1 GB to 2 GB", "diff": [ { "path": "/resources/memory_mb", "before": 1024, "after": 2048 } ], "destructive": false, "requires_approval": true, "reason": "production requires approval for changes made by agents" } ], "cost": { "current_monthly": { "amount": "18.20", "currency": "GBP", "display": "£18.20" }, "projected_monthly": { "amount": "23.20", "currency": "GBP", "display": "£23.20" }, "delta_monthly": { "amount": "5.00", "currency": "GBP", "display": "£5.00" }, "confidence": "medium" }, "policy": { "decision": "approval_required", "reasons": [ { "code": "environment_protected", "message": "production requires approval for changes made by agents", "policy": "guv.environment.protection" } ], "approver_roles": [ "owner", "admin" ] }, "requires_approval": true, "expires_at": "2026-10-23T15:00:00Z" }, "policy": { "decision": "allow", "reasons": [ { "code": "environment_protected", "message": "production requires approval for changes made by agents", "policy": "guv.environment.protection" } ], "approver_roles": [ "owner" ], "tier": 0 }, "reviewer": { "verdict": "approve", "model": "string", "notes": "string" }, "approval_id": "string", "operation_id": "string", "incident_id": "string", "status": "proposed", "created_at": "2026-10-22T13:05:00Z", "finished_at": "2026-10-22T13:05:00Z"}