Basis Theory emits an event for every operation listed on this page. The same event object is delivered to your webhook endpoints and returned when you Query Events through the API.
Structure of Events
Every event is one event object with the fields below. Webhooks deliver it inside a request body that adds delivered_at; see Webhook Delivery. Query Events returns the same objects in a paginated data array. Key order is not guaranteed on either channel and can differ from the samples on this page.
Event object
{
"id": "e99b3bb9-25e4-484f-8a6d-6bc28edbbf39",
"type": "<TYPE OF EVENT DEFINED BELOW>",
"timestamp": "2024-04-09T13:56:37.864Z",
"tenant_id": "869d5b1c-1ae8-4ce6-96c6-73a602b407ff",
"trace_id": "0f777425-9080-4d82-b557-799f43aefcba",
"data": {
"EVENT-SPECIFIC-OBJECT": {...},
"actor": {
"id": "...",
"type": "...",
"name": "..."
}
}
}
| Name | Type | Description |
|---|
| id | string | Unique identifier for the event |
| type | string | Type of event (see details below for each event) |
| timestamp | string | ISO 8601 timestamp of the reported operation. See Event timestamps. |
| tenant_id | string | Unique identifier for the tenant associated with the event |
| trace_id | string | Unique identifier for tracing this event across systems |
| data.EVENT-SPECIFIC-OBJECT | object | Object containing data specific to the event type. The keys under data vary by event, and each event's sample below shows them. Any event can also carry actor. |
| data.actor | object | (Optional) Information about the actor who triggered the event. Omitted when the actor is unknown. |
| data.actor.id | string | Unique identifier for the actor |
| data.actor.type | string | Type of the actor (application, user, admin, system) |
| data.actor.name | string | Name or identifier of the actor |
Event timestamps
event.timestamp is the time of the operation the event reports. Events that create or change a resource carry the created_at, modified_at or updated_at value written by that same operation. Vulnerability events carry the time the vulnerabilities were discovered or the notification was sent. All other events, including invocation events such as proxy.invoked, http.request, reactor.invoked, reactor.completed and reactor.failed, carry the time the event was emitted.
Timestamps are ISO 8601 strings in UTC at millisecond precision with a Z suffix, for example 2026-10-15T08:00:00.123Z.
Optional fields and nulls
Nested properties with a null value are omitted from the payload, so a missing nested key means its value was null. The keys directly under data are always present and can be null, for example detokenization on proxy.invoked, device_info on http.request and error on an asynchronous reactor.failed. An object whose properties are all null is sent as {}, for example request_transform.response on a proxy.invoked event with no transform error. data.actor is omitted when the actor is unknown. Agentic Payments events are produced by a different service and keep nested null values, so actor.name can be null there.
Fields marked (Optional) in the tables below can be missing from a payload.
The individual data objects are defined below by type. The Events API filters events by exact data.<path> values, using the field names documented here.
3DS Sessions
Session Authenticated
3ds.session.authenticated
{
"session": {
"id": "...",
"type": "...",
"authentication_status": "...",
"created_at": "...",
"created_by": "...",
"device": "...",
"expires_at": "...",
"token_id": "...",
"card_brand": "...",
"metadata": { ... }
}
}
| Name | Type | Description |
|---|
| session.id | String | The unique identifier of the session. |
| session.type | String | The session type (customer or merchant) |
| session.authentication_status | String | The status of the authentication. |
| session.created_at | String | The creation date of the session in ISO 8601 format. |
| session.created_by | String | The Application ID which created the session |
| session.device | String | The device used to create the session (browser or mobile). |
| session.expires_at | String | The expiration date of the session in ISO 8601 format. |
| session.token_id | String | The unique identifier for the card token referenced by this session. |
| session.token_intent_id | String | The unique identifier for the card token intent referenced by this session. |
| session.card_brand | String | The brand of the card associated with the session. |
| session.metadata | Object | A key-value map of strings containing custom data associated with the session. |
Challenge Result Retrieved
3ds.session.challenge-result-retrieved
{
"session": {
"id": "...",
"type": "...",
"tenant_id": "...",
"created_at": "...",
"created_by": "...",
"device": "...",
"expires_at": "...",
"token_id": "...",
"card_brand": "...",
"metadata": { ... }
}
}
| Name | Type | Description |
|---|
| session.id | String | The unique identifier of the session. |
| session.type | String | The session type (customer or merchant) |
| session.tenant_id | String | The unique identifier of the Tenant associated with the session. |
| session.created_at | String | The creation date of the session in ISO 8601 format. |
| session.created_by | String | The Application ID which created the session |
| session.device | String | The device used to create the session (browser or mobile). |
| session.expires_at | String | The expiration date of the session in ISO 8601 format. |
| session.token_id | String | The unique identifier for the card token referenced by this session. |
| session.token_intent_id | String | The unique identifier for the card token intent referenced by this session. |
| session.card_brand | String | The brand of the card associated with the session. |
| session.metadata | Object | A key-value map of strings containing custom data associated with the session. |
Session Created
3ds.session.created
{
"session": {
"id": "...",
"type": "...",
"tenant_id": "...",
"created_at": "...",
"created_by": "...",
"device": "...",
"expires_at": "...",
"token_id": "...",
"card_brand": "...",
"metadata": { ... }
}
}
| Name | Type | Description |
|---|
| session.id | String | The unique identifier of the session. |
| session.type | String | The session type (customer or merchant) |
| session.tenant_id | String | The unique identifier of the Tenant associated with the session. |
| session.created_at | String | The creation date of the session in ISO 8601 format. |
| session.created_by | String | The Application ID which created the session |
| session.device | String | The device used to create the session (browser or mobile). |
| session.expires_at | String | The expiration date of the session in ISO 8601 format. |
| session.token_id | String | The unique identifier for the card token referenced by this session. |
| session.token_intent_id | String | The unique identifier for the card token intent referenced by this session. |
| session.card_brand | String | The brand of the card associated with the session. |
| session.metadata | Object | A key-value map of strings containing custom data associated with the session. |
Method Request Completed
3ds.session.method-completed
{
"session": {
"id": "...",
"type": "...",
"tenant_id": "...",
"metadata": { ... }
}
}
| Name | Type | Description |
|---|
| session.id | String | The unique identifier of the session. |
| session.type | String | The session type (customer or merchant) |
| session.tenant_id | String | The unique identifier of the Tenant associated with the session. |
| session.metadata | Object | A key-value map of strings containing custom data associated with the session. |
Challenge Completed
3ds.session.challenge-completed
{
"session": {
"id": "...",
"type": "...",
"tenant_id": "...",
"authentication_status": "...",
"metadata": { ... }
}
}
| Name | Type | Description |
|---|
| session.id | String | The unique identifier of the session. |
| session.type | String | The session type (customer or merchant) |
| session.tenant_id | String | The unique identifier of the Tenant associated with the session. |
| session.authentication_status | String | The authentication status for the challenge between successful and failed. |
| session.metadata | Object | A key-value map of strings containing custom data associated with the session. |
Decoupled Challenge Notification
3ds.session.decoupled-challenge-notification
{
"session": {
"id": "...",
"type": "...",
"tenant_id": "...",
"metadata": { ... }
}
}
| Name | Type | Description |
|---|
| session.id | String | The unique identifier of the session. |
| session.type | String | The session type (customer or merchant) |
| session.tenant_id | String | The unique identifier of the Tenant associated with the session. |
| session.metadata | Object | A key-value map of strings containing custom data associated with the session. |
Account Updater
Job Completed
account-updater.job.completed
{
"job": {
"id": "55256454-c9f9-4e79-bc9e-24bd38af5c21",
"status": "completed"
}
}
| Name | Type | Description |
|---|
| job.id | String | The unique identifier of the job. |
| job.status | String | The current status of the job. |
Job Created
account-updater.job.created
{
"job": {
"id": "55256454-c9f9-4e79-bc9e-24bd38af5c21",
"status": "pending"
}
}
| Name | Type | Description |
|---|
| job.id | String | The unique identifier of the job. |
| job.status | String | The current status of the job. |
Job Failed
account-updater.job.failed
{
"job": {
"id": "55256454-c9f9-4e79-bc9e-24bd38af5c21",
"status": "failed"
}
}
| Name | Type | Description |
|---|
| job.id | String | The unique identifier of the job. |
| job.status | String | The current status of the job. |
Agentic Payments
Agentic Payments events are triggered during the lifecycle of payment methods, allowances and payment credentials.
These events nest their fields under a fixed payload key on event.data, the same key for every event type rather than a key named after the resource, and include an actor identifying the application whose API key made the request. actor.name is null when the application name could not be resolved, and events triggered without an API key, such as a provider's browser callback, omit actor entirely.
Payment Method Created
agentic.payment-method.created
{
"payload": {
"payment_method_id": "...",
"source_type": "...",
"rails": ["...", "..."]
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.payment_method_id | String | The unique identifier of the payment method. |
| payload.source_type | String | The type of source the payment method was created from. Currently always basis_theory_card_token. |
| payload.rails | Array of Strings | The names of the rails that were provisioned, such as agentic-token or spt. A rail is listed even when its provisioning ended in error, so read the payment method to learn each rail's status before using it. |
Payment Method Rail Retried
agentic.payment-method.rail.retried
{
"payload": {
"payment_method_id": "...",
"rail": "...",
"provider": "...",
"status": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.payment_method_id | String | The unique identifier of the payment method. |
| payload.rail | String | The rail that was retried: agentic-token or spt. |
| payload.provider | String | The provider behind the rail: vic, agentpay or stripe. |
| payload.status | String | The rail's status after the retry: enabled, pending or error. A retry that failed again is delivered with status set to error, matching the error the API returned. |
Payment Method Deleted
agentic.payment-method.deleted
{
"payload": {
"payment_method_id": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.payment_method_id | String | The unique identifier of the deleted payment method. The delete also cancels the payment method's allowances, and each cancellation publishes its own agentic.allowance.deleted event. |
Allowance Created
agentic.allowance.created
{
"payload": {
"allowance_id": "...",
"payment_method_id": "...",
"amount": {
"value": "...",
"currency": "..."
},
"rails": [
{
"rail": "...",
"provider": "...",
"status": "..."
}
]
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.allowance_id | String | The unique identifier of the allowance. |
| payload.payment_method_id | String | The unique identifier of the payment method the allowance was created against. |
| payload.amount.value | String | The amount the allowance authorizes, as a decimal string. |
| payload.amount.currency | String | The ISO 4217 currency code of the amount. |
| payload.rails | Array | One entry per allowance rail. |
| payload.rails[].rail | String | The rail name: agentic-token or spt. |
| payload.rails[].provider | String | The provider behind the rail: vic, agentpay or stripe. |
| payload.rails[].status | String | The rail's status: active, pending_verification or error. A rail in pending_verification requires verification before minting. |
Allowance Updated
agentic.allowance.updated
{
"payload": {
"allowance_id": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.allowance_id | String | The unique identifier of the updated allowance. The event carries no diff, so read the allowance to learn what changed. |
Allowance Rail Retried
agentic.allowance.rail.retried
{
"payload": {
"allowance_id": "...",
"rail": "...",
"provider": "...",
"status": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.allowance_id | String | The unique identifier of the allowance. |
| payload.rail | String | The rail that was retried: agentic-token or spt. |
| payload.provider | String | The provider behind the rail: vic, agentpay or stripe. |
| payload.status | String | The rail's status after the retry: active, pending_verification or error. A retry that failed again is delivered with status set to error, matching the error the API returned. |
Allowance Verification Completed
agentic.allowance.verification.completed
{
"payload": {
"allowance_id": "...",
"rail": "...",
"provider": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.allowance_id | String | The unique identifier of the allowance whose rail became active. Credentials can now be minted from this rail. |
| payload.rail | String | The verified rail: agentic-token or spt. |
| payload.provider | String | The provider behind the rail: vic, agentpay or stripe. |
This event fires on whichever verification action reached active, for every provider's ceremony, so a backend can rely on it as the activation signal without knowing which ceremony the frontend drove.
Allowance Deleted
agentic.allowance.deleted
{
"payload": {
"allowance_id": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.allowance_id | String | The unique identifier of the cancelled allowance. No credential can be minted from it afterwards. This event is also published for each allowance cancelled by a payment method delete. |
Payment Credential Created
agentic.payment-credential.created
{
"payload": {
"credential_id": "...",
"allowance_id": "...",
"rail": "...",
"provider": "...",
"format": "..."
},
"actor": {
"id": "...",
"type": "application",
"name": "..."
}
}
| Name | Type | Description |
|---|
| payload.credential_id | String | The unique identifier of the payment credential. |
| payload.allowance_id | String | The unique identifier of the allowance the credential was minted from. |
| payload.rail | String | The rail the credential was minted on: agentic-token or spt. |
| payload.provider | String | The provider that issued the credential: vic, agentpay or stripe. |
| payload.format | String | The credential format: card, network-token, identifier or mpp. |
The event marks that a mint committed allowance spend, which makes it a natural hook for ledger reconciliation. It deliberately carries neither the credential value nor the minted amount; the value is returned once in the API response and never again.
Apple Pay
Resource Created
apple-pay.created
{
"apple_pay": {
"id": "...",
"type": "...",
"status": "...",
"ingest_source": "...",
"created_by": "...",
"created_at": "...",
"expires_at": "..."
}
}
| Name | Type | Description |
|---|
| apple_pay.id | String | The unique identifier of the resource. |
| apple_pay.type | String | The type of the resource. See Token Types. |
| apple_pay.status | String | The status of the resource. |
| apple_pay.ingest_source | String | How the resource was ingested. device_decrypted for POST /apple-pay; stripe_forward for Stripe Forward. |
| apple_pay.created_by | String | The creator of the resource. |
| apple_pay.created_at | String | The creation date of the resource in ISO 8601 format. |
| apple_pay.expires_at | String | The expiration date of the resource in ISO 8601 format. |
Resource Deleted
apple-pay.deleted
{
"apple_pay": {
"id": "...",
"type": "...",
"status": "...",
"created_by": "...",
"created_at": "...",
"expires_at": "...",
"modified_at": "...",
"modified_by": "..."
}
}
| Name | Type | Description |
|---|
| apple_pay.id | String | The unique identifier of the resource. |
| apple_pay.type | String | The type of the resource. |
| apple_pay.status | String | The status of the resource. |
| apple_pay.created_by | String | The creator of the resource. |
| apple_pay.created_at | String | The creation date of the resource in ISO 8601 format. |
| apple_pay.expires_at | String | The expiration date of the resource in ISO 8601 format. |
| apple_pay.modified_at | String | The modification date of the resource in ISO 8601 format. |
| apple_pay.modified_by | String | The user or application that modified the resource. |
Resource Retrieved
apple-pay.retrieved
{
"apple_pay": {
"id": "...",
"type": "..."
}
}
| Name | Type | Description |
|---|
| apple_pay.id | String | The unique identifier of the resource. |
| apple_pay.type | String | The type of the resource. |
Resource Unlinked
apple-pay.unlinked
{
"apple_pay": {
"id": "...",
"type": "...",
"status": "...",
"created_by": "...",
"created_at": "...",
"expires_at": "...",
"modified_at": "...",
"modified_by": "..."
}
}
| Name | Type | Description |
|---|
| apple_pay.id | String | The unique identifier of the resource. |
| apple_pay.type | String | The type of the resource. |
| apple_pay.status | String | The status of the resource. |
| apple_pay.created_by | String | The creator of the resource. |
| apple_pay.created_at | String | The creation date of the resource in ISO 8601 format. |
| apple_pay.expires_at | String | The expiration date of the resource in ISO 8601 format. |
| apple_pay.modified_at | String | The modification date of the resource in ISO 8601 format. |
| apple_pay.modified_by | String | The user or application that modified the resource. |
Resource Updated