← Integration guide

API reference.

Public routes, authentication and request schemas from the MUNKY contract. Deployment and provider availability are described in the integration guide.

185 routes

Markdown reference · JSON contract · Complete 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.

{
  "paused": true
}

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.

{
  "paused": 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": {
    "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.

{
  "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": {
    "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.

{
  "code": "123456"
}
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 route