Skip to main content

Webhook Events

This page documents all webhook event types and their payloads.

Transaction Events

transaction.authorized

Sent when a transaction is authorized (pending hold placed).
{
  "id": "evt_abc123",
  "type": "transaction.authorized",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "transactionId": "txn_123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "userId": "user_abc",
    "amount": 2500,
    "currency": "USD",
    "merchantName": "DoorDash",
    "merchantCategory": "Restaurants",
    "merchantCategoryCode": "5812",
    "status": "pending",
    "attestationStatus": "attested"
  }
}

transaction.completed

Sent when a transaction settles (funds captured).
{
  "id": "evt_abc123",
  "type": "transaction.completed",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "transactionId": "txn_123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "userId": "user_abc",
    "amount": 2500,
    "authorizedAmount": 2500,
    "currency": "USD",
    "merchantName": "DoorDash",
    "status": "completed",
    "postedAt": 1703606400000
  }
}

transaction.declined

Sent when a transaction is declined.
{
  "id": "evt_abc123",
  "type": "transaction.declined",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "transactionId": "txn_123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "amount": 50000,
    "currency": "USD",
    "merchantName": "Suspicious Merchant",
    "status": "declined",
    "declinedReason": "insufficient_funds"
  }
}
Decline Reasons:
  • insufficient_funds - Credit limit exceeded
  • card_frozen - Card is frozen
  • card_closed - Card is closed
  • spending_limit_exceeded - Card or agent limit exceeded
  • blocked_merchant - Merchant on block list
  • blocked_mcc - Merchant category blocked
  • fraud_suspected - Fraud detection triggered

transaction.reversed

Sent when a refund is processed.
{
  "id": "evt_abc123",
  "type": "transaction.reversed",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "transactionId": "txn_123",
    "cardId": "card_456",
    "originalAmount": 2500,
    "reversedAmount": 2500,
    "currency": "USD",
    "merchantName": "DoorDash",
    "status": "reversed"
  }
}

Card Events

card.created

Sent when a new card is issued.
{
  "id": "evt_abc123",
  "type": "card.created",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "cardId": "card_456",
    "agentId": "agent_789",
    "userId": "user_abc",
    "type": "single",
    "purpose": "Order dinner on DoorDash",
    "last4": "4242",
    "status": "active"
  }
}

card.frozen

Sent when a card is frozen (manually or by policy).
{
  "id": "evt_abc123",
  "type": "card.frozen",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "cardId": "card_456",
    "agentId": "agent_789",
    "reason": "manual",
    "frozenBy": "api"
  }
}
Freeze Reasons:
  • manual - Frozen via API
  • agent_suspended - Parent agent was suspended
  • spending_limit_exceeded - Card limit exceeded
  • unattested_spend - Unattested transaction detected
  • merchant_drift - Unexpected merchant

card.closed

Sent when a card is closed.
{
  "id": "evt_abc123",
  "type": "card.closed",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "cardId": "card_456",
    "agentId": "agent_789",
    "reason": "single_use_completed",
    "closedBy": "system"
  }
}
Close Reasons:
  • manual - Closed via API
  • single_use_completed - Single-use card after successful transaction
  • ttl_expired - Card TTL reached
  • agent_deleted - Parent agent was deleted

card.expired

Sent when a card’s TTL is reached.
{
  "id": "evt_abc123",
  "type": "card.expired",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "cardId": "card_456",
    "agentId": "agent_789",
    "ttlDays": 30,
    "createdAt": 1700928000000
  }
}

Agent Events

agent.created

Sent when a new agent is created.
{
  "id": "evt_abc123",
  "type": "agent.created",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "agentId": "agent_789",
    "userId": "user_abc",
    "name": "checkout-bot",
    "status": "active"
  }
}

agent.suspended

Sent when an agent is suspended.
{
  "id": "evt_abc123",
  "type": "agent.suspended",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "agentId": "agent_789",
    "userId": "user_abc",
    "reason": "spending_limit_exceeded",
    "suspendedBy": "system"
  }
}

agent.limit_exceeded

Sent when an agent hits its spending limit.
{
  "id": "evt_abc123",
  "type": "agent.limit_exceeded",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "agentId": "agent_789",
    "userId": "user_abc",
    "spendingLimit": 50000,
    "currentSpend": 50250,
    "frequency": "perMonth",
    "action": "suspended"
  }
}

User Events

user.application.approved

Sent when a user’s KYC application is approved.
{
  "id": "evt_abc123",
  "type": "user.application.approved",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "userId": "user_abc",
    "email": "[email protected]",
    "applicationStatus": "approved"
  }
}

user.application.denied

Sent when a user’s KYC application is denied.
{
  "id": "evt_abc123",
  "type": "user.application.denied",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "userId": "user_abc",
    "email": "[email protected]",
    "applicationStatus": "denied",
    "reason": "identity_verification_failed"
  }
}

user.balance.updated

Sent when a user’s balance changes.
{
  "id": "evt_abc123",
  "type": "user.balance.updated",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "userId": "user_abc",
    "creditLimit": 10000,
    "spendingPower": 7500,
    "pendingCharges": 1500,
    "postedCharges": 1000,
    "balanceDue": 1000
  }
}

Deposit & Withdrawal Events

deposit.received

Sent when a deposit is received.
{
  "id": "evt_abc123",
  "type": "deposit.received",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "userId": "user_abc",
    "chainId": 8453,
    "tokenAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
    "amount": 10000,
    "transactionHash": "0x..."
  }
}

withdrawal.confirmed

Sent when a withdrawal is confirmed on-chain.
{
  "id": "evt_abc123",
  "type": "withdrawal.confirmed",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "withdrawalId": "withdrawal_xyz",
    "userId": "user_abc",
    "chainId": 8453,
    "amount": 5000,
    "recipientAddress": "0x...",
    "transactionHash": "0x..."
  }
}

3DS Events

challenge.requested

Sent when a 3DS challenge (OTP) is available.
{
  "id": "evt_abc123",
  "type": "challenge.requested",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "challengeId": "challenge_xyz",
    "cardId": "card_456",
    "transactionId": "txn_123",
    "otp": "123456",
    "expiresAt": 1703520300000,
    "deliveryMethod": "webhook"
  }
}
The OTP is included directly in the webhook payload. Use this to complete 3DS challenges in your browser automation.

Attestation Events

credential.accessed

Sent when card credentials are retrieved.
{
  "id": "evt_abc123",
  "type": "credential.accessed",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "accessEventId": "evt_xyz",
    "cardId": "card_456",
    "agentId": "agent_789",
    "exposureMode": "rawPan",
    "summary": "Order dinner on DoorDash",
    "expectedAmount": 2500
  }
}

spend.unattested

Sent when a transaction occurs without a recent attestation.
{
  "id": "evt_abc123",
  "type": "spend.unattested",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "transactionId": "txn_123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "amount": 2500,
    "merchantName": "Unknown Merchant",
    "lastCredentialAccess": null
  }
}

Intent Events

intent.matched

Sent when a transaction matches an intent within tolerance.
{
  "id": "evt_abc123",
  "type": "intent.matched",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "intentId": "int_xyz",
    "customerIntentId": "order-123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "transactionId": "txn_123",
    "summary": "Order lunch on DoorDash",
    "expectedAmount": 2500,
    "actualAmount": 2450,
    "expectedMerchant": "DoorDash",
    "actualMerchant": "DOORDASH",
    "matchResult": {
      "amountMatch": true,
      "merchantMatch": true
    }
  }
}

intent.mismatched

Sent when a transaction matches an intent but is outside tolerance.
{
  "id": "evt_abc123",
  "type": "intent.mismatched",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "intentId": "int_xyz",
    "customerIntentId": "order-123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "transactionId": "txn_123",
    "summary": "Order lunch on DoorDash",
    "expectedAmount": 2500,
    "tolerance": 500,
    "actualAmount": 5000,
    "expectedMerchant": "DoorDash",
    "actualMerchant": "DOORDASH",
    "matchResult": {
      "amountMatch": false,
      "merchantMatch": true
    }
  }
}
A mismatched intent indicates the agent spent more (or less) than declared, or at a different merchant. Investigate for potential misuse.

intent.expired

Sent when an intent expires without a matching transaction.
{
  "id": "evt_abc123",
  "type": "intent.expired",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "intentId": "int_xyz",
    "customerIntentId": "order-123",
    "cardId": "card_456",
    "agentId": "agent_789",
    "summary": "Order lunch on DoorDash",
    "expectedAmount": 2500,
    "ttlMinutes": 30,
    "createdAt": 1703518200000,
    "expiredAt": 1703520000000
  }
}

Dispute Events

dispute.created

Sent when a chargeback is initiated.
{
  "id": "evt_abc123",
  "type": "dispute.created",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "disputeId": "dispute_xyz",
    "transactionId": "txn_123",
    "cardId": "card_456",
    "amount": 2500,
    "reason": "fraud",
    "status": "open"
  }
}

dispute.resolved

Sent when a dispute is resolved.
{
  "id": "evt_abc123",
  "type": "dispute.resolved",
  "organizationId": "org_xyz",
  "createdAt": 1703520000000,
  "data": {
    "disputeId": "dispute_xyz",
    "transactionId": "txn_123",
    "amount": 2500,
    "outcome": "won",
    "status": "closed"
  }
}