Public routes, authentication and request schemas from the MUNKY contract. Deployment and provider availability are described in the integration guide.
Application accounts
POST /v1/application-accounts/signup
Start email verification for an account in this application and environment.
Authentication: application-accounts:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"password": "example-password-long-enough"
}
Requires a backend project key with application-accounts:write.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"password": {
"type": "string",
"minLength": 10,
"maxLength": 1024
}
},
"required": [
"email",
"password"
],
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-accounts/resend
Replace the pending signup code within the email send limit.
Authentication: application-accounts:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com"
}
Requires a backend project key with application-accounts:write.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"email"
],
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-accounts/verify
Verify email and issue a revocable application session.
Authentication: application-accounts:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"code": "123456"
}
Requires a backend project key with application-accounts:write.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"code": {
"type": "string",
"pattern": "^\\d{6}$"
}
},
"required": [
"email",
"code"
],
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-accounts/recovery/start
Send a code to recover an existing application account.
Authentication: application-accounts:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com"
}
Requires a backend project key with application-accounts:write.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"email"
],
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-accounts/recovery/verify
Recover the scoped account and issue a recovery session.
Authentication: application-accounts:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"code": "123456"
}
Requires a backend project key with application-accounts:write.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"code": {
"type": "string",
"pattern": "^\\d{6}$"
}
},
"required": [
"email",
"code"
],
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-sessions/sign-in
Sign in to this application and environment.
Authentication: application-accounts:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"password": "example-password-long-enough"
}
Requires a backend project key with application-accounts:write.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"password": {
"type": "string",
"minLength": 1,
"maxLength": 1024
}
},
"required": [
"email",
"password"
],
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-sessions/current
Read the current application session without returning its secret.
Authentication: application-accounts:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Requires a backend project key with application-accounts:write. Also requires the x-munky-application-session header; never put the token in a URL.
Request JSON Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-sessions/revoke
Revoke the current application session.
Authentication: application-accounts:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Requires a backend project key with application-accounts:write. Also requires the x-munky-application-session header; never put the token in a URL.
Request JSON Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-sessions/revoke-all
Revoke every session for this account in this application and environment.
Authentication: application-accounts:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Requires a backend project key with application-accounts:write. Also requires the x-munky-application-session header; never put the token in a URL.
Request JSON Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}
Link to this route
Application accounts
POST /v1/application-accounts/password
Replace the password and revoke all account sessions.
Authentication: application-accounts:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"currentPassword": "old-example-password",
"newPassword": "new-example-password"
}
Requires a backend project key with application-accounts:write. Also requires the x-munky-application-session header; never put the token in a URL.
Request JSON Schema
{
"type": "object",
"properties": {
"currentPassword": {
"type": "string",
"minLength": 1,
"maxLength": 1024
},
"newPassword": {
"type": "string",
"minLength": 10,
"maxLength": 1024
}
},
"required": [
"newPassword"
],
"additionalProperties": false
}
Link to this route
Application accounts
DELETE /v1/application-accounts/current
Delete the current application account after password or recent recovery proof; owned workspaces must be erased first.
Authentication: application-accounts:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"currentPassword": "example-password-long-enough"
}
Requires the application session header. Current password may be omitted only within 15 minutes of mailbox recovery. Owned workspaces must be erased first.
Request JSON Schema
{
"type": "object",
"properties": {
"currentPassword": {
"type": "string",
"minLength": 1,
"maxLength": 1024
}
},
"additionalProperties": false
}
Link to this route
Mobile companion
POST /v1/application-mobile-devices
Register a companion installation and rotate its mobile credential.
Authentication: application-workspaces:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"installationId": "324f888c-7f83-4096-a1bd-d2ad46164ecf",
"displayName": "My iPhone",
"platform": "ios",
"appVersion": "0.1.0"
}
Store the returned mobile token in Keychain. Re-registration rotates it; push delivery is not configured.
Request JSON Schema
{
"type": "object",
"properties": {
"installationId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"platform": {
"type": "string",
"const": "ios"
},
"appVersion": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"push": {
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^(?:[a-fA-F0-9]{2}){32,100}$"
},
"environment": {
"type": "string",
"enum": [
"sandbox",
"production"
]
}
},
"required": [
"token",
"environment"
],
"additionalProperties": false
}
},
"required": [
"installationId",
"displayName",
"platform",
"appVersion"
],
"additionalProperties": false
}
Link to this route
Mobile companion
GET /v1/application-mobile-devices
List the account’s companion devices without credentials or push tokens.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
GET /v1/application-mobile-devices/current
Validate the current application session and mobile credential together.
Authentication: application-workspaces:write + x-munky-application-session + x-munky-mobile-device
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
DELETE /v1/application-mobile-devices/:deviceId
Revoke a companion credential and clear its push token.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
GET /v1/application-workspaces/:workspaceId/mobile-decisions
Read the latest 50 decisions addressed to this workspace principal.
Authentication: application-workspaces:write + x-munky-application-session + x-munky-mobile-device
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
GET /v1/application-workspaces/:workspaceId/mobile-decisions/:requestId
Read one exact decision; answers use its SMS code or secure link.
Authentication: application-workspaces:write + x-munky-application-session + x-munky-mobile-device
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
GET /v1/application-workspaces/:workspaceId/policy
Read whether new work and device observation are paused.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
PUT /v1/application-workspaces/:workspaceId/policy
Pause or resume new work leases and device observation as owner or admin.
Authentication: application-workspaces:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Requires a backend project key and the x-munky-application-session header. Never put credentials or invitation tokens in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"paused": {
"type": "boolean"
}
},
"required": [
"paused"
],
"additionalProperties": false
}
Link to this route
Application workspaces
DELETE /v1/application-workspaces/:workspaceId
Erase an owned workspace and revoke its device credentials.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
GET /v1/application-workspaces
List workspaces where this account has active membership.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
POST /v1/application-workspaces
Create a personal or business workspace and its isolated engine tenant.
Authentication: application-workspaces:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"kind": "personal",
"displayName": "My work"
}
Requires a backend project key and the x-munky-application-session header. Never put credentials or invitation tokens in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"personal",
"business"
]
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 120
}
},
"required": [
"kind",
"displayName"
],
"additionalProperties": false
}
Link to this route
Application workspaces
GET /v1/application-workspaces/:workspaceId/members
Read the workspace roster as owner or administrator.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
POST /v1/application-workspaces/:workspaceId/invitations
Create an exact-email invitation; deliver the returned token through your product.
Authentication: application-workspaces:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "colleague@example.com",
"role": "member"
}
Requires a backend project key and the x-munky-application-session header. Never put credentials or invitation tokens in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"role": {
"type": "string",
"enum": [
"admin",
"member"
]
}
},
"required": [
"email",
"role"
],
"additionalProperties": false
}
Link to this route
Application workspaces
DELETE /v1/application-workspaces/:workspaceId/invitations/:invitationId
Revoke a pending invitation.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
POST /v1/application-invitations/accept
Accept a single-use invitation for this verified account.
Authentication: application-workspaces:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"token": "mai_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
Requires a backend project key and the x-munky-application-session header. Never put credentials or invitation tokens in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^mai_[A-Za-z0-9_-]{43}$"
}
},
"required": [
"token"
],
"additionalProperties": false
}
Link to this route
Application workspaces
DELETE /v1/application-workspaces/:workspaceId/members/:accountId
Remove a membership and revoke its devices.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
GET /v1/application-workspaces/:workspaceId/devices
List devices visible to this workspace member.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Application workspaces
POST /v1/application-workspaces/:workspaceId/devices
Enroll an installation for the active member; execution requires owner or admin.
Authentication: application-workspaces:write + x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"runtimeExternalId": "installation-1",
"kind": "customer-edge",
"platform": "macos",
"runtimeVersion": "1.0.0",
"protocolVersion": "attesko.edge.runtime.v1",
"features": {
"observations": false,
"execution": "none",
"observationAdapters": [],
"executionAdapters": [],
"uncertaintyChannels": []
}
}
Requires a backend project key and the x-munky-application-session header. Never put credentials or invitation tokens in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"runtimeExternalId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
},
"kind": {
"type": "string",
"enum": [
"attesko-desktop",
"customer-edge",
"server-edge"
]
},
"platform": {
"type": "string",
"enum": [
"macos",
"windows",
"linux",
"server"
]
},
"runtimeVersion": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"protocolVersion": {
"type": "string",
"const": "attesko.edge.runtime.v1"
},
"features": {
"type": "object",
"properties": {
"observations": {
"type": "boolean"
},
"execution": {
"type": "string",
"enum": [
"none",
"adapter"
]
},
"observationAdapters": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"native-event",
"browser-dom",
"os-accessibility",
"screen-capture"
]
},
"sourceSystems": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
}
},
"required": [
"kind"
]
}
},
"executionAdapters": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"native-api",
"mcp",
"browser-dom",
"os-accessibility"
]
},
"capabilityIds": {
"default": [],
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
},
"attendance": {
"type": "string",
"enum": [
"attended"
]
}
},
"required": [
"kind"
]
}
},
"uncertaintyChannels": {
"default": [],
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"local-notification",
"sms",
"email",
"webhook"
]
}
}
},
"required": [
"observations",
"execution"
]
}
},
"required": [
"runtimeExternalId",
"kind",
"platform",
"runtimeVersion",
"protocolVersion",
"features"
]
}
Link to this route
Application workspaces
DELETE /v1/application-workspaces/:workspaceId/devices/:runtimeId
Revoke an authorized workspace device.
Authentication: application-workspaces:write + x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
POST /v1/capabilities
Declare or restore a capability
Authentication: capabilities:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"capabilityId": "invoice.send_follow_up",
"displayName": "Send an invoice follow-up",
"performs": {
"action": "send",
"entityType": "invoice",
"surface": "billing"
},
"idempotent": true,
"customerFacing": true,
"moneyMoving": false,
"reversible": false,
"argumentSchema": {
"type": "object",
"required": [
"invoiceId"
]
},
"argumentBindings": {
"invoiceId": {
"from": "subject.externalId"
}
},
"verifier": {
"kind": "PRODUCT_EVENT",
"eventType": "invoice.updated",
"windowMinutes": 60,
"expect": [
{
"field": "status",
"expect": "changed"
}
]
}
}
Request JSON Schema
{
"type": "object",
"properties": {
"capabilityId": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_\\-.]*$"
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"performs": {
"type": "object",
"properties": {
"action": {
"type": "string",
"minLength": 1
},
"entityType": {
"type": "string",
"minLength": 1
},
"surface": {
"type": "string",
"minLength": 1
}
},
"required": [
"action",
"entityType"
]
},
"idempotent": {
"type": "boolean"
},
"customerFacing": {
"type": "boolean"
},
"moneyMoving": {
"type": "boolean"
},
"reversible": {
"default": false,
"type": "boolean"
},
"argumentSchema": {
"default": {
"type": "object"
},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"argumentBindings": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"oneOf": [
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "subject.externalId"
}
},
"required": [
"from"
]
},
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "event.afterState"
},
"field": {
"type": "string",
"minLength": 1
}
},
"required": [
"from",
"field"
]
},
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "event.beforeState"
},
"field": {
"type": "string",
"minLength": 1
}
},
"required": [
"from",
"field"
]
},
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "event.metadata"
},
"field": {
"type": "string",
"minLength": 1
}
},
"required": [
"from",
"field"
]
},
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "entity"
},
"entityType": {
"type": "string",
"minLength": 1
}
},
"required": [
"from",
"entityType"
]
},
{
"type": "object",
"properties": {
"from": {
"type": "string",
"const": "constant"
},
"value": {}
},
"required": [
"from",
"value"
]
}
]
}
},
"verifier": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "PRODUCT_EVENT"
},
"eventType": {
"type": "string",
"minLength": 1
},
"windowMinutes": {
"default": 60,
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1440
},
"expect": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"minLength": 1
},
"expect": {
"anyOf": [
{
"type": "string",
"const": "changed"
},
{
"type": "string",
"const": "present"
},
{
"type": "object",
"properties": {
"equals": {}
},
"required": [
"equals"
]
},
{
"type": "object",
"properties": {
"equalsArgument": {
"type": "string",
"minLength": 1
}
},
"required": [
"equalsArgument"
]
}
]
}
},
"required": [
"field",
"expect"
]
}
}
},
"required": [
"kind"
]
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "SIGNED_HTTP_READ"
},
"connectionId": {
"type": "string",
"minLength": 1
},
"operation": {
"type": "string",
"minLength": 1
},
"recordPath": {
"type": "string"
},
"expect": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"field": {
"type": "string",
"minLength": 1
},
"expect": {
"anyOf": [
{
"type": "string",
"const": "changed"
},
{
"type": "string",
"const": "present"
},
{
"type": "object",
"properties": {
"equals": {}
},
"required": [
"equals"
]
},
{
"type": "object",
"properties": {
"equalsArgument": {
"type": "string",
"minLength": 1
}
},
"required": [
"equalsArgument"
]
}
]
}
},
"required": [
"field",
"expect"
]
}
}
},
"required": [
"kind",
"connectionId",
"operation"
]
}
]
}
},
"required": [
"capabilityId",
"displayName",
"performs",
"idempotent",
"customerFacing",
"moneyMoving",
"verifier"
]
}
Link to this route
Capabilities, proposals, and trials
GET /v1/capabilities
List project capabilities
Authentication: capabilities:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
DELETE /v1/capabilities/:capabilityId
Withdraw while retaining history
Authentication: capabilities:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
POST /v1/tenants/:tenantId/connections
Register a signed-read connection
Authentication: connections:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"connectionId": "billing-read",
"displayName": "Billing read API",
"provider": "northwind",
"baseUrl": "https://api.northwind.example",
"operations": {
"invoice": "/invoices/{id}"
},
"allowedOperations": [
"invoice"
],
"signingSecret": "a-signing-secret-of-at-least-32-characters"
}
`signingSecret` is sealed on receipt and never returned.
Request JSON Schema
{
"type": "object",
"properties": {
"connectionId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"provider": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"baseUrl": {
"type": "string",
"format": "uri"
},
"operations": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string",
"pattern": "^\\/.*"
}
},
"allowedOperations": {
"minItems": 1,
"type": "array",
"items": {
"type": "string"
}
},
"healthPath": {
"default": "/health",
"type": "string",
"pattern": "^\\/.*"
},
"signingSecret": {
"type": "string",
"minLength": 32
},
"scopes": {
"default": [],
"type": "array",
"items": {
"type": "string"
}
},
"externalAccountId": {
"type": "string"
},
"timeoutMs": {
"default": 10000,
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 120000
}
},
"required": [
"displayName",
"provider",
"baseUrl",
"operations",
"allowedOperations",
"signingSecret"
]
}
Link to this route
Capabilities, proposals, and trials
GET /v1/tenants/:tenantId/connections
Connection summaries
Authentication: connections:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
POST /v1/tenants/:tenantId/corrections
Append a correction and relearn
Authentication: corrections:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"kind": "correct-variant-assignment",
"reason": "same-job-different-route",
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"subject": {
"familyId": "fam_7c2e…",
"episodeId": "ep_1a9d…"
},
"payload": {
"variantId": "normal"
}
}
Request JSON Schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"merge-families",
"split-family",
"reassign-episode",
"create-family-from-episodes",
"alias-equivalent",
"must-not-share-family",
"reject-contract",
"correct-intent",
"correct-executor-mapping",
"correct-verifier-mapping",
"correct-input-fields",
"correct-terminal-outcome",
"correct-variant-assignment"
]
},
"reason": {
"type": "string",
"enum": [
"different-business-outcome",
"different-target-records",
"different-side-effects",
"same-job-different-names",
"same-job-different-route",
"wrong-operation-selected",
"wrong-verification-selected",
"wrong-inputs-inferred",
"evidence-was-a-mixture",
"provider-changed",
"policy-changed",
"operator-judgement"
]
},
"principalId": {
"type": "string",
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 2000
},
"subject": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"payload": {
"default": {},
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
}
},
"required": [
"kind",
"reason",
"principalId",
"subject",
"principalAssertion"
]
}
Link to this route
Work, proof, and governance
GET /v1/tenants/:tenantId/corrections
Correction history
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
POST /v1/apps/:appId/mobile-devices
Register a companion installation and rotate its mobile credential.
Authentication: configured native application; x-munky-application-session
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"installationId": "324f888c-7f83-4096-a1bd-d2ad46164ecf",
"displayName": "My iPhone",
"platform": "ios",
"appVersion": "0.1.0"
}
Store the returned mobile token in Keychain. Re-registration rotates it; push delivery is not configured.
Request JSON Schema
{
"type": "object",
"properties": {
"installationId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"platform": {
"type": "string",
"const": "ios"
},
"appVersion": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"push": {
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^(?:[a-fA-F0-9]{2}){32,100}$"
},
"environment": {
"type": "string",
"enum": [
"sandbox",
"production"
]
}
},
"required": [
"token",
"environment"
],
"additionalProperties": false
}
},
"required": [
"installationId",
"displayName",
"platform",
"appVersion"
],
"additionalProperties": false
}
Link to this route
Mobile companion
GET /v1/apps/:appId/mobile-devices
List the account’s companion devices without credentials or push tokens.
Authentication: configured native application; x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
GET /v1/apps/:appId/mobile-devices/current
Validate the current application session and mobile credential together.
Authentication: configured native application; x-munky-application-session + x-munky-mobile-device
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
DELETE /v1/apps/:appId/mobile-devices/:deviceId
Revoke a companion credential and clear its push token.
Authentication: configured native application; x-munky-application-session
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
GET /v1/apps/:appId/workspaces/:workspaceId/mobile-decisions
Read the latest 50 decisions addressed to this workspace principal.
Authentication: configured native application; x-munky-application-session + x-munky-mobile-device
Read the integration guide for the operation sequence and response handling.
Link to this route
Mobile companion
GET /v1/apps/:appId/workspaces/:workspaceId/mobile-decisions/:requestId
Read one exact decision; answers use its SMS code or secure link.
Authentication: configured native application; x-munky-application-session + x-munky-mobile-device
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
GET /v1/apps/:appId/status
Check configured native application availability
Authentication: none; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
POST /v1/apps/:appId/accounts/signup
Start native application signup
Authentication: none; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"password": "example-password-long-enough"
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"password": {
"type": "string",
"minLength": 10,
"maxLength": 1024
}
},
"required": [
"email",
"password"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/accounts/resend
Resend native signup verification
Authentication: none; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com"
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"email"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/accounts/verify
Verify native signup and issue an application session
Authentication: none; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"code": "123456"
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"code": {
"type": "string",
"pattern": "^\\d{6}$"
}
},
"required": [
"email",
"code"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/accounts/recovery/start
Start native account recovery
Authentication: none; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com"
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
}
},
"required": [
"email"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/accounts/recovery/verify
Verify native account recovery
Authentication: none; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"code": "123456"
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"code": {
"type": "string",
"pattern": "^\\d{6}$"
}
},
"required": [
"email",
"code"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/sessions/sign-in
Sign in to the native application
Authentication: none; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"email": "person@example.com",
"password": "example-password-long-enough"
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"email": {
"type": "string",
"maxLength": 254,
"format": "email",
"pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
},
"password": {
"type": "string",
"minLength": 1,
"maxLength": 1024
}
},
"required": [
"email",
"password"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/sessions/current
Read the current native application session
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/sessions/revoke
Sign out the current native application session
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {},
"additionalProperties": false
}
Link to this route
Native application gateway
GET /v1/apps/:appId/workspaces
Read native workspace workspace
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
POST /v1/apps/:appId/workspaces
Create or submit native workspace workspace
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"displayName": "My work"
}
Workspace kind is set by the configured application; MUNKY OS is personal.
Request JSON Schema
{
"type": "object",
"properties": {
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"required": [
"displayName"
],
"additionalProperties": false
}
Link to this route
Native application gateway
GET /v1/apps/:appId/workspaces/:workspaceId/policy
Read native workspace policy
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
PUT /v1/apps/:appId/workspaces/:workspaceId/policy
Update native workspace policy
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"paused": {
"type": "boolean"
}
},
"required": [
"paused"
],
"additionalProperties": false
}
Link to this route
Native application gateway
GET /v1/apps/:appId/workspaces/:workspaceId/devices
Read native workspace devices
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
POST /v1/apps/:appId/workspaces/:workspaceId/devices
Create or submit native workspace devices
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"runtimeExternalId": "installation-1",
"kind": "customer-edge",
"platform": "macos",
"runtimeVersion": "1.0.0",
"protocolVersion": "attesko.edge.runtime.v1",
"features": {
"observations": false,
"execution": "none",
"observationAdapters": [],
"executionAdapters": [],
"uncertaintyChannels": []
}
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"runtimeExternalId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
},
"kind": {
"type": "string",
"enum": [
"attesko-desktop",
"customer-edge",
"server-edge"
]
},
"platform": {
"type": "string",
"enum": [
"macos",
"windows",
"linux",
"server"
]
},
"runtimeVersion": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"protocolVersion": {
"type": "string",
"const": "attesko.edge.runtime.v1"
},
"features": {
"type": "object",
"properties": {
"observations": {
"type": "boolean"
},
"execution": {
"type": "string",
"enum": [
"none",
"adapter"
]
},
"observationAdapters": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"native-event",
"browser-dom",
"os-accessibility",
"screen-capture"
]
},
"sourceSystems": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
}
},
"required": [
"kind"
]
}
},
"executionAdapters": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"native-api",
"mcp",
"browser-dom",
"os-accessibility"
]
},
"capabilityIds": {
"default": [],
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
},
"attendance": {
"type": "string",
"enum": [
"attended"
]
}
},
"required": [
"kind"
]
}
},
"uncertaintyChannels": {
"default": [],
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"local-notification",
"sms",
"email",
"webhook"
]
}
}
},
"required": [
"observations",
"execution"
]
}
},
"required": [
"runtimeExternalId",
"kind",
"platform",
"runtimeVersion",
"protocolVersion",
"features"
]
}
Link to this route
Native application gateway
DELETE /v1/apps/:appId/workspaces/:workspaceId/devices/:runtimeId
Revoke native workspace :runtimeId
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
GET /v1/apps/:appId/workspaces/:workspaceId/phone-contact
Read native workspace phone-contact
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
DELETE /v1/apps/:appId/workspaces/:workspaceId/phone-contact
Revoke native workspace phone-contact
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
POST /v1/apps/:appId/workspaces/:workspaceId/phone-challenges
Create or submit native workspace phone-challenges
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"phone": "+15555550123",
"consent": true
}
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"phone": {
"type": "string",
"pattern": "^\\+[1-9][0-9]{7,14}$"
},
"consent": {
"type": "boolean",
"const": true
}
},
"required": [
"phone",
"consent"
],
"additionalProperties": false
}
Link to this route
Native application gateway
POST /v1/apps/:appId/workspaces/:workspaceId/phone-challenges/:challengeId/verify
Create or submit native workspace verify
Authentication: x-munky-application-session; configured native application
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Native client sends no project key. Authenticated operations require x-munky-application-session; credentials never belong in URLs.
Request JSON Schema
{
"type": "object",
"properties": {
"code": {
"type": "string",
"pattern": "^[0-9]{6}$"
}
},
"required": [
"code"
],
"additionalProperties": false
}
Link to this route
Native application gateway
GET /v1/apps/:appId/workspaces/:workspaceId/interruptions
Read native workspace interruptions
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Native application gateway
GET /v1/apps/:appId/workspaces/:workspaceId/receipts
Read native workspace receipts
Authentication: x-munky-application-session; configured native application
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtimes and uncertainty
POST /v1/tenants/:tenantId/edge-runtimes
Register a tenant-bound Edge runtime and return its credential once
Authentication: edge:register
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"runtimeExternalId": "install-6f4d2a",
"kind": "customer-edge",
"platform": "macos",
"runtimeVersion": "1.0.0",
"protocolVersion": "attesko.edge.runtime.v1",
"features": {
"observations": true,
"execution": "none",
"observationAdapters": [
{
"kind": "native-event",
"sourceSystems": [
"billing"
]
}
],
"executionAdapters": [],
"uncertaintyChannels": [
"local-notification"
]
}
}
The response returns a short-lived `attsk_rt_` runtime credential once. Store it only in the runtime's local secret store.
Adapter declarations describe reach; they do not establish that a browser or native actuator exists.
Every declared execution adapter must carry `"attendance": "attended"`. That is the only value: no rung has earned unattended use, and an adapter that states nothing is refused here and dispatched no work.
Request JSON Schema
{
"type": "object",
"properties": {
"runtimeExternalId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
},
"kind": {
"type": "string",
"enum": [
"attesko-desktop",
"customer-edge",
"server-edge"
]
},
"platform": {
"type": "string",
"enum": [
"macos",
"windows",
"linux",
"server"
]
},
"runtimeVersion": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"protocolVersion": {
"type": "string",
"const": "attesko.edge.runtime.v1"
},
"features": {
"type": "object",
"properties": {
"observations": {
"type": "boolean"
},
"execution": {
"type": "string",
"enum": [
"none",
"adapter"
]
},
"observationAdapters": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"native-event",
"browser-dom",
"os-accessibility",
"screen-capture"
]
},
"sourceSystems": {
"default": [],
"maxItems": 100,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
}
},
"required": [
"kind"
]
}
},
"executionAdapters": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"type": "string",
"enum": [
"native-api",
"mcp",
"browser-dom",
"os-accessibility"
]
},
"capabilityIds": {
"default": [],
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
},
"attendance": {
"type": "string",
"enum": [
"attended"
]
}
},
"required": [
"kind"
]
}
},
"uncertaintyChannels": {
"default": [],
"maxItems": 4,
"type": "array",
"items": {
"type": "string",
"enum": [
"local-notification",
"sms",
"email",
"webhook"
]
}
}
},
"required": [
"observations",
"execution"
]
}
},
"required": [
"runtimeExternalId",
"kind",
"platform",
"runtimeVersion",
"protocolVersion",
"features"
]
}
Link to this route
Edge runtimes and uncertainty
GET /v1/tenants/:tenantId/edge-runtimes
List the tenant's registered Edge runtimes
Authentication: edge:register
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtimes and uncertainty
DELETE /v1/edge-runtimes/:runtimeId
Revoke an Edge runtime and its credential
Authentication: edge:register
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtimes and uncertainty
POST /v1/edge-runtimes/:runtimeId/heartbeat
Report runtime and adapter health; rotate a near-expiry credential
Authentication: runtime key
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"observedAt": "2026-09-03T15:00:00.000Z",
"runtimeVersion": "1.0.0",
"state": "online",
"adapterHealth": [
{
"kind": "native-event",
"state": "ready"
}
],
"activeAssignmentIds": []
}
Authenticate with the runtime credential, not a project key.
Request JSON Schema
{
"type": "object",
"properties": {
"observedAt": {
"type": "string"
},
"runtimeVersion": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"state": {
"type": "string",
"enum": [
"online",
"degraded",
"paused"
]
},
"adapterHealth": {
"default": [],
"maxItems": 40,
"type": "array",
"items": {
"type": "object",
"properties": {
"kind": {
"anyOf": [
{
"type": "string",
"enum": [
"native-event",
"browser-dom",
"os-accessibility",
"screen-capture"
]
},
{
"type": "string",
"enum": [
"native-api",
"mcp",
"browser-dom",
"os-accessibility"
]
}
]
},
"state": {
"type": "string",
"enum": [
"ready",
"degraded",
"unavailable"
]
},
"reasonCode": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
},
"required": [
"kind",
"state"
],
"additionalProperties": false
}
},
"activeAssignmentIds": {
"default": [],
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
}
}
},
"required": [
"observedAt",
"runtimeVersion",
"state"
],
"additionalProperties": false
}
Link to this route
Edge runtimes and uncertainty
POST /v1/edge-runtimes/:runtimeId/events
Submit minimized events from a declared observation source
Authentication: runtime key
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"schemaVersion": "attesko.edge.event.v1",
"privacy": {
"pseudonymization": "hmac-sha256",
"keyId": "primary",
"removedFieldCount": 0
},
"event": {
"tenantId": "8786c412-4591-4a47-bb0a-be5440bd4e09",
"sourceSystem": "billing",
"eventType": "invoice.updated",
"occurredAt": "2026-09-03T15:00:00.000Z",
"sourceRecordIds": [],
"entities": [],
"subjectExternalId": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"subjectType": "invoice",
"changedFields": [
"status"
],
"idempotencyKey": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
}
Authenticate with the runtime credential. The route tenant is bound by that credential, and the source system must have been declared at registration.
One envelope, or `{ "events": [ ...envelopes ] }` with 1 to 1,000 items.
Request JSON Schema
{
"type": "object",
"properties": {
"schemaVersion": {
"type": "string",
"const": "attesko.edge.event.v1"
},
"privacy": {
"type": "object",
"properties": {
"pseudonymization": {
"type": "string",
"const": "hmac-sha256"
},
"keyId": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]{0,99}$"
},
"removedFieldCount": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"pseudonymization",
"keyId",
"removedFieldCount"
]
},
"event": {
"type": "object",
"properties": {
"tenantId": {
"type": "string",
"minLength": 1
},
"eventId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"principalExternalId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sourceSystem": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"eventType": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"occurredAt": {
"type": "string",
"minLength": 1
},
"sourceRecordIds": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 400
}
},
"entities": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"label": {
"type": "string",
"maxLength": 400
}
},
"required": [
"type",
"externalId"
]
}
},
"subjectExternalId": {
"type": "string",
"maxLength": 400
},
"subjectType": {
"type": "string",
"maxLength": 100
},
"beforeState": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"afterState": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"changedFields": {
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"maxLength": 200
}
},
"correlationId": {
"type": "string",
"maxLength": 400
},
"causationId": {
"type": "string",
"maxLength": 400
},
"idempotencyKey": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"provenance": {
"type": "string",
"enum": [
"product-reported",
"connected-system",
"inference",
"user-confirmed",
"verification-evidence"
]
},
"sensitivity": {
"type": "string",
"enum": [
"none",
"business",
"personal",
"financial"
]
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"tenantId",
"sourceSystem",
"eventType",
"occurredAt",
"idempotencyKey"
]
}
},
"required": [
"schemaVersion",
"privacy",
"event"
]
}
Link to this route
Edge runtimes and uncertainty
GET /v1/edge-runtimes/:runtimeId/work
Lease work matching the runtime's declared execution adapters
Authentication: runtime key
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtimes and uncertainty
POST /v1/edge-runtimes/:runtimeId/work/:workItemId/report
Report a bounded Edge assignment as performed, refused, or failed
Authentication: runtime key
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"assignmentId": "assignment-8841",
"bindingHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"outcome": "performed",
"reference": "email_8841",
"artifact": "Reminder sent for invoice 8291",
"performedAt": "2026-09-03T15:01:12.000Z"
}
Authenticate with the runtime credential. `performed` is a report, not success; the core verifies independently.
Request JSON Schema
{
"type": "object",
"properties": {
"outcome": {
"type": "string",
"enum": [
"performed",
"refused",
"failed"
]
},
"reference": {
"type": "string",
"maxLength": 400
},
"artifact": {
"type": "string",
"maxLength": 4000
},
"detail": {
"type": "string",
"maxLength": 4000
},
"performedAt": {
"type": "string"
},
"assignmentId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
},
"bindingHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"outcome",
"assignmentId",
"bindingHash"
]
}
Link to this route
Edge runtimes and uncertainty
POST /v1/edge-runtimes/:runtimeId/work/:workItemId/uncertainties
Pause an assignment and raise structural uncertainty for a person
Authentication: runtime key
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"assignmentId": "assignment-8841",
"bindingHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"reason": "target-ambiguous",
"reasonCode": "multiple-matching-records",
"context": {
"requiredFieldNames": [],
"optionIds": [
"record-1",
"record-2"
],
"candidateCount": 2
},
"observedAt": "2026-09-03T15:01:00.000Z"
}
Send structural identifiers and reason codes only; do not send screenshots, DOM text, document content, or exception messages.
Request JSON Schema
{
"type": "object",
"properties": {
"assignmentId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
},
"bindingHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"reason": {
"type": "string",
"enum": [
"missing-input",
"target-ambiguous",
"state-drift",
"adapter-unavailable",
"permission-required",
"policy-blocked",
"security-signal",
"checkpoint-mismatch",
"verification-ambiguous"
]
},
"reasonCode": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
},
"context": {
"default": {
"requiredFieldNames": [],
"optionIds": []
},
"type": "object",
"properties": {
"checkpointId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
},
"requiredFieldNames": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"pattern": "^[a-z][a-z0-9_.-]*$"
}
},
"optionIds": {
"default": [],
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
}
},
"candidateCount": {
"type": "integer",
"minimum": 0,
"maximum": 10000
}
},
"additionalProperties": false
},
"observedAt": {
"type": "string"
}
},
"required": [
"assignmentId",
"bindingHash",
"reason",
"reasonCode",
"observedAt"
],
"additionalProperties": false
}
Link to this route
Edge runtimes and uncertainty
GET /v1/edge-runtimes/:runtimeId/work-uncertainties
List uncertainty records visible to this runtime
Authentication: runtime key
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtime
GET /v1/tenants/:tenantId/work-uncertainties
Read a workspace interruption inbox. Query status defaults to open; limit is 1–50; pass nextCursor as cursor for the next page. Requires a trusted backend; no runtime key is needed.
Authentication: uncertainty:decide
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtimes and uncertainty
POST /v1/work-uncertainties/:uncertaintyId/resolve
Resolve uncertainty with an exact delegated-principal decision
Authentication: uncertainty:decide
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"bindingHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"resolution": {
"kind": "select-option",
"optionId": "record-1"
}
}
The delegated-principal assertion and `bindingHash` bind the exact uncertainty decision.
Request JSON Schema
{
"type": "object",
"properties": {
"principalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
},
"bindingHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"resolution": {
"oneOf": [
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "retry"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "cancel"
}
},
"required": [
"kind"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"const": "select-option"
},
"optionId": {
"type": "string",
"minLength": 1,
"maxLength": 200,
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]*$"
}
},
"required": [
"kind",
"optionId"
],
"additionalProperties": false
}
]
}
},
"required": [
"principalId",
"principalAssertion",
"bindingHash",
"resolution"
]
}
Link to this route
Evidence and learning
POST /v1/tenants/:tenantId/labels
Human evaluation label
Authentication: learning:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"kind": "contract-intent",
"subject": {
"familyId": "fam_7c2e…",
"contractVersion": 1
},
"verdict": "correct",
"note": "",
"labelledByPrincipalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature"
}
`kind` is one of: `same-family`, `same-variant`, `contract-intent`, `contract-inputs`, `contract-terminal-outcome`, `contract-executor`, `contract-verifier`, `contract-commit-boundary`, `contract-decision-points`, `contract-capability-mapping`, `case-eligibility`, `verifier-correctness`.
Verdicts for `same-family`: `same-family`, `different-family`, `unsure`.
Verdicts for `same-variant`: `same-variant`, `different-variant`, `unsure`.
Verdicts for `contract-intent`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-inputs`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-terminal-outcome`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-executor`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-verifier`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-commit-boundary`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-decision-points`: `correct`, `incorrect`, `unsure`.
Verdicts for `contract-capability-mapping`: `correct`, `incorrect`, `unsure`.
Verdicts for `case-eligibility`: `correct`, `incorrect`, `unsure`.
Verdicts for `verifier-correctness`: `correct`, `incorrect`, `unsure`.
`subject` names what is being labelled: `{ familyId }` for a contract, `{ familyId, contractVersion }` for a field, `{ episodeIds: [a, b] }` for a pair kind.
`principalAssertion` is a delegated-principal assertion signed with a registered Ed25519 key.
Request JSON Schema
{
"type": "object",
"properties": {
"kind": {
"type": "string",
"minLength": 1
},
"subject": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"verdict": {
"type": "string",
"minLength": 1
},
"note": {
"default": "",
"type": "string",
"maxLength": 2000
},
"labelledByPrincipalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
}
},
"required": [
"kind",
"subject",
"verdict",
"labelledByPrincipalId",
"principalAssertion"
]
}
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/labels
Label history
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/accuracy
Label-backed quality gate
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
POST /v1/tenants/:tenantId/events
Live event or batch intake (Edge envelopes only)
Authentication: events:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"schemaVersion": "attesko.edge.event.v1",
"privacy": {
"pseudonymization": "hmac-sha256",
"keyId": "primary",
"removedFieldCount": 0
},
"event": {
"tenantId": "8786c412-4591-4a47-bb0a-be5440bd4e09",
"principalExternalId": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"sourceSystem": "billing",
"eventType": "invoice.updated",
"occurredAt": "2026-09-02T15:00:00.000Z",
"sourceRecordIds": [],
"entities": [],
"subjectExternalId": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"subjectType": "invoice",
"beforeState": {
"status": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
},
"afterState": {
"status": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
},
"changedFields": [
"status"
],
"correlationId": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"idempotencyKey": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
}
Send the envelope the Edge SDK produces. Every identifier is a `psn_v1_` pseudonym; state values that are not Munky's own vocabulary are pseudonyms too; only allow-listed field names survive.
One envelope, or `{ "events": [ ...envelopes ] }` with 1 to 1,000 items. The route tenant is authoritative.
Per-item rejection codes: `privacy_rejected`, `tenant_mismatch`, `schema_invalid`, `store_failed`. The request succeeds (200) whenever it is well formed; only the request itself being malformed is a 422.
Request JSON Schema
{
"type": "object",
"properties": {
"schemaVersion": {
"type": "string",
"const": "attesko.edge.event.v1"
},
"privacy": {
"type": "object",
"properties": {
"pseudonymization": {
"type": "string",
"const": "hmac-sha256"
},
"keyId": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]{0,99}$"
},
"removedFieldCount": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"pseudonymization",
"keyId",
"removedFieldCount"
]
},
"event": {
"type": "object",
"properties": {
"tenantId": {
"type": "string",
"minLength": 1
},
"eventId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"principalExternalId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sourceSystem": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"eventType": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"occurredAt": {
"type": "string",
"minLength": 1
},
"sourceRecordIds": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 400
}
},
"entities": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"label": {
"type": "string",
"maxLength": 400
}
},
"required": [
"type",
"externalId"
]
}
},
"subjectExternalId": {
"type": "string",
"maxLength": 400
},
"subjectType": {
"type": "string",
"maxLength": 100
},
"beforeState": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"afterState": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"changedFields": {
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"maxLength": 200
}
},
"correlationId": {
"type": "string",
"maxLength": 400
},
"causationId": {
"type": "string",
"maxLength": 400
},
"idempotencyKey": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"provenance": {
"type": "string",
"enum": [
"product-reported",
"connected-system",
"inference",
"user-confirmed",
"verification-evidence"
]
},
"sensitivity": {
"type": "string",
"enum": [
"none",
"business",
"personal",
"financial"
]
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"tenantId",
"sourceSystem",
"eventType",
"occurredAt",
"idempotencyKey"
]
}
},
"required": [
"schemaVersion",
"privacy",
"event"
]
}
Link to this route
Evidence and learning
POST /v1/tenants/:tenantId/events/import
Historical intake without replay proposals
Authentication: events:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"schemaVersion": "attesko.edge.event.v1",
"privacy": {
"pseudonymization": "hmac-sha256",
"keyId": "primary",
"removedFieldCount": 0
},
"event": {
"tenantId": "8786c412-4591-4a47-bb0a-be5440bd4e09",
"sourceSystem": "billing",
"eventType": "invoice.sent",
"occurredAt": "2026-06-01T10:00:00.000Z",
"sourceRecordIds": [],
"entities": [],
"subjectExternalId": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
"subjectType": "invoice",
"changedFields": [],
"idempotencyKey": "psn_v1_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
}
}
Same body as live intake. Imports are marked historical and never raise a proposal.
Request JSON Schema
{
"type": "object",
"properties": {
"schemaVersion": {
"type": "string",
"const": "attesko.edge.event.v1"
},
"privacy": {
"type": "object",
"properties": {
"pseudonymization": {
"type": "string",
"const": "hmac-sha256"
},
"keyId": {
"type": "string",
"pattern": "^[a-z][a-z0-9_-]{0,99}$"
},
"removedFieldCount": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"pseudonymization",
"keyId",
"removedFieldCount"
]
},
"event": {
"type": "object",
"properties": {
"tenantId": {
"type": "string",
"minLength": 1
},
"eventId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"principalExternalId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"sourceSystem": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"eventType": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"occurredAt": {
"type": "string",
"minLength": 1
},
"sourceRecordIds": {
"maxItems": 50,
"type": "array",
"items": {
"type": "string",
"maxLength": 400
}
},
"entities": {
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"type": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"label": {
"type": "string",
"maxLength": 400
}
},
"required": [
"type",
"externalId"
]
}
},
"subjectExternalId": {
"type": "string",
"maxLength": 400
},
"subjectType": {
"type": "string",
"maxLength": 100
},
"beforeState": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"afterState": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
"changedFields": {
"maxItems": 200,
"type": "array",
"items": {
"type": "string",
"maxLength": 200
}
},
"correlationId": {
"type": "string",
"maxLength": 400
},
"causationId": {
"type": "string",
"maxLength": 400
},
"idempotencyKey": {
"type": "string",
"minLength": 1,
"maxLength": 400
},
"provenance": {
"type": "string",
"enum": [
"product-reported",
"connected-system",
"inference",
"user-confirmed",
"verification-evidence"
]
},
"sensitivity": {
"type": "string",
"enum": [
"none",
"business",
"personal",
"financial"
]
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"tenantId",
"sourceSystem",
"eventType",
"occurredAt",
"idempotencyKey"
]
}
},
"required": [
"schemaVersion",
"privacy",
"event"
]
}
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/events
Events, with since (ISO 8601) and limit (1 to 1,000)
Authentication: events:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/events/unmapped
Unknown event shapes
Authentication: events:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
POST /v1/tenants/:tenantId/events/aliases
Confirm tenant-specific semantics
Authentication: events:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"eventType": "invoice.chased",
"surface": "invoice",
"action": "submitting-or-sending",
"confirmedByPrincipalId": "prn_2f1c…",
"note": "Our word for sending the reminder"
}
`surface` and `action` are Munky's vocabulary for what the event means; `confirmedByPrincipalId` is the Munky id of the person confirming it (from a principal upsert).
Request JSON Schema
{
"type": "object",
"properties": {
"eventType": {
"type": "string",
"minLength": 1
},
"surface": {
"type": "string",
"minLength": 1
},
"action": {
"type": "string",
"minLength": 1
},
"confirmedByPrincipalId": {
"type": "string",
"minLength": 1
},
"note": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"eventType",
"surface",
"action",
"confirmedByPrincipalId"
]
}
Link to this route
Capabilities, proposals, and trials
GET /v1/tenants/:tenantId/case-approvals
Pending and decided sensitive cases
Authentication: proposals:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
POST /v1/case-approvals/:approvalId/approve
Approve one always-ask case
Authentication: trials:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"planHash": "sha256:9f2c…",
"reviewMinutes": 2
}
Request JSON Schema
{
"type": "object",
"properties": {
"principalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
},
"planHash": {
"type": "string",
"minLength": 1
},
"reviewMinutes": {
"default": 0,
"type": "number",
"minimum": 0
},
"note": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"principalId",
"principalAssertion",
"planHash"
]
}
Link to this route
Capabilities, proposals, and trials
POST /v1/case-approvals/:approvalId/decline
Decline one always-ask case
Authentication: trials:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"planHash": "sha256:9f2c…",
"note": "Customer asked us to hold"
}
Request JSON Schema
{
"type": "object",
"properties": {
"principalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
},
"planHash": {
"type": "string",
"minLength": 1
},
"reviewMinutes": {
"default": 0,
"type": "number",
"minimum": 0
},
"note": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"principalId",
"principalAssertion",
"planHash"
]
}
Link to this route
Work, proof, and governance
GET /v1/tenants/:tenantId/work
Lease an ordered work page
Authentication: work:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/work/:workItemId
One work item
Authentication: work:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
POST /v1/work/:workItemId/report
Report performed, refused, or failed
Authentication: work:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"outcome": "performed",
"reference": "email_8841",
"artifact": "Reminder sent for invoice 8291",
"performedAt": "2026-09-02T15:01:12.000Z"
}
`outcome` is `performed`, `refused`, or `failed`. Never report success; Munky verifies.
Request JSON Schema
{
"type": "object",
"properties": {
"outcome": {
"type": "string",
"enum": [
"performed",
"refused",
"failed"
]
},
"reference": {
"type": "string",
"maxLength": 400
},
"artifact": {
"type": "string",
"maxLength": 4000
},
"detail": {
"type": "string",
"maxLength": 4000
},
"performedAt": {
"type": "string"
}
},
"required": [
"outcome"
]
}
Link to this route
Work, proof, and governance
GET /v1/tenants/:tenantId/receipts
Tenant receipts
Authentication: receipts:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/receipts/:receiptId
One coherent receipt
Authentication: receipts:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Edge runtimes and uncertainty
POST /v1/edge-runtimes/:runtimeId/frame-escalations
Have one redacted frame read by a provider when the runtime's own tier cannot
Authentication: runtime key
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"promptVersion": "frames-to-events-v8",
"maxOutputTokens": 4096,
"escalationReason": "insufficient-history",
"evidence": {
"recordId": "capture-8f21",
"capturedAt": "2026-09-03T09:15:00.000Z",
"width": 1440,
"height": 900,
"frameBase64": "iVBORw0KGgo=",
"frameEncoding": "png",
"redactionVersion": "redactor-v4",
"activity": {
"foregroundApplication": "Practice Manager",
"windowTitle": null,
"browserUrl": null,
"pointerActivity": true,
"keyboardActivity": false
}
}
}
For a runtime that runs its own frame tier and met a screen its history cannot answer. The runtime must have declared observation support when it registered; the tenant is the runtime's own and cannot be named in the body.
`promptVersion` names the frame-understanding instruction to answer under. A prompt itself is never sent: Munky renders its own text for the version and refuses a version it does not hold, so a runtime cannot choose what a provider is asked.
`evidence` must be the redactor's output. A `redactionVersion` of `raw`, `none`, `unredacted`, or `passthrough` is refused before any provider is called and before any allowance is spent. `frameEncoding` must be `png` — an escalation carries an encoded frame — and `frameBase64` is at most 2,000,000 characters, which keeps the whole request inside the 2 MiB body ceiling every other `/v1` route lives with.
`escalationReason` is a lower-case slug describing why the local tier could not answer, matching `^[a-z][a-z0-9-]{0,40}$`. It is recorded on the departure notice, so it must never carry a window title, a URL, or anything else read off the screen.
The answer is always 200 and is either `{ "ok": true, "output": …, "usage": … }` or `{ "ok": false, "reason": …, "detail": …, "retryAfterSeconds"?: … }`. `reason` is one of `unsupported-prompt-version`, `budget-exhausted`, `evidence-refused`, or `provider-unavailable`; only `provider-unavailable` should be retried with the same frame, and `budget-exhausted` resolves when the tenant's window does.
The per-tenant escalation ceiling is spent when the frame is sent and is never refunded, including when the provider fails: what it bounds is frames leaving a machine, and one that left unanswered still left. A ceiling that cannot be read answers `budget-exhausted` too — see ADR-0043.
Send `x-attesko-idempotency-key` and one frame is one escalation however many times it is sent. A key that has already been answered is answered again with the same `output` and `usage`, at no further cost and against no further allowance; a resend arriving while the first attempt is still running is refused `provider-unavailable` rather than read twice. Omitting the header does not opt out — Munky keys the frame by `evidence.recordId`, which is what the official runtime builds its header from. See ADR-0051.
Request JSON Schema
{
"type": "object",
"properties": {
"promptVersion": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"maxOutputTokens": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"escalationReason": {
"type": "string",
"pattern": "^[a-z][a-z0-9-]{0,40}$"
},
"evidence": {
"type": "object",
"properties": {
"recordId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"capturedAt": {
"type": "string",
"minLength": 1,
"maxLength": 40
},
"width": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"height": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 9007199254740991
},
"frameBase64": {
"type": "string",
"minLength": 1,
"maxLength": 12000000
},
"frameEncoding": {
"type": "string",
"enum": [
"rgba",
"png"
]
},
"redactionVersion": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"activity": {
"type": "object",
"properties": {
"foregroundApplication": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"windowTitle": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"browserUrl": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"pointerActivity": {
"type": "boolean"
},
"keyboardActivity": {
"type": "boolean"
}
},
"required": [
"foregroundApplication",
"windowTitle",
"browserUrl",
"pointerActivity",
"keyboardActivity"
]
}
},
"required": [
"recordId",
"capturedAt",
"width",
"height",
"frameBase64",
"redactionVersion",
"activity"
]
}
},
"required": [
"promptVersion",
"maxOutputTokens",
"evidence"
]
}
Link to this route
Work, proof, and governance
GET /v1/tenants/:tenantId/export
Tenant data and evidence export
Authentication: export:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/audit/export
Security audit and erasure export
Authentication: export:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
DELETE /v1/tenants/:tenantId
Idempotent tenant erasure
Authentication: erase:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Identity and tenants
POST /v1/tenants
Idempotent tenant upsert
Authentication: tenants:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"externalId": "customer_2048",
"displayName": "Northwind Logistics"
}
Request JSON Schema
{
"type": "object",
"properties": {
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"metadata": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
}
},
"required": [
"externalId",
"displayName"
]
}
Link to this route
Identity and tenants
GET /v1/tenants
Project and environment tenant list
Authentication: tenants:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Identity and tenants
GET /v1/tenants/:tenantId
One tenant mapping
Authentication: tenants:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Identity and tenants
POST /v1/tenants/:tenantId/principals
Principal upsert with permissions
Authentication: principals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"externalId": "user_17",
"displayName": "Ops lead",
"role": "billing_manager",
"permissions": [
{
"operation": "proposal.approve"
},
{
"operation": "case.approve",
"capabilityIds": [
"invoice.send_follow_up"
]
}
]
}
`permissions` is a list of objects, not strings. Each names one `operation`; `capabilityIds` narrows it to an allow-list.
`role` is your own label. Munky authorizes permissions, never role names.
Request JSON Schema
{
"type": "object",
"properties": {
"externalId": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"displayName": {
"type": "string",
"minLength": 1,
"maxLength": 200
},
"role": {
"default": "member",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"permissions": {
"default": [],
"type": "array",
"items": {
"type": "object",
"properties": {
"operation": {
"type": "string",
"enum": [
"proposal.approve",
"proposal.decline",
"trial.stop",
"case.approve",
"case.decline",
"correction.apply",
"evaluation.label",
"uncertainty.resolve",
"connector-job.register"
]
},
"capabilityIds": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"minLength": 1
}
}
},
"required": [
"operation"
]
}
}
},
"required": [
"externalId",
"displayName"
]
}
Link to this route
Identity and tenants
GET /v1/tenants/:tenantId/principals
Tenant principal list
Authentication: principals:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/episodes
Reconstructed episodes
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
POST /v1/tenants/:tenantId/learn
Run a learning pass
Authentication: learning:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
No body fields. Send `{}`.
Request JSON Schema
{
"type": "object",
"properties": {}
}
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/learning
Status and recent passes
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/learning-feedback
Outcome, correction, drift, and proposal feedback
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/jobs
Latest job-family summaries
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/jobs/:familyId/versions
Contract history
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/jobs/:familyId/episodes
Evidence for one family
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Evidence and learning
GET /v1/tenants/:tenantId/jobs/:familyId
Latest versioned job contract
Authentication: learning:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/tenants/:tenantId/metrics
Tenant work metrics
Authentication: metrics:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/metrics
Project aggregate work metrics
Authentication: metrics:read
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /health
Process liveness. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /ready
Database readiness. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /docs/integration.md
Public integration guide and complete API reference
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /docs/INTEGRATION.md
Read public integration documentation. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /docs/API-REFERENCE.md
Read public integration documentation. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /docs/LOCAL-RUNTIME.md
Read public integration documentation. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /docs/public-contract.json
Read public integration documentation. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.1.0.tgz
Download the standalone SDK. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.1.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.1.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.2.0.tgz
Download the standalone SDK. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.2.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.2.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.3.0.tgz
Download the standalone SDK. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.3.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.3.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.4.0.tgz
Download the SDK with numbered and Yes/No text decision contracts. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.5.0.tgz
Download the SDK with verified phone contacts and durable decision delivery APIs. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.4.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.4.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.5.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.5.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.6.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.6.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.7.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.7.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.8.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.8.0.json
Read the local runtime archive checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.9.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.9.0.json
Read the local runtime checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.10.0.tgz
Download the local runtime package. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.10.0.json
Read the local runtime checksum. No key.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
Distribution
GET /sdk/munky-sdk-0.8.0.tgz
Download SDK 0.8.0 with companion identity and decision reads. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.7.0.tgz
Download SDK 0.7.0 with the workspace interruption inbox. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Distribution
GET /runtime/munky-local-runtime-0.18.0.tgz
Download runtime 0.18.0 with the direct SMS decision migration. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Distribution
GET /runtime/munky-local-runtime-0.18.0.json
Read the runtime 0.18.0 checksum. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Distribution
GET /runtime/munky-local-runtime-0.17.0.tgz
Download runtime 0.17.0 tgz release. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Distribution
GET /runtime/munky-local-runtime-0.17.0.json
Download runtime 0.17.0 json release. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.15.0.tgz
Download runtime 0.15.0 with native application gateway contracts. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.15.0.json
Read the runtime 0.15.0 checksum. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.14.0.tgz
Download runtime 0.14.0 with exact-hold retry protection. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.14.0.json
Read the runtime 0.14.0 checksum. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.13.0.tgz
Download local runtime 0.13.0. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.13.0.json
Read the runtime 0.13.0 checksum. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /sdk/munky-sdk-0.6.0.tgz
Download the public SDK package. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.11.0.tgz
Download the local runtime package. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /runtime/munky-local-runtime-0.11.0.json
Read the local runtime checksum. No key.
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Identity and tenants
GET /v1/whoami
Caller, scopes, environment, and available areas
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/usage
Usage and plan records
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
System
GET /v1/docs
This reference as Markdown, for a key holder
Authentication: project key
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
GET /v1/tenants/:tenantId/proposals
Tenant proposals
Authentication: proposals:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
GET /v1/proposals/:proposalId
One proposal
Authentication: proposals:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
POST /v1/proposals/:proposalId/approve
Approve the exact plan and start a trial
Authentication: proposals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"planHash": "sha256:9f2c…",
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"trial": {
"maxCases": 20,
"expiresAt": "2026-09-09T15:00:00.000Z",
"reviewMinutesPerCase": 1
}
}
Request JSON Schema
{
"type": "object",
"properties": {
"planHash": {
"type": "string",
"minLength": 1
},
"principalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
},
"trial": {
"type": "object",
"properties": {
"maxCases": {
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 1000
},
"expiresAt": {
"type": "string"
},
"reviewMinutesPerCase": {
"default": 0,
"type": "number",
"minimum": 0,
"maximum": 600
}
},
"required": [
"maxCases"
]
}
},
"required": [
"planHash",
"principalId",
"principalAssertion",
"trial"
]
}
Link to this route
Capabilities, proposals, and trials
POST /v1/proposals/:proposalId/decline
Decline with a structured reason
Authentication: proposals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"reason": "not-safe-yet",
"note": "Wait for the new verifier"
}
`reason` is one of: `not-this-job`, `wrong-path`, `not-safe-yet`, `wrong-capability`, `later`, `other`, `wrong-job`, `wrong-normal-path`, `unsafe`, `not-valuable`, `wrong-capability-mapping`, `wrong-timing`, `customer-policy`, `not-ready`.
Request JSON Schema
{
"type": "object",
"properties": {
"principalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
},
"reason": {
"type": "string",
"enum": [
"not-this-job",
"wrong-path",
"not-safe-yet",
"wrong-capability",
"later",
"other",
"wrong-job",
"wrong-normal-path",
"unsafe",
"not-valuable",
"wrong-capability-mapping",
"wrong-timing",
"customer-policy",
"not-ready"
]
},
"note": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"principalId",
"principalAssertion",
"reason"
]
}
Link to this route
Capabilities, proposals, and trials
GET /v1/tenants/:tenantId/trials
Tenant trials
Authentication: proposals:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
GET /v1/trials/:trialId
One trial
Authentication: proposals:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Capabilities, proposals, and trials
POST /v1/trials/:trialId/stop
Stop a trial
Authentication: trials:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"principalId": "prn_2f1c…",
"principalAssertion": "eyJhbGciOiJFZERTQSJ9.example.signature",
"note": "Pausing during the audit"
}
Request JSON Schema
{
"type": "object",
"properties": {
"principalId": {
"type": "string",
"minLength": 1
},
"principalAssertion": {
"type": "string",
"minLength": 1,
"maxLength": 32768
},
"note": {
"type": "string",
"maxLength": 2000
}
},
"required": [
"principalId",
"principalAssertion"
]
}
Link to this route
Work, proof, and governance
POST /v1/tenants/:tenantId/text-decisions
Persist an immutable numbered or Yes/No decision request; does not send messages or approve work.
Authentication: proposals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"requestId": "email-choice-1",
"tenantId": "8a522c0b-a2b4-4e56-bd77-f9322d4f83a1",
"principalId": "497f2c2f-9fea-4028-812f-41e2a76e8f08",
"conversationId": "request-thread-1",
"question": "Prepare email options?",
"context": "Your existing email will stay as it is.",
"mode": "yes-no",
"recommendation": null,
"createdAt": "2026-09-06T12:00:00Z",
"expiresAt": "2026-09-06T12:15:00Z",
"options": [
{
"id": "prepare",
"label": "Prepare options",
"consequence": "Compare mailbox providers.",
"intent": "preference",
"planHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"quote": null
},
{
"id": "wait",
"label": "Wait",
"consequence": "Leave things unchanged.",
"intent": "decline",
"planHash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"quote": null
}
]
}
Replace the tenant/principal IDs and timestamps with current values. Reuse the exact input for retries.
Creation queues a record only. There is no project-key endpoint that turns a reply into spending authority.
Request JSON Schema
{
"type": "object",
"properties": {
"requestId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"tenantId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"principalId": {
"type": "string",
"format": "uuid",
"pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
},
"conversationId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"question": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"context": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"mode": {
"type": "string",
"enum": [
"numbered",
"yes-no"
]
},
"options": {
"minItems": 2,
"maxItems": 4,
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"label": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"consequence": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"intent": {
"type": "string",
"enum": [
"preference",
"purchase",
"decline"
]
},
"planHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
},
"quote": {
"anyOf": [
{
"type": "object",
"properties": {
"provider": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"product": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"quantity": {
"type": "integer",
"minimum": 1,
"maximum": 10000
},
"currency": {
"type": "string",
"enum": [
"USD",
"EUR",
"GBP",
"CAD",
"AUD"
]
},
"totalDueNowMinor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"tax": {
"type": "string",
"enum": [
"included",
"not-applicable",
"unknown"
]
},
"recurring": {
"anyOf": [
{
"type": "object",
"properties": {
"totalMinor": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"interval": {
"type": "string",
"enum": [
"month",
"year"
]
},
"startsAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"totalMinor",
"interval",
"startsAt"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"terms": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"sourceUrl": {
"type": "string",
"format": "uri"
},
"retrievedAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"provider",
"product",
"quantity",
"currency",
"totalDueNowMinor",
"tax",
"recurring",
"terms",
"sourceUrl",
"retrievedAt",
"expiresAt"
],
"additionalProperties": false
},
{
"type": "null"
}
]
}
},
"required": [
"id",
"label",
"consequence",
"intent",
"planHash",
"quote"
],
"additionalProperties": false
}
},
"recommendation": {
"anyOf": [
{
"type": "object",
"properties": {
"optionId": {
"type": "string",
"pattern": "^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$"
},
"reason": {
"type": "string",
"minLength": 1,
"maxLength": 300
}
},
"required": [
"optionId",
"reason"
],
"additionalProperties": false
},
{
"type": "null"
}
]
},
"createdAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
},
"expiresAt": {
"type": "string",
"format": "date-time",
"pattern": "^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"
}
},
"required": [
"requestId",
"tenantId",
"principalId",
"conversationId",
"question",
"context",
"mode",
"options",
"recommendation",
"createdAt",
"expiresAt"
],
"additionalProperties": false
}
Link to this route
Work, proof, and governance
GET /v1/tenants/:tenantId/text-decisions/:requestId
Read the exact prompt, delivery state and recorded selection.
Authentication: proposals:read
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
POST /v1/tenants/:tenantId/text-decisions/:requestId/cancel
Cancel an unanswered decision bound to its displayed prompt.
Authentication: proposals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"bindingHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
Supply the bindingHash returned by create/read; this example hash is illustrative.
Request JSON Schema
{
"type": "object",
"properties": {
"bindingHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"bindingHash"
],
"additionalProperties": false
}
Link to this route
Text delivery
POST /v1/tenants/:tenantId/principals/:principalId/phone-challenges
Send a rate-limited phone possession challenge after messaging consent.
Authentication: principals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"phone": "+15555550123",
"consent": true
}
Only send after the user requests phone setup. At most three challenges per phone per hour; five code guesses per challenge. Codes expire after ten minutes.
Request JSON Schema
{
"type": "object",
"properties": {
"phone": {
"type": "string",
"pattern": "^\\+[1-9][0-9]{7,14}$"
},
"consent": {
"type": "boolean",
"const": true
}
},
"required": [
"phone",
"consent"
],
"additionalProperties": false
}
Link to this route
Text delivery
POST /v1/tenants/:tenantId/principals/:principalId/phone-challenges/:challengeId/verify
Verify the code and bind the phone to this principal; grants no purchasing authority.
Authentication: principals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
Request JSON Schema
{
"type": "object",
"properties": {
"code": {
"type": "string",
"pattern": "^[0-9]{6}$"
}
},
"required": [
"code"
],
"additionalProperties": false
}
Link to this route
Text delivery
GET /v1/tenants/:tenantId/principals/:principalId/phone-contact
Read verification status and the last four digits only.
Authentication: principals:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Text delivery
DELETE /v1/tenants/:tenantId/principals/:principalId/phone-contact
Revoke this phone contact and invalidate its decision links.
Authentication: principals:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Text delivery
POST /v1/tenants/:tenantId/text-decisions/:requestId/send
Queue one SMS decision link for the verified contact.
Authentication: proposals:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"bindingHash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
Requires an existing verified contact. Returns queue state, not handset delivery. No link token is returned to the project key.
Request JSON Schema
{
"type": "object",
"properties": {
"bindingHash": {
"type": "string",
"pattern": "^[a-f0-9]{64}$"
}
},
"required": [
"bindingHash"
],
"additionalProperties": false
}
Link to this route
Text delivery
GET /text-decisions/answer
Open the decision screen without consuming or answering a request.
Authentication: none
Read the integration guide for the operation sequence and response handling.
Link to this route
Text delivery
POST /text-decisions/describe
Read the exact decision using the private token delivered to a verified phone.
Authentication: private phone-delivered token
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
}
Token is carried in the SMS URL fragment and POST body, never a query string. This read does not answer the question.
Request JSON Schema
{
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{43}$"
}
},
"required": [
"token"
],
"additionalProperties": false
}
Link to this route
Text delivery
POST /text-decisions/answer
Record a selection using the phone-delivered token; does not place an order.
Authentication: private phone-delivered token and same-origin request
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"token": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"answer": "Yes"
}
Use the exact displayed choice and configured HTTPS Origin. Recorded selection is not an existing case approval or purchase receipt.
Request JSON Schema
{
"type": "object",
"properties": {
"token": {
"type": "string",
"pattern": "^[A-Za-z0-9_-]{43}$"
},
"answer": {
"type": "string",
"enum": [
"1",
"2",
"3",
"4",
"Yes",
"No"
]
}
},
"required": [
"token",
"answer"
],
"additionalProperties": false
}
Link to this route
Text delivery
POST /v1/text-decisions/sms
Authenticate Twilio STOP/START/HELP; plain replies never select a purchase.
Authentication: Twilio signature, account and destination
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"AccountSid": "ACaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
"MessageSid": "SMbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"From": "+15555550123",
"To": "+15555550124",
"Body": "HELP"
}
Twilio application/x-www-form-urlencoded request, not JSON. Signature covers the configured public URL and all fields. Duplicate form fields are rejected; provider message IDs are deduplicated.
Request JSON Schema
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "string"
}
}
Link to this route
Work, proof, and governance
POST /v1/webhooks
Register a signed project webhook; the secret is returned once
Authentication: webhooks:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
{
"url": "https://example.com/webhooks/attesko",
"eventTypes": [
"proposal.created",
"work.issued",
"receipt.created"
]
}
`eventTypes` are from: `job.understood`, `job.eligible`, `proposal.created`, `proposal.approved`, `proposal.declined`, `proposal.expired`, `trial.started`, `trial.exhausted`, `trial.stopped`, `trial.completed`, `work.issued`, `work.verified`, `work.failed`, `work.requires_human`, `receipt.created`, `correction.applied`, `connection.degraded`.
Optional `secret` (32+ characters) to bring your own signing secret; otherwise one is generated and returned once.
Request JSON Schema
{
"type": "object",
"properties": {
"url": {
"type": "string",
"format": "uri"
},
"eventTypes": {
"minItems": 1,
"type": "array",
"items": {
"type": "string",
"enum": [
"job.understood",
"job.eligible",
"proposal.created",
"proposal.approved",
"proposal.declined",
"proposal.expired",
"trial.started",
"trial.exhausted",
"trial.stopped",
"trial.completed",
"work.issued",
"work.verified",
"work.failed",
"work.requires_human",
"receipt.created",
"correction.applied",
"connection.degraded"
]
}
},
"secret": {
"type": "string",
"minLength": 32
}
},
"required": [
"url",
"eventTypes"
]
}
Link to this route
Work, proof, and governance
GET /v1/webhooks
Webhook summaries, secrets omitted
Authentication: webhooks:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
DELETE /v1/webhooks/:endpointId
Remove a webhook; delivery history is kept
Authentication: webhooks:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
GET /v1/webhooks/deliveries
Recent delivery attempts
Authentication: webhooks:write
Read the integration guide for the operation sequence and response handling.
Link to this route
Work, proof, and governance
POST /v1/webhooks/deliveries/:eventId/replay
Replay one eligible delivery by its UUID event id
Authentication: webhooks:write
View request example
Example values illustrate the schema. Replace identifiers with records from your own development environment.
No body fields. The event id in the path must be a UUID.
Request JSON Schema
{
"type": "object",
"properties": {}
}
Link to this routeNo matching routes. Try another search.