Overview
Webhooks deliver real-time HTTP callbacks when events happen in your Conduit account. Instead of polling the API, register an endpoint and Conduit pushes events to you. Conduit guarantees at-least-once delivery — your endpoint may receive the same event more than once. Deduplicate byid. Delivery order is not guaranteed: events can arrive in a different order than they happened. To order the events of one transaction, use sequence (see Ordering transaction events).
Setting Up
1. Create an endpoint
curl -X POST https://api.conduit.financial/v2/webhooks/endpoints \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"url": "https://your-app.com/webhooks/conduit",
"subscription": {
"mode": "selected",
"eventTypes": ["application.approved", "application.rejected"]
}
}'
secret. Save it securely, it is only shown once and cannot be retrieved later.
subscription is a tagged union:
{ "mode": "all" }(the default ifsubscriptionis omitted) subscribes the endpoint to every event type.{ "mode": "selected", "eventTypes": ["..."] }subscribes only to the listed event types.eventTypesmust be non-empty.
PATCH /v2/webhooks/endpoints/:id with the same subscription shape.
2. Verify signatures
Every webhook request includes aX-Conduit-Signature header in the format:
t=<unix-timestamp>,v1=<hex-hmac>[,v1=<hex-hmac>]
v1 is HMAC-SHA256(<unix-timestamp>.<raw-body>, secret), computed over the raw request bytes before any JSON parsing.
A delivery normally carries a single v1. While you are rotating an endpoint’s signing secret, deliveries carry two v1 values for a grace period — one signed with your new secret and one with the previous one — so deliveries keep verifying while you roll your secret over. Verify by recomputing the digest for your secret and accepting the delivery if it matches any v1 value. Once the grace period ends, only the current secret is used.
We recommend rejecting deliveries where t is older than 300 seconds to guard against replay attacks.
The
whsec_ prefix is part of the HMAC key — do not strip it. Your
signing secret is shaped whsec_<64-hex>. Pass the FULL string verbatim,
including the whsec_ prefix, as the HMAC-SHA256 key. Stripping the prefix
produces a different digest and every valid delivery fails verification —
the failure mode is identical to a tampered signature (silent 401, no
diagnostic).Node.js / Bun
import { createHmac, timingSafeEqual } from "node:crypto";
/**
* Reference Node.js/Bun verifier. Other runtimes: use the equivalent
* HMAC-SHA256 + constant-time compare. `rawBody` MUST be the raw UTF-8
* bytes (do not parse JSON first). `t` is unix seconds. `secret` is the
* full per-endpoint string including the `whsec_` prefix — pass it as-is.
*/
function verifyWebhookSignature(rawBody, signatureHeader, secret) {
const pairs = signatureHeader.split(",").map((p) => p.split("="));
const t = pairs.find(([k]) => k === "t")?.[1];
// A delivery carries more than one v1 while you rotate the signing secret
// (the previous secret co-signs during the grace period). Collect every
// valid v1 and accept if your secret matches any of them. Each v1 must be a
// 64-char hex string (32 bytes); rejecting anything else protects
// timingSafeEqual from throwing on a length mismatch.
const signatures = pairs
.filter(([k, v]) => k === "v1" && /^[0-9a-f]{64}$/i.test(v ?? ""))
.map(([, v]) => v);
if (!t || signatures.length === 0) return false;
const tNum = Number(t);
if (!Number.isFinite(tNum)) return false;
const ageSeconds = Math.floor(Date.now() / 1000) - tNum;
if (ageSeconds > 300 || ageSeconds < 0) return false;
// `secret` is the full `whsec_...` string. Do NOT strip the prefix.
const expected = createHmac("sha256", secret)
.update(`${t}.${rawBody}`)
.digest("hex");
const expectedBuf = Buffer.from(expected, "hex");
return signatures.some((v1) =>
timingSafeEqual(expectedBuf, Buffer.from(v1, "hex")),
);
}
Python 3
import hmac
import time
from hashlib import sha256
def verify_webhook_signature(raw_body: bytes, signature_header: str, secret: str) -> bool:
"""
Reference Python verifier. ``raw_body`` MUST be the raw request bytes
(do not ``json.loads`` first). ``signature_header`` is the
``X-Conduit-Signature`` header value. ``secret`` is the full
per-endpoint string including the ``whsec_`` prefix — pass it as-is.
"""
pairs = [p.split("=", 1) for p in signature_header.split(",")]
t = next((v for k, v in pairs if k == "t"), None)
# A delivery carries more than one v1 while you rotate the signing secret
# (the previous secret co-signs during the grace period). Collect every
# valid v1 and accept if your secret matches any of them. Each v1 must be a
# 64-char lowercase hex string (32 bytes).
signatures = [
v
for k, v in pairs
if k == "v1"
and len(v) == 64
and all(c in "0123456789abcdef" for c in v.lower())
]
if not t or not signatures:
return False
try:
t_int = int(t)
except ValueError:
return False
age_seconds = int(time.time()) - t_int
if age_seconds > 300 or age_seconds < 0:
return False
# ``secret`` is the full ``whsec_...`` string. Do NOT strip the prefix.
expected = hmac.new(
secret.encode("utf-8"),
f"{t}.{raw_body.decode('utf-8')}".encode("utf-8"),
sha256,
).hexdigest()
return any(hmac.compare_digest(expected, v1) for v1 in signatures)
Always verify signatures before processing webhook payloads. Reject requests
where the signature does not match or the timestamp is stale.
Common verification mistakes
| Mistake | Symptom | Fix |
|---|---|---|
Stripping the whsec_ prefix before computing HMAC | Every valid delivery returns 401; logs look identical to a tampered request | Pass the secret verbatim — the prefix is key material, not a label |
| Parsing the request body as JSON before computing HMAC | Most deliveries pass, but any payload where field ordering or whitespace changes fails | Compute HMAC over the raw bytes received on the wire, before any deserialization |
Comparing digests with == | Subtle timing side-channel; nothing visibly broken | Use crypto.timingSafeEqual (Node) / hmac.compare_digest (Python) |
Trusting X-Conduit-Event for routing without verifying the signature first | Endpoint accepts forged events from anyone who can reach the URL | Verify the signature before reading any header or body field |
3. Rotate your signing secret
If your signing secret is leaked — or you rotate secrets on a schedule — call:POST /v2/webhooks/endpoints/:id/rotate
{ ...endpoint, "secret": "whsec_...", "signature": { ... } }). Store it immediately; it is never shown again.
This request requires an
Idempotency-Key header. Rotation is destructive —
it replaces your current secret — so a retried request that reused no key
could rotate twice and discard the secret you just deployed. With a key, a
retry replays the original response instead of rotating again. Use a fresh
key per intentional rotation.v1 values in X-Conduit-Signature (see Verify signatures). This lets you roll your verification over without dropping events:
- Call rotate and store the new secret.
- Deploy the new secret to your verifier. Because you accept any matching
v1, deliveries keep verifying throughout — under the old secret before you deploy, under the new one after. - Once the grace period ends, only the new secret signs. Any verifier still on the old secret stops verifying — which is the forcing function that completes the rollover.
Webhook Headers
Every webhook request includes these headers:| Header | Description |
|---|---|
Content-Type | application/json |
X-Conduit-Signature | t={unix},v1={hmac-hex} — timestamp + HMAC-SHA256 signature (a second v1 is present while a signing-secret rotation is in its grace period) |
X-Conduit-Delivery-Id | The wdl_ ID of the delivery. It is the same on every attempt and on a manual retry, so dedupe on the event id |
X-Conduit-Event | The event type (e.g., application.approved) |
Payload Format
{
"id": "evt_...",
"type": "application.approved",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"applicationId": "app_..."
}
}
data object varies by event type. Use the type field to determine how to process the payload.
| Field | Description |
|---|---|
id | Unique event ID. Use for client-side dedup. |
type | Event name (e.g. application.approved). |
createdAt | Timestamp the event was created (ISO 8601 UTC). |
apiVersion | Public API major version: "2". |
mode | "live" or "sandbox". Lets one endpoint receive both safely. |
data | Event-specific payload. See GET /v2/webhooks/event-types. |
Tracking transaction progress via webhooks
transaction.created carries a stage field — the same progress signal as GET /v2/transactions/:id’s
stage (see Progress: the stage field). Narrower
events that fire between creation and a terminal outcome (transaction.processing,
transaction.queue_position_changed, transaction.awaiting_signature,
transaction.awaiting_recovery_signature, transaction.awaiting_return_signature,
transaction.signature_collected, transaction.quorum_met, transaction.awaiting_sender_information) do not carry stage — the event itself is a more
specific progress signal than stage would add.
Terminal events (transaction.completed, .cancelled, .failed, .rejected) don’t carry it either since status
already conveys the outcome. If you need the current stage between those events, poll
GET /v2/transactions/:id or GET /v2/payouts/:id.
Every transaction.* event carries the same core fields: transactionId, customerId,
clientReferenceId when you set one, type, source, destination, linkedOrderId when the
transaction belongs to an order, and occurredAt. A retried delivery of an event sent before an event type carried type, source and destination arrives without them, so read them as optional. occurredAt is the time of the change the event
reports, under one name on every transaction and order event. An older name for the same time,
such as completedAt or succeededAt, stays beside it. transaction.failed,
transaction.cancelled and transaction.rejected also tell you how the transaction ended with
status, reasonCode and reasonMessage. transaction.rejected keeps status: "failed", the
status GET /v2/transactions/:id reports, and its reasonCode is compliance_rejected.
Ordering transaction events
Atransaction.completed can arrive before the transaction.processing that came first. Each
status event of a transaction (transaction.created, transaction.processing,
transaction.under_review, transaction.completed, transaction.failed, transaction.rejected,
transaction.cancelled) carries sequence: 1 for the first status event of the transaction, then
up by 1 for each next one. Apply the status events of a transaction in sequence order. An event
with a lower sequence than one you already applied is older than your current state, so do not
let it move the transaction back. A gap in sequence means that you did not receive an earlier
status event. The event can still be on its way, or it can be of an event type that your endpoint
does not subscribe to. GET /v2/transactions/:id is the source of truth for the current status:
read it when you see a gap.
Events that report no status change, such as transaction.awaiting_signature, carry no
sequence. Events sent before sequence existed carry none, and a transaction that was in
progress then starts its count at 1 on its next status event.
For a non-custodial payout,
transaction.awaiting_signature is discriminated by signingMode. A
wallet in the passkey_required mode carries the signer’s verificationUrl (use the latest
attempt’s URL and discard earlier ones); for how to obtain that link, re-fetch it if you missed
the delivery, and the one request pattern to avoid, see
Getting the signing link. A
wallet in a programmatic mode carries a signingRequestId — see
Machine-signer stamping — plus an optional verificationUrl
when its roster has a human passkey signer who may also approve on the verify page (a machine-only
roster omits it).Event Reference
Use
GET /v2/webhooks/event-types for the current list of available events,
including example payloads for each event type.Paired events
A single business transition can emit more than one event. See the per-event descriptions inGET /v2/webhooks/event-types for the canonical dedupe rule on each pair.
Delivery Lifecycle
Each webhook delivery goes through these statuses:| Status | Description |
|---|---|
pending | Queued for delivery or scheduled for retry |
processing | Currently being delivered |
succeeded | Your endpoint responded with a 2xx status |
failed | All 5 attempts failed |
Retries
A delivery gets 5 attempts in total. After a failed attempt, the next one waits:| After attempt | Delay |
|---|---|
| 1 | 30 seconds |
| 2 | 2 minutes |
| 3 | 15 minutes |
| 4 | 1 hour |
failed when attempt 5 fails, about 78 minutes after the first attempt. A manual retry works only on a failed delivery. A pending or processing delivery returns 422 WEBHOOK_DELIVERY_NOT_RETRYABLE. A retry starts a new run of 5 attempts:
curl -X POST https://api.conduit.financial/v2/webhooks/deliveries/wdl_.../retry \
-H "x-api-key: YOUR_API_KEY"
Managing Endpoints
| Operation | Endpoint |
|---|---|
| List endpoints | GET /v2/webhooks/endpoints |
| Get endpoint | GET /v2/webhooks/endpoints/:id |
| Update endpoint | PATCH /v2/webhooks/endpoints/:id |
| Delete endpoint | DELETE /v2/webhooks/endpoints/:id |
| List deliveries | GET /v2/webhooks/deliveries?endpointId=:id&status=failed&eventType=transaction.failed |
| Get delivery detail | GET /v2/webhooks/deliveries/:id |
DELETE on an endpoint that is already deleted returns 204. 404 WEBHOOK_ENDPOINT_NOT_FOUND means the id never existed in your organization.
The status query parameter accepts pending, processing, succeeded, or failed (case-insensitive); unknown values return 400. It takes one value: repeating the key returns 400. Filters compose with endpointId.
The eventType query parameter accepts an exact lowercase match against the event type (e.g. transaction.failed or order.failed). Unknown event types return an empty page. All three filters (endpointId, status, eventType) are optional and may be combined freely.
failureMessage symmetry contract
failureMessage is Conduit’s own wording. On transaction.failed and on the polled GET /v2/transactions/{id} it is the error catalog text for the failureCode, the same for every transaction that fails with that code, for every customer type, in live and sandbox builds. It never carries text from a bank, a chain, a travel-rule check or a sandbox simulator reason. order.failed.failureMessage follows the same rule for its reasonCode.
| Failure | failureCode | Polled GET and webhook failureMessage |
|---|---|---|
| A failure with a code, for example a bank return, a travel-rule rejection or a provider rejection | the code | the catalog text for the code |
| A failure with no code, or money sent to an order’s funding address | absent | This transaction could not be completed. Contact support if this persists. |
failureMessage. Branch on failureCode, never on the text. A transfer with no code is not completed: read GET /v2/transactions?type=deposit_return to see whether the funds went back.
Pausing an Endpoint
Setstatus: "disabled" (via PATCH /v2/webhooks/endpoints/:id) to stop receiving new deliveries on an endpoint. The endpoint is excluded from event fan-out — no new deliveries are enqueued. In-flight deliveries already queued at the moment of the flip continue to retry per the retry schedule and are not cancelled. Set it back to status: "active" to resume receiving new deliveries.
Best Practices
- Respond quickly. Return a 2xx status within 5 seconds. Process the event asynchronously after acknowledging receipt.
- Deduplicate. Use the event
idto detect and skip duplicate deliveries. - Verify signatures. Always validate
X-Conduit-Signaturebefore processing the payload. - Handle unknown events. Your endpoint may receive new event types as the API evolves. Return 2xx for events you don’t recognize — don’t reject them.
- Use HTTPS. Webhook endpoint URLs must use HTTPS.
application.approved
Fired when an application is approved.applicationType discriminates the variant — route on it: customer_onboarding — customer is now active; paired with customer.created (same applicationId, customerId, clientReferenceId); dedupe on (applicationId, customerId) if your handler reacts to either; idempotent re-approval does not re-emit the pair. virtual_account — virtual account has been created; asset carries the asset code/chain; the VA activates asynchronously and fires virtual_account.activated when ready. crypto_wallet — customer is now eligible for POST /v2/customers/:customerId/wallets/claim-non-custodial; no wallets have been provisioned yet. customer_update — the customer data change was accepted. organization_onboarding — organization is approved; no customerId is present.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "application.approved",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"applicationType": "customer_onboarding",
"applicationId": "app_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-onboarding-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
applicationType | enum: “customer_onboarding” | “organization_onboarding” | “virtual_account” | “crypto_wallet” | “customer_update” | Yes | Which ApplicationType approval this fires for. Use to route on your side. |
applicationId | string | Yes | Unique ID of the approved application. |
customerId | string | No | Customer associated with the approved application. Present for every applicationType except organization_onboarding (which has no customer at approval time). |
asset | object | No | Asset the virtual account will hold. Present only when applicationType is virtual_account. |
asset.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
asset.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
application.rejected
Fired when an application is rejected.applicationType discriminates the variant. A rejection is a decision on the submission, not on the customer: read resubmittable to tell a correctable rejection from a final one. failureCode (machine-readable) and failureMessage (human-readable) are present when a specific reason is available. A second application.rejected can arrive for the same applicationId when a late compliance result corrects the rejection. The correction changes failureMessage and resubmittable, and also failureCode on the variants that carry one — organization_onboarding does not. Do not deduplicate on applicationId, and take the event with the later createdAt as authoritative, because transport order is not guaranteed. customerId is present for virtual_account, crypto_wallet, and customer_update rejections (customer exists by rejection time); absent for organization_onboarding; optional for customer_onboarding (absent when rejection occurs before customer creation). For crypto_wallet: jurisdiction-ineligible requests are refused synchronously with 422 at request time and do not create an application row, so no webhook fires for that case.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "application.rejected",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"applicationType": "customer_onboarding",
"applicationId": "app_2xKjF9mQb7vN4hL1pR3w8t",
"failureCode": "rejected_by_ops",
"failureMessage": "Application does not meet compliance requirements",
"resubmittable": true,
"resubmissionGuidance": "Documents you already uploaded are still valid. Reuse the same documentIds in your new POST /v2/onboarding submission, and upload again only the documents you were asked to replace.",
"clientReferenceId": "ext-onboarding-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
applicationType | enum: “customer_onboarding” | “organization_onboarding” | “virtual_account” | “crypto_wallet” | “customer_update” | Yes | Which ApplicationType rejection this fires for. Use to route on your side. |
applicationId | string | Yes | Unique ID of the rejected application. |
customerId | string | No | Customer associated with this application. Required for virtual_account, crypto_wallet, and customer_update rejections (customer exists by rejection time). Absent for organization_onboarding. Optional for customer_onboarding (absent when rejection occurs before customer creation). |
asset | object | No | Asset the virtual account would have held. Present only when applicationType is virtual_account. |
asset.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
asset.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat |
failureCode | enum: “rejected_by_ops” | “compliance_denied” | No | Machine-readable failure code identifying the rejection category. Mirrors failureCode on GET /v2/applications/:id. |
failureMessage | string | No | Human-readable message intended for display to your end user, if provided. |
resubmittable | boolean | No | Whether the applicant can try again. For organization_onboarding: true means a fresh draft was opened and the organization can edit and resubmit the same form; false means the rejection was final and the form stays closed. For every other applicationType: true means a corrected new application will be considered — submit a fresh one; false means the decision is final and a resubmission cannot succeed. For those types the value mirrors resubmittable on GET /v2/applications/:id. |
resubmissionGuidance | string | No | Integrator guidance for the resubmission. Present only when applicationType is customer_onboarding and resubmittable is true. A fixed line — display or log it, do not parse it. Mirrors resubmissionGuidance on GET /v2/applications/:id. |
reviewQuestions | array of string | No | Questions to address in the resubmission. Present only when applicationType is customer_onboarding, resubmittable is true and Conduit asks for more information. Mirrors reviewQuestions on GET /v2/applications/:id. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
claim.completed
Fired when a non-custodial claim resolves: every roster signer has enrolled and the wallets are activated. Carries the claimId returned by POST /v2/customers/:id/wallets/claim-non-custodial plus the activated wallet IDs, so you can close the loop on a claim you were polling.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "claim.completed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"claimId": "wcc_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletIds": [
"wlt_2xKjF9mQb7vN4hL1pR3w8t"
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
claimId | string | Yes | The claim returned by POST /wallets/claim-non-custodial. |
customerId | string | Yes | Customer whose non-custodial claim resolved. |
walletIds | array of string | Yes | Wallets the claim created. A wallet on a chain that needs a one-time on-chain setup (Stellar) reads pending until wallet.created fires for it. |
claim.failed
Fired when a non-custodial claim fails during provisioning — after the claim was accepted (202). Carries the claimId and a human-readable failure reason to surface to your user. (Synchronous validation failures — roster/threshold/jurisdiction — are returned inline on the POST as a 4xx and do NOT fire this webhook.){
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "claim.failed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"claimId": "wcc_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"failureReason": "Wallet provisioning could not be completed. Please try the claim again; if it keeps failing, contact support."
}
}
| Field | Type | Required | Description |
|---|---|---|---|
claimId | string | Yes | The claim returned by POST /wallets/claim-non-custodial. |
customerId | string | Yes | Customer whose non-custodial claim failed. |
failureReason | string | Yes | Human-readable reason the claim could not be provisioned. |
crypto_wallet.completed
Fired when the customer’s end user has finished onboarding their non-custodial wallets and the wallets are ready to receive funds. Carries the customerId; fetch the wallets with GET /v2/customers/:id/wallets. To close the loop on a specific claim with the activated wallet IDs, use claim.completed.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "crypto_wallet.completed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer whose crypto wallet onboarding has completed. |
customer.created
Fired when a customer is created after onboarding approval. Paired with application.approved (applicationType=customer_onboarding) on the first approval (same applicationId, customerId, clientReferenceId); on idempotent re-approval the customer already exists so the pair is not re-emitted. Dedupe on (applicationId, customerId) if your handler reacts to either.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "customer.created",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"applicationId": "app_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-onboarding-001",
"type": "business"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Unique ID of the newly created customer. |
applicationId | string | Yes | Onboarding application that triggered customer creation. |
clientReferenceId | string | No | Caller-supplied external reference from the onboarding application. |
type | enum: “business” | “individual” | Yes | Whether the customer is an individual or a business. |
customer.restricted
Fired when a restriction is placed on a customer. The customer is blocked from initiating the affected money-movement capabilities. A full freeze also blocks the customer from opening new accounts, wallets or payout destinations. The restriction reason and type are internal-only and are never included. Not every restriction type emits this event, so do not treat the event stream as a complete record of every hold.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "customer.restricted",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"organizationId": "org_2xKjF9mQb7vN4hL1pR3w8t"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer on whom the restriction was placed. |
organizationId | string | Yes | Organization the customer belongs to. |
idv_link.created
Fired when a hosted identity-verification link is created for a person on an application — one event per created verification session, so a person who is re-verified receives another event. Subscribe to this event to deliver the link through your own channels. It is emitted regardless of whether the person is also emailed their link directly; that is governed separately and does not affect this event.url is resumable — not single-use, it survives a refresh and a hand-off to a second device, and stays valid as long as the verification session does. Treat it as a bearer secret and do not log it. shortUrl is deprecated and will be removed in a future release: it is a separate one-time link rather than a shortening of url, it opens only once, and it stops working roughly five minutes after the person opens it — prefer url, and treat it as a bearer secret too. Person referenceIds are listed on the application (persons[]), and a fresh link can be fetched while the verification is still in progress via POST /v2/applications//persons//idv-link.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "idv_link.created",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"applicationId": "app_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-onboarding-001",
"personReferenceId": "app_2xKjF9mQb7vN4hL1pR3w8t:a4K",
"url": "https://verify.example.com/session?inquiry-id=inq_example&session-token=example",
"shortUrl": "https://vfy.example.com/abc123"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
applicationId | string | Yes | Application the person belongs to. |
customerId | string | No | Customer associated with the application, when one exists at inquiry-creation time. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
personReferenceId | string | Yes | Stable reference of the person this link verifies (ownership.persons[].referenceId). |
url | string | Yes | Hosted identity-verification URL the person opens. Resumable — not single-use, survives a refresh and a second device, and stays valid as long as the inquiry does. A bearer credential: deliver it to the person out-of-band and do not log it. |
shortUrl | string | Yes | Deprecated — prefer url. A short one-time link, and a different credential rather than a shortening of url: it opens once, and it stops working roughly five minutes after the person opens it. Also a bearer credential: deliver it to the person out-of-band and do not log it. Kept for existing integrations; it will be removed in a future release. |
order.cancelled
Fired when a pending order is cancelled — either by the sweep job (reason=expired, when lock_expires_at elapses) or by the client (reason=client_cancelled, via POST /v2/orders/:id/cancel). On a deposit-funded order a transfer that reached the funding address before lock_expires_at meets that deadline, so this fires only once no such transfer is still being checked — which can be well after lock_expires_at. That covers a transfer decided without crediting, and one that credited less than totalDebit.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "order.cancelled",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"orderId": "ord_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-order-1",
"reason": "client_cancelled",
"cancelledAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | Yes | Unique ID of the cancelled order. |
customerId | string | Yes | Customer who placed this order. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
reason | enum: “expired” | “client_cancelled” | Yes | Whether the order was cancelled by the client (client_cancelled) or expired due to elapsed lock time (expired). Matches the cancellationReason field on GET /v2/orders/:id. |
cancelledAt | string | Yes | ISO-8601 timestamp when the order was cancelled. |
occurredAt | string | Yes | ISO-8601 time of the change this event reports, under the one name every order and transaction event uses. It equals the event’s own time field. |
order.created
Fired when an order is created via POST/v2/orders. The order is in pending status with the rate locked until lockExpiresAt; creation never checks or reserves the source’s available balance, so an order can be created before its source is funded regardless of autoExecute. The order will not move funds until execution is claimed — either explicitly via POST /v2/orders/:id/execute (one immediate attempt, retryable after funding if it returns 422 INSUFFICIENT_FUNDS), or automatically by the platform once the source’s available balance covers totalDebit (principal plus fees), if autoExecute is true. If the lock expires before execution is claimed, the expiry sweep cancels it and order.cancelled fires with reason: expired — funding after that point does not revive it. When the order was created without an explicit source, depositInstructions carries the address to fund it at; that order auto-executes once the deposit lands, and the lock expiry is the funding deadline instead of a rate lock. When the order redeemed a POST /v2/quotes option, quoteOptionId carries the id of that option, so you can join the order back to the price your customer accepted without a GET. A redemption always names an explicit source, so quoteOptionId and depositInstructions never appear on the same event.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "order.created",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"orderId": "ord_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-order-1",
"type": "offramp",
"sourceAssetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "10000.000000"
},
"destinationAssetAmount": {
"code": "USD",
"amount": "9995.00"
},
"lockExpiresAt": "2026-01-16T09:30:00.000Z",
"autoExecute": true,
"createdAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z",
"quoteOptionId": "qop_2xKjF9mQb7vN4hL1pR3w8t"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | Yes | Unique ID of the created order. |
customerId | string | Yes | Customer who placed this order. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “onramp” | “offramp” | “conversion” | “fiat_conversion” | Yes | Direction of the order (onramp, offramp, conversion, or fiat_conversion). |
sourceAssetAmount | object | Yes | Source asset and amount that will be debited from the customer when the order executes. |
sourceAssetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
sourceAssetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
sourceAssetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destinationAssetAmount | object | Yes | Destination asset and amount the customer will receive when the order executes. |
destinationAssetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destinationAssetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destinationAssetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
lockExpiresAt | string | Yes | ISO-8601 timestamp when the order’s rate lock expires; after this unclaimed pending orders are eligible for auto-cancel with reason expired. When depositInstructions is present (a deposit-funded order), this is the funding deadline rather than a rate lock. |
autoExecute | boolean | Yes | Whether the order will auto-execute when source funds land (true) or requires an explicit POST /v2/orders/:id/execute (false). |
createdAt | string | Yes | ISO-8601 timestamp when the order was created. |
occurredAt | string | Yes | ISO-8601 time of the change this event reports, under the one name every order and transaction event uses. It equals the event’s own time field. |
quoteOptionId | string | No | Present when this order redeemed a POST /v2/quotes option — the id of the option it consumed. Absent on an order priced from amount and lockSide. |
depositInstructions | array of object | No | Where to send funds to fund this order — the same array-of-blocks shape a virtual account’s depositInstructions uses. Present only when the order was created without an explicit source, and then always exactly one crypto_address block. Absent on every other order. |
depositInstructions[].type | ”crypto_address” | Yes | Discriminator for this deposit block: send crypto to an on-chain address. |
depositInstructions[].address | string | Yes | Conduit-managed deposit address for funding this order. |
depositInstructions[].chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | Yes | Blockchain network to send the funding deposit on. Sending on any other chain will not fund the order. |
depositInstructions[].asset | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code to send. |
depositInstructions[].expiresAt | string | Yes | Funding deadline; the order is cancelled if unfunded by this time. |
order.failed
Fired when an order cannot execute or execution reaches a terminal failure. This includes pending auto-execute ONRAMP orders whose fiat source deposit terminates without crediting the customer — frozen, returned, or terminated before credit.reasonCode identifies the customer-facing failure category: insufficient_funds (source funds insufficient at execution time; money in frozen, including money a bank block holds, does not count), insufficient_onchain_balance (the source wallet holds no or insufficient real on-chain balance for a crypto source transfer — fund the wallet with real testnet crypto via an onramp or a faucet, then retry), source_account_unavailable (the source balance is held on a bank account that is not active, for example closed or still in approval, so no funds moved; retry will not help until the balance is on an active account — contact support), provider_unavailable (transient rail/provider unavailability — retry may succeed), provider_rejected (provider or screening declined the leg, including source-deposit rejection on auto-execute ONRAMP orders; retry will not help — submit with a different recipient or funding source), internal_error (Conduit-side failure — contact support), cancelled (execution cancelled mid-flight).
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "order.failed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"orderId": "ord_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-order-1",
"reasonCode": "provider_rejected",
"failedAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | Yes | Unique ID of the order that failed to execute. |
customerId | string | Yes | Customer who placed this order. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
reasonCode | enum: “insufficient_funds” | “provider_unavailable” | “provider_rejected” | “internal_error” | “cancelled” | “insufficient_onchain_balance” | “source_account_unavailable” | Yes | Public failure category. insufficient_funds (source funds insufficient at execution time; money in frozen, including money a bank block holds, does not count), insufficient_onchain_balance (the source wallet holds no or insufficient real on-chain balance for a crypto source transfer — fund the wallet with real testnet crypto via an onramp or a faucet, then retry), source_account_unavailable (the source balance is held on a bank account that is not active, for example closed or still in approval, so no funds moved; retry will not help until the balance is on an active account — contact support), provider_unavailable (transient provider/rail unavailability — retry may succeed), provider_rejected (provider or screening declined the leg, including source-deposit rejection on auto-execute ONRAMP orders; retry will not help — submit with a different recipient or funding source), internal_error (Conduit-side failure — contact support), cancelled (execution cancelled mid-flight). |
failureMessage | string | No | Human-readable description of reasonCode: the public error catalog text for the code. It can be absent; GET /v2/orders/{id} returns it for a failed order. Sandbox simulators never change it: the reason body on orders/:id/simulate/conversion-failed does not appear here. No provider or compliance text appears here. |
failedAt | string | Yes | ISO-8601 timestamp when execution failure was recorded. |
occurredAt | string | Yes | ISO-8601 time of the change this event reports, under the one name every order and transaction event uses. It equals the event’s own time field. |
order.succeeded
Fired when an order completes successfully — the source amount has been debited from the customer and the destination amount has been credited and is available to spend. Carries the spawnedtransactionId (and txHash when a chain leg ran) so integrators can reconcile and link back to the underlying transaction without a GET round-trip.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "order.succeeded",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"orderId": "ord_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-order-1",
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"txHash": "0x7e0fb8d288a8d0058c6940f9327592f543415065a9180728688b51e0da44481c",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"status": "succeeded",
"sourceAssetAmount": {
"code": "USD",
"amount": "10000.00"
},
"destinationAssetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "9995.000000"
},
"totalDebit": {
"code": "USD",
"amount": "10010.00"
},
"payoutAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "9995.000000"
},
"fees": [
{
"type": "fixed",
"assetAmount": {
"code": "USD",
"amount": "10.00"
},
"owner": "conduit"
}
],
"markup": {
"bps": 25,
"assetAmount": {
"code": "USD",
"amount": "25.00"
}
},
"succeededAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z",
"executionTrigger": "client"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
orderId | string | Yes | Unique ID of the succeeded order. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
transactionId | string | null | Yes | ID of the transactions row this order spawned. Use to GET the underlying transaction for per-leg detail. |
txHash | string | null | Yes | On-chain transaction hash from the order’s chain leg (destination leg for ONRAMP, source leg for OFFRAMP). Null when the order has no chain leg or the hash is not yet known. |
customerId | string | Yes | Customer who placed this order. |
status | ”succeeded” | Yes | Terminal status. Always succeeded on this event; failures fire order.failed instead. |
sourceAssetAmount | object | Yes | Conversion principal in source-asset terms (excludes the fee). totalDebit = sourceAssetAmount + fees is what’s actually debited from the customer. |
sourceAssetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
sourceAssetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
sourceAssetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destinationAssetAmount | object | Yes | Destination asset and amount credited to the customer (equals sourceAssetAmount × rate). |
destinationAssetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destinationAssetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destinationAssetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
totalDebit | object | Yes | Total amount debited from the customer in source-asset terms (sourceAssetAmount + fees). |
totalDebit.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
totalDebit.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
totalDebit.amount | string | Yes | Decimal string, asset-precision rounded |
payoutAmount | object | Yes | Alias for destinationAssetAmount; kept for reconciliation tooling that pre-dates the symmetric amount semantics. |
payoutAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
payoutAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
payoutAmount.amount | string | Yes | Decimal string, asset-precision rounded |
fees | array of object | Yes | Fee components applied to this order. |
fees[].type | ”fixed” | Yes | Pricing model used to compute the fee. |
fees[].assetAmount | object | Yes | Fee amount with its asset. |
fees[].assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
fees[].assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
fees[].assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
fees[].owner | enum: “conduit” | “you” | Yes | Who this charge belongs to. conduit is Conduit’s own fee. you is a flat margin you declared with markupAmount, which Conduit collects from your customer and accrues to you. Present on every entry. |
markup | object | No | Present on an order whose declared margin is at least one minor unit of the source asset. Your own margin, accrued to you at settlement and reported on GET /v2/markup/balances. The markupBps part rides the quoted rate, so it is absent from fees and from totalDebit; a markupAmount part is a line item in fees carrying owner: "you", and it does move totalDebit. |
markup.bps | number | No | The percentage margin you declared on the order, in basis points. Absent when you declared only a flat amount. |
markup.flatAmount | object | No | The flat margin you declared on the order, in its source asset. Absent when you declared only a percentage. |
markup.flatAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
markup.flatAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
markup.flatAmount.amount | string | Yes | Decimal string, asset-precision rounded |
markup.assetAmount | object | Yes | Total amount accrued to you, in the order’s source asset: the percentage part plus the flat part. |
markup.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
markup.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
markup.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
succeededAt | string | Yes | ISO-8601 timestamp when the order finished executing. |
occurredAt | string | Yes | ISO-8601 time of the change this event reports, under the one name every order and transaction event uses. It equals the event’s own time field. |
executionTrigger | enum: “client” | “auto” | Yes | Whether execution was triggered by the client or automatically by the platform. |
organization.activated
Fired when an organization is activated{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "organization.activated",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"organizationName": "Acme Corp"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
organizationName | string | Yes | Display name of the organization that was activated. |
organization.restricted
Fired when a restriction is placed on an organization. Every customer under the org is blocked from the affected capabilities. The reason and type are internal-only. Not every restriction type emits this event, so do not treat the event stream as a complete record of every hold.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "organization.restricted",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"organizationId": "org_2xKjF9mQb7vN4hL1pR3w8t"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
organizationId | string | Yes | Organization on which the restriction was placed. Every customer under this org is affected. |
rfi.cancelled
Fired when a published request for information is cancelled. Fetch details via GET /v2/rfis/.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "rfi.cancelled",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"rfiId": "rfi_2xKjF9mQb7vN4hL1pR3w8t",
"subjects": [
{
"subjectType": "transaction",
"subjectId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
rfiId | string | Yes | Unique ID of the request for information. Fetch details via GET /v2/rfis/. |
subjects | array of object | No | What the request is about — one entry per subject, in the same shape as subjects on GET /v2/rfis/. |
subjects[].subjectType | enum: “customer” | “transaction” | “organization” | “application” | Yes | What the request is about. |
subjects[].subjectId | string | Yes | Identifier of the subject. Its prefix follows subjectType: cus_ for a customer, txn_ for a transaction, app_ for an application, org_ for an organization. |
subjects[].customerId | string | No | The customer the transaction or application belongs to. Present when subjectType is transaction, or application for a customer’s application. |
rfi.deadline_extended
Fired when compliance extends the response deadline on an open request for information. Fetch the new due date via GET /v2/rfis/.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "rfi.deadline_extended",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"rfiId": "rfi_2xKjF9mQb7vN4hL1pR3w8t",
"subjects": [
{
"subjectType": "transaction",
"subjectId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
rfiId | string | Yes | Unique ID of the request for information. Fetch details via GET /v2/rfis/. |
subjects | array of object | No | What the request is about — one entry per subject, in the same shape as subjects on GET /v2/rfis/. |
subjects[].subjectType | enum: “customer” | “transaction” | “organization” | “application” | Yes | What the request is about. |
subjects[].subjectId | string | Yes | Identifier of the subject. Its prefix follows subjectType: cus_ for a customer, txn_ for a transaction, app_ for an application, org_ for an organization. |
subjects[].customerId | string | No | The customer the transaction or application belongs to. Present when subjectType is transaction, or application for a customer’s application. |
rfi.more_info_requested
Fired when compliance requests more information on an open or responded request for information, or reopens a resolved one, opening a new round. Fetch details via GET /v2/rfis/.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "rfi.more_info_requested",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"rfiId": "rfi_2xKjF9mQb7vN4hL1pR3w8t",
"subjects": [
{
"subjectType": "transaction",
"subjectId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
rfiId | string | Yes | Unique ID of the request for information. Fetch details via GET /v2/rfis/. |
subjects | array of object | No | What the request is about — one entry per subject, in the same shape as subjects on GET /v2/rfis/. |
subjects[].subjectType | enum: “customer” | “transaction” | “organization” | “application” | Yes | What the request is about. |
subjects[].subjectId | string | Yes | Identifier of the subject. Its prefix follows subjectType: cus_ for a customer, txn_ for a transaction, app_ for an application, org_ for an organization. |
subjects[].customerId | string | No | The customer the transaction or application belongs to. Present when subjectType is transaction, or application for a customer’s application. |
rfi.published
Fired when a request for information is published to your organization. Fetch details via GET /v2/rfis/.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "rfi.published",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"rfiId": "rfi_2xKjF9mQb7vN4hL1pR3w8t",
"subjects": [
{
"subjectType": "transaction",
"subjectId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
rfiId | string | Yes | Unique ID of the request for information. Fetch details via GET /v2/rfis/. |
subjects | array of object | No | What the request is about — one entry per subject, in the same shape as subjects on GET /v2/rfis/. |
subjects[].subjectType | enum: “customer” | “transaction” | “organization” | “application” | Yes | What the request is about. |
subjects[].subjectId | string | Yes | Identifier of the subject. Its prefix follows subjectType: cus_ for a customer, txn_ for a transaction, app_ for an application, org_ for an organization. |
subjects[].customerId | string | No | The customer the transaction or application belongs to. Present when subjectType is transaction, or application for a customer’s application. |
rfi.resolved
Fired when a request for information is resolved. Fetch details via GET /v2/rfis/.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "rfi.resolved",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"rfiId": "rfi_2xKjF9mQb7vN4hL1pR3w8t",
"subjects": [
{
"subjectType": "transaction",
"subjectId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
rfiId | string | Yes | Unique ID of the request for information. Fetch details via GET /v2/rfis/. |
subjects | array of object | No | What the request is about — one entry per subject, in the same shape as subjects on GET /v2/rfis/. |
subjects[].subjectType | enum: “customer” | “transaction” | “organization” | “application” | Yes | What the request is about. |
subjects[].subjectId | string | Yes | Identifier of the subject. Its prefix follows subjectType: cus_ for a customer, txn_ for a transaction, app_ for an application, org_ for an organization. |
subjects[].customerId | string | No | The customer the transaction or application belongs to. Present when subjectType is transaction, or application for a customer’s application. |
rfi.response_submitted
Fired when a client response to a request for information is stored. Fires again each time the client adds information to the same round. Fetch details via GET /v2/rfis/.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "rfi.response_submitted",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"rfiId": "rfi_2xKjF9mQb7vN4hL1pR3w8t",
"subjects": [
{
"subjectType": "transaction",
"subjectId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t"
}
]
}
}
| Field | Type | Required | Description |
|---|---|---|---|
rfiId | string | Yes | Unique ID of the request for information. Fetch details via GET /v2/rfis/. |
subjects | array of object | No | What the request is about — one entry per subject, in the same shape as subjects on GET /v2/rfis/. |
subjects[].subjectType | enum: “customer” | “transaction” | “organization” | “application” | Yes | What the request is about. |
subjects[].subjectId | string | Yes | Identifier of the subject. Its prefix follows subjectType: cus_ for a customer, txn_ for a transaction, app_ for an application, org_ for an organization. |
subjects[].customerId | string | No | The customer the transaction or application belongs to. Present when subjectType is transaction, or application for a customer’s application. |
transaction.awaiting_recovery_signature
Fired when the payee’s receive policy held a crypto payout from a non-custodial wallet instead of crediting the payee. The wallet’s signers must approve one return of the held funds to the sending wallet (returnAddress). Conduit never signs this return alone. The payload is discriminated by signingMode, as transaction.awaiting_signature is. When the signers approve and the funds are back, the payout ends failed with rail_policy_rejected. If the signers decline or the request expires, the payout stays held and Conduit’s operators handle it.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.awaiting_recovery_signature",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"signingMode": "passkey_required",
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
},
"returnAddress": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"verificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"requiredApprovals": 2,
"occurredAt": "2026-01-15T09:50:00.000Z",
"expiresAt": "2026-01-15T10:05:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the held payout transaction. |
customerId | string | Yes | Customer who sent the payout. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 timestamp when the return started to wait for signature. |
assetAmount | object | Yes | Amount and asset the payee’s receive policy holds. The full amount returns to returnAddress. |
assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
returnAddress | string | Yes | Address of the sending wallet. The held funds return to this address. |
requiredApprovals | integer | Yes | M — signer stamps required to approve the return. |
expiresAt | string | Yes | ISO-8601 deadline for this signing request. If the signers do not approve by this time, the payout stays held and Conduit’s operators handle it. |
signingMode | enum: “passkey_required” | “programmatic” | “programmatic_unattended” | Yes | Discriminates the payload variant (one of passkey_required, programmatic, programmatic_unattended). See the per-variant fields below. |
verificationUrl | string | Yes when signingMode = passkey_required; optional otherwise | Conduit-hosted URL the fintech routes its human signers to for approval. |
signingRequestId | string | Yes when signingMode = programmatic or programmatic_unattended | Signing-request id. Your server discovers the signing details with GET /v2/signing-requests/ and approves via POST /v2/signing-requests//approve or rejects via POST /v2/signing-requests//reject. Present only when signingMode is programmatic or programmatic_unattended. |
transaction.awaiting_return_signature
Fired when the signers of a non-custodial wallet must approve the return of a coin that Conduit does not support. The wallet received the coin, and Conduit did not credit it. The return sends the full amount back to the address that sent it (destinationAddress). Conduit never signs this return alone. The payload is discriminated by signingMode, as transaction.awaiting_signature is. If the signers do not approve before expiresAt, Conduit opens a new request and sends this event again with an incremented attempt. If the signers decline, or the last attempt expires, Conduit’s operators handle the return. This is not a payout: do not approve it with the logic that approves payouts.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.awaiting_return_signature",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"signingMode": "passkey_required",
"transactionId": "txn_3mPq8RtV2wXy5zA7bC9dE1",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"type": "deposit_return",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "ETH",
"chain": "ethereum",
"amount": "0.050000000000000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "ETH",
"chain": "ethereum",
"amount": "0.050000000000000000"
}
},
"assetAmount": {
"code": "ETH",
"chain": "ethereum",
"amount": "0.050000000000000000"
},
"destinationAddress": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"verificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"requiredApprovals": 2,
"occurredAt": "2026-01-15T09:50:00.000Z",
"expiresAt": "2026-01-15T10:05:00.000Z",
"attempt": 1
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the return transaction that waits for signature. |
customerId | string | Yes | Customer whose wallet holds the coin. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 timestamp when the return started to wait for signature. |
assetAmount | object | Yes | Amount and coin that return to destinationAddress. |
assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destinationAddress | string | Yes | Address that sent the coin. The coin returns to this address. |
requiredApprovals | integer | Yes | M — signer stamps required to approve the return. |
expiresAt | string | Yes | ISO-8601 deadline for this signing attempt. |
attempt | integer | Yes | Signing-attempt counter for this return. Treat the latest attempt as authoritative and dedupe redeliveries on (transactionId, attempt). |
signingMode | enum: “passkey_required” | “programmatic” | “programmatic_unattended” | Yes | Discriminates the payload variant (one of passkey_required, programmatic, programmatic_unattended). See the per-variant fields below. |
verificationUrl | string | Yes when signingMode = passkey_required; optional otherwise | Conduit-hosted URL the fintech routes its human signers to for approval. |
signingRequestId | string | Yes when signingMode = programmatic or programmatic_unattended | Signing-request id. Your server discovers the signing details with GET /v2/signing-requests/ and approves via POST /v2/signing-requests//approve or rejects via POST /v2/signing-requests//reject. Present only when signingMode is programmatic or programmatic_unattended. |
transaction.awaiting_sender_information
Fired when a deposit is parked waiting for sender information for the source address. Payload carries the sourceAddress (null when no on-chain sender could be attributed) and an expiresAt deadline — after it the deposit stays held, and Conduit compliance may return it to the sender. Chain is on assetAmount.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.awaiting_sender_information",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-deposit-1",
"type": "deposit",
"source": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"sourceAddress": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
},
"detectedAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z",
"expiresAt": "2026-02-14T09:30:00.000Z",
"daysRemaining": 30,
"deadlineAt": "2026-02-14T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the parked deposit transaction. |
customerId | string | Yes | Customer who received the deposit. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 timestamp when the deposit was parked because the source address was not registered. |
sourceAddress | string | null | Yes | Normalized sender address the fintech must register. Null when Conduit could not attribute an on-chain sender to the deposit — submit the originator’s identity via POST /v2/transactions//sender-information exactly as you would otherwise; only the pre-registration shortcut is unavailable. |
assetAmount | object | Yes | Amount and asset of the parked deposit. |
assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
detectedAt | string | Yes | ISO-8601 timestamp when the deposit was first detected on-chain. |
expiresAt | string | Yes | ISO-8601 timestamp. The date by which Conduit asks for sender information. The deposit stays held after it, and Conduit compliance may then return it to the sender. |
daysRemaining | integer | null | Yes | Days remaining before the sender-info deadline. Re-emitted as the deadline approaches with the updated value; null on the final terminal-reached emission. |
deadlineAt | string | Yes | ISO-8601 timestamp. The date by which Conduit asks for sender information. The deposit stays held after it, and Conduit compliance may then return it to the sender. |
transaction.awaiting_signature
Fired when the customer’s signing roster must approve before broadcast — on a payout, or on the source transfer of a conversion from a non-custodial wallet. The payload is discriminated bysigningMode. passkey_required carries the shared verificationUrl (Conduit-hosted approval page the fintech distributes to its human signers). programmatic / programmatic_unattended carry a signingRequestId — a machine integration discovers the signing details with GET /v2/signing-requests/{id} and approves via POST /v2/signing-requests/{id}/approve or rejects via POST /v2/signing-requests/{id}/reject. A programmatic payload ALSO carries an optional verificationUrl when the wallet’s roster has an active passkey signer: that human signer is a member of the signing quorum and may approve the payout on the verify page alongside the machine signers. The verificationUrl is omitted for a machine-only roster. If a signing window expires before quorum, Conduit rebuilds the request (fresh nonce/fees) and re-fires this event with an incremented attempt; treat the latest attempt as authoritative. After the final attempt expires the payout fails with user_signature_expired (a conversion fails via order.failed).
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.awaiting_signature",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"signingMode": "passkey_required",
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
},
"destinationAddress": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"verificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"requiredApprovals": 2,
"occurredAt": "2026-01-15T09:30:00.000Z",
"expiresAt": "2026-01-15T09:45:00.000Z",
"attempt": 1
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the parked payout transaction. |
customerId | string | Yes | Customer initiating the payout. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 timestamp when the payout was parked awaiting signature. |
assetAmount | object | Yes | Amount and asset of the pending payout. |
assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destinationAddress | string | Yes | On-chain destination address for the payout. |
requiredApprovals | integer | Yes | M — signer stamps required to authorize, frozen at prepare time. |
expiresAt | string | Yes | ISO-8601 deadline for THIS signing attempt. If the roster does not sign by this time the payout is automatically re-offered (a new event with an incremented attempt); it only fails after the final attempt’s window elapses. |
attempt | integer | Yes | Signing-attempt counter for this payout. 1 on the first request; the event re-fires with an incrementing attempt each time the prior window expires and a fresh request is issued. Treat the latest attempt as authoritative and dedupe redeliveries on (transactionId, attempt). |
signingMode | enum: “passkey_required” | “programmatic” | “programmatic_unattended” | Yes | Discriminates the payload variant (one of passkey_required, programmatic, programmatic_unattended). See the per-variant fields below. |
verificationUrl | string | Yes when signingMode = passkey_required; optional otherwise | Conduit-hosted URL the fintech routes its human signers to for approval. |
signingRequestId | string | Yes when signingMode = programmatic or programmatic_unattended | Signing-request id. Your server discovers the signing details with GET /v2/signing-requests/ and approves via POST /v2/signing-requests//approve or rejects via POST /v2/signing-requests//reject. Present only when signingMode is programmatic or programmatic_unattended. |
transaction.awaiting_user_signature
Deprecated — superseded bytransaction.awaiting_signature; still delivered during a compatibility window and removed in a future release. Fired when the customer’s signing roster must approve before broadcast — on a payout, or on the source transfer of a conversion from a non-custodial wallet. Payload carries the single shared verificationUrl (Conduit-hosted approval page distributed by the fintech to its signers), expiresAt, and attempt. If a signing window expires before quorum, Conduit rebuilds the request (fresh nonce/fees, a new verificationUrl) and re-fires this event with an incremented attempt; clients should always treat the latest verificationUrl as authoritative and discard prior links. After the final attempt expires the payout fails with user_signature_expired (a conversion fails via order.failed).
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.awaiting_user_signature",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
},
"destinationAddress": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"verificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"requiredApprovals": 2,
"occurredAt": "2026-01-15T09:30:00.000Z",
"expiresAt": "2026-01-15T09:45:00.000Z",
"attempt": 1
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the parked payout transaction. |
customerId | string | Yes | Customer initiating the payout. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 timestamp when the payout was parked awaiting signature. |
assetAmount | object | Yes | Amount and asset of the pending payout. |
assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destinationAddress | string | Yes | On-chain destination address for the payout. |
requiredApprovals | integer | Yes | M — signer stamps required to authorize, frozen at prepare time. |
expiresAt | string | Yes | ISO-8601 deadline for THIS signing attempt. If the roster does not sign by this time the payout is automatically re-offered (a new event with an incremented attempt); it only fails after the final attempt’s window elapses. |
attempt | integer | Yes | Signing-attempt counter for this payout. 1 on the first request; the event re-fires with an incrementing attempt each time the prior window expires and a fresh request is issued. Treat the latest attempt as authoritative and dedupe redeliveries on (transactionId, attempt). |
verificationUrl | string | Yes | Conduit-hosted URL the fintech routes the user to for approval. |
transaction.cancelled
Fired when a transaction is cancelled before reaching its terminal-completed state. Distinct fromtransaction.failed: a cancelled transaction is not a failure; the client (or, in the future, an expiry sweep) terminated it intentionally. cancellationReason is client_cancelled when the client called POST /v2/payouts/:id/cancel, or POST /v2/orders/:id/cancel on a conversion whose source transfer had not yet been sent. A conversion cancellation that races a compliance rejection publishes transaction.failed instead: the rejection is a recorded verdict and takes precedence. Reserved value expired is published when the underlying lock window elapses (future). The payload intentionally has no failureCode/failureMessage. Shares the cancellation semantics and cancellationReason vocabulary with order.cancelled (the payload itself is transaction-shaped: transactionId + nested source/destination).
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.cancelled",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "virtual_account",
"virtualAccountId": "vac_2xKjF9mQb7vN4hL1pR3w8t",
"assetAmount": {
"code": "USD",
"amount": "1000.00"
}
},
"destination": {
"type": "external_bank",
"rail": "fedwire",
"recipient": {
"rail": "us",
"type": "individual",
"firstName": "Jane",
"lastName": "Doe",
"accountNumber": "0123456789",
"routingNumber": "021000021",
"accountType": "checking",
"bankAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"country": "USA"
},
"phone": "+15551234",
"postalAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"postalCode": "10001",
"country": "USA"
}
},
"assetAmount": {
"code": "USD",
"amount": "995.00"
}
},
"cancellationReason": "client_cancelled",
"cancelledAt": "2026-01-15T09:30:00.000Z",
"status": "cancelled",
"reasonCode": "client_cancelled",
"reasonMessage": "The client cancelled the transaction.",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the cancelled transaction. |
customerId | string | Yes | Customer associated with this transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | Yes | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Source side of the cancelled transaction — same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Destination side of the cancelled transaction. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
cancellationReason | enum: “expired” | “client_cancelled” | Yes | Whether the transaction was cancelled by the client (client_cancelled) — today the only path that publishes this event, reached from POST /v2/payouts/:id/cancel and from POST /v2/orders/:id/cancel on a conversion — or, in the future, expired (expired). Matches the cancellationReason field on GET /v2/transactions/:id. Mirrors order.cancelled’s reason field. |
cancelledAt | string | Yes | ISO-8601 timestamp when the transaction was cancelled. |
status | ”cancelled” | Yes | Terminal status. Always cancelled on this event. |
reasonCode | enum: “expired” | “client_cancelled” | Yes | Why the transaction ended. The same value as cancellationReason. |
reasonMessage | string | Yes | Human-readable description of reasonCode. |
transaction.completed
Fired when a transaction completes successfully.source and destination carry the same nested shape as GET /v2/transactions/:id. The settlement reference lives inside the relevant side variant: external_crypto.txHash for crypto rails, and on external_bank the real wire references as typed fields — swiftUetr, fedwireImad, fedwireOmad, achTraceNumber, rtpTransactionId, fedNowMessageId — each present only when the network exposes it (on-us transfers carry none). On some rails the wire reference is confirmed shortly after this event; if a field you expect is absent here, read it from GET /v2/transactions/:id rather than assuming it will never appear. Fiat payout events include the selected rail for reconciliation on payout.rail. When a fee was taken out of the movement, fees reports it and the two side amounts differ by exactly that fee: on an inbound fiat deposit source.assetAmount is what the sender sent and destination.assetAmount is what was credited to the customer. A fee Conduit invoices to you separately is reported in fees as well, and it does not move either side amount; the two agree when no other charge, such as your own margin, comes out of the movement. Post the destination amount to your own ledger, not the source amount, and take the fee from fees rather than deriving it. fees is always present: an empty array means nothing was charged. Every entry names its owner, so a payout carrying your own declared margin reports a Conduit entry and one owned by you — the same breakdown GET /v2/transactions/:id returns.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.completed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"status": "completed",
"source": {
"type": "virtual_account",
"virtualAccountId": "vac_2xKjF9mQb7vN4hL1pR3w8t",
"assetAmount": {
"code": "USD",
"amount": "1000.00"
}
},
"destination": {
"type": "external_bank",
"rail": "fedwire",
"recipient": {
"rail": "us",
"type": "individual",
"firstName": "Jane",
"lastName": "Doe",
"accountNumber": "0123456789",
"routingNumber": "021000021",
"accountType": "checking",
"bankAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"country": "USA"
},
"phone": "+15551234",
"postalAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"postalCode": "10001",
"country": "USA"
}
},
"assetAmount": {
"code": "USD",
"amount": "995.00"
},
"fedwireImad": "20260616MMQFMP9C000123"
},
"fees": [
{
"type": "fixed",
"assetAmount": {
"code": "USD",
"amount": "5.00"
},
"owner": "conduit"
}
],
"payout": {
"rail": "fedwire"
},
"completedAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the completed transaction. |
customerId | string | Yes | Customer associated with this transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | Yes | Transaction type. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Source side of the transaction — same nested shape as GET /v2/transactions/:id. On crypto rails the on-chain settlement hash lives inside the matching external_crypto.txHash; on fiat rails the real wire references are typed fields on the matching external_bank (swiftUetr, fedwireImad, fedwireOmad, achTraceNumber, rtpTransactionId, fedNowMessageId), present only when the network exposes one. Inbound fiat (external_bank_inbound) carries rail (the rail it arrived on, or null when not known), the same typed reference fields and a sender block (name, country, accountNumber, routingNumber, sortCode, iban, bic) with what the sending bank transmitted. Each reference is independent: an incoming wire reports whichever of fedwireImad, fedwireOmad and swiftUetr the sending bank supplied, and any of them may be absent. Read rail for the network; do NOT infer it from which reference is present — the references stay independent and optional, and swiftUetr is the ISO 20022 UETR, which a Fedwire message carries too, so its presence does not mean the payment travelled on SWIFT. An incoming ACH reports achTraceNumber. A deposit delivered on-us from another account in your own organization carries no wire references at all — its source is internal_transfer with originatingTransactionId pointing at the withdrawal that sent it. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Destination side of the transaction. See source for the settlement-reference placement rule. The destination amount is what reached the destination: on an inbound deposit that is the amount credited to the customer, which is the amount the sender sent less any fee reported in fees. Reconcile against source.assetAmount for the amount received and fees for the difference. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
status | ”completed” | Yes | Terminal status. Always completed on this event; failures fire transaction.failed instead. |
fees | array of object | Yes | Fees charged on this transaction. Always present; an empty array means nothing was charged. When both sides hold the same asset, each fee is already netted out — source.assetAmount less the sum of fees equals destination.assetAmount, and with an empty array the two side amounts agree — so do not subtract it again. A conversion reports the same fees as the order that created it, each in the asset the order reports it in, and source.assetAmount is the order’s totalDebit, which already includes them. On any other transaction the fee asset matches the source side. The same entries and owners as the fees array on GET /v2/transactions/{id} for the same transaction: a payout carrying your own margin reports a Conduit entry and one owned by you. The attribution is as of the completion. If the bank returns the payout later, Conduit reverses your margin: the transaction reports transaction.failed with returned_by_sender, and GET /v2/transactions/{id} then reports the whole charge as Conduit’s. This event keeps the attribution it was delivered with, because every delivery attempt sends the payload as it was built, so reconcile the reversal from transaction.failed. |
fees[].type | ”fixed” | Yes | Pricing model used to compute the fee. |
fees[].assetAmount | object | Yes | Fee amount with its asset. |
fees[].assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
fees[].assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
fees[].assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
fees[].owner | enum: “conduit” | “you” | Yes | Who this charge belongs to. conduit is Conduit’s own fee. you is a flat margin you declared with markupAmount, which Conduit collects from your customer and accrues to you. Present on every entry. |
payout | object | No | Payout rail metadata. Present only for outbound transactions. |
payout.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | null | Yes | Fiat payment rail used. Null for a crypto payout, and null for a fiat payout to a virtual-account destination, which names no rail. The same rail reads on destination.rail beside the rail context the payout was created with. |
completedAt | string | Yes | ISO-8601 timestamp when the transaction completed. |
matchableOrders | array of object | No | Pending orders that can execute against the deposited funds. Only populated for inbound DEPOSIT transactions. |
matchableOrders[].id | string | Yes | Unique ID of the pending order. |
matchableOrders[].clientReferenceId | string | No | Caller-supplied external reference for the order, if provided. |
matchableOrders[].totalDebit | object | Yes | Total source-side debit needed to execute this order (principal + fees). |
matchableOrders[].totalDebit.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
matchableOrders[].totalDebit.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
matchableOrders[].totalDebit.amount | string | Yes | Decimal string, asset-precision rounded |
matchableOrders[].lockExpiresAt | string | Yes | ISO-8601 timestamp when the order’s rate lock expires. |
matchableOrders[].autoExecute | boolean | Yes | Whether the order will execute automatically when funds land. |
matchableOrdersTruncated | boolean | No | True when the matchable orders list was truncated due to size limits. |
transaction.created
Fired when a new transaction is initiated.type identifies the direction: deposit, onramp, offramp, withdrawal, conversion (a crypto-to-crypto swap or bridge between two of the customer’s wallets), fiat_conversion (a move between two of the customer’s virtual accounts in different currencies), or deposit_return (funds sent back from an order’s funding address to the address they came from). source and destination carry the same nested shape as GET /v2/transactions/:id — discriminated by type (wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, internal_transfer, external_unknown) and each variant carries its own assetAmount. stage is the same client-safe progress signal as the GET response — see that endpoint’s field docs for the vocabulary and lifecycle. Transactions belonging to an order carry linkedOrderId referencing it — both the conversion the order executes and a withdrawal chained from its autoPayout; absent on transactions with no order.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.created",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"type": "deposit",
"stage": "settling",
"source": {
"type": "external_bank_inbound",
"rail": "fedwire",
"sender": {
"name": "Acme Trading LLC",
"country": "US",
"accountNumber": "0123456789",
"routingNumber": "021000021"
},
"assetAmount": {
"code": "USD",
"amount": "1000.00"
}
},
"destination": {
"type": "virtual_account",
"virtualAccountId": "vac_2xKjF9mQb7vN4hL1pR3w8t",
"wireReceive": {
"rail": "us",
"bankName": "First Example Bank",
"accountLast4": "4321",
"routingNumber": "021000089"
},
"assetAmount": {
"code": "USD",
"amount": "1000.00"
}
},
"createdAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the transaction. |
customerId | string | Yes | Customer who initiated or received this transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | Yes | Transaction type. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Source side of the transaction — the variant matches the GET /v2/transactions/:id shape (wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, internal_transfer, external_unknown). Includes assetAmount (amount + asset code/chain); amounts always live per-side — transaction objects never carry a top-level assetAmount. The external_bank_inbound variant adds rail (the payment network the deposit arrived on — fedwire, ach, and so on — or null when not known) and a sender block with what the sending bank transmitted: name, country (ISO 3166-1 alpha-2), accountNumber, routingNumber, sortCode, iban, bic — each present only when provided. The internal_transfer variant — a deposit that arrived from another account in your own organization, carrying originatingTransactionId — is not yet resolved at first detection: the link resolves as the deposit is detected, which happens after creation. Do not narrow this field on transaction.created; transaction.completed and every read carry the resolved source. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Destination side of the transaction — same shape as source. The variant determines which counterparty details are populated (wallet, Conduit-provided deposit_address, virtual account with optional wireReceive, external crypto address, external bank recipient). wireReceive is itself discriminated on rail: every rail carries bankName and accountLast4, us adds a routing number, swift and sepa each add a BIC, and uk adds a sort code. The receiving account is always reported as its last four digits, never in full. Switch on rail rather than assuming a fixed field set. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
stage | enum: “awaiting_signature” | “awaiting_customer_action” | “under_review” | “settling” | No | Progress signal, same vocabulary and lifecycle as the stage field on GET /v2/transactions/:id — see that field’s description for the values and what each does/doesn’t imply. Informational only; does not replace requiresUserSignature, hasRfi, or failureCode for action decisions. Always non-terminal at creation time. |
createdAt | string | Yes | ISO-8601 timestamp when the transaction was created. |
transaction.failed
Fired when a transaction reaches a terminal failed state.source and destination carry the same nested shape as GET /v2/transactions/:id. The payload carries a failureCode your integration can branch on:
user_signature_*— recoverable: submit a new transaction.chain_broadcast_failed— the on-chain broadcast or signing did not reach finality and no funds left the wallet; recoverable, submit a new payout.insufficient_onchain_balance— the source wallet holds no or insufficient real on-chain balance for the send, so nothing was broadcast and no funds moved; fund the wallet on-chain, then submit a new payout.source_account_unavailable— the source balance is held on a bank account that is not active (for example closed or still in approval), so no funds moved; contact support to make the balance available on an active account, then submit a new order. Money on a bank account the bank has blocked is reported infrozen, and a payout against it fails withinsufficient_fundsbefore anything is reserved.capability_suspended— a restriction on the customer took effect before Conduit sent the payout, so nothing was sent and no funds moved; the reserved funds are back in the balance. Submit a new payout after the restriction is lifted.crypto_wallet_misconfigured— the wallet’s signing configuration prevents Conduit from moving funds and the wallet has been frozen; NOT recoverable by retrying, contact support.provider_rejected— Conduit could not build or send the transfer, for example because the asset has no contract on that chain or the chain provider refused the broadcast. Adjust inputs (e.g. destination address, amount) and retry.travel_rule_rejected— the travel-rule check failed or the counterparty VASP rejected the travel-rule transfer. Not retryable without coordinating with the receiving institution.compliance_hold/compliance_review_rejected— compliance review required; not retryable without investigation.returned_by_sender— a bank returned the transfer: the fiat sender reversed an inbound transfer, compliance marked a deposit returned before credit, or the recipient’s bank sent a payout back. When Conduit recorded a bank’s return of the transfer, it also carriesreturnedAt,returnReason(why the bank returned it, for exampleaccount_closed), andreturnCodewhen the bank sent a Nacha return code (for exampleR01). A deposit that compliance returned before credit carries none of them. A transfer sent back from a funding address carries nofailureCodeat all — see the RETURNED_BY_SENDER page for how to reconcile that case.rail_policy_rejected/insufficient_funds_at_settle/rail_unavailable— payment-rail failure; adjust amount, recipient, or rail and retry.sender_info_timeout— legacy: Conduit no longer sets it on new transactions. An older deposit carries it when its sender-information deadline passed. WhenfailureCodeis absent the failure has no actionable code — contact support.failureMessageis always Conduit’s catalog text for the code, never a bank or provider message. Order-level failures (including conversion provider unavailability) surface onorder.failedwith areasonCode. A conversion that fails before any source funds move also carries the same code here when the order code has a transaction twin (for examplesource_account_unavailable).
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.failed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f2bd18",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "100.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x9abc456789defabcdef0123456789abcdef01234",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "100.000000"
}
},
"failureCode": "user_signature_declined",
"failureMessage": "The customer declined the payout from the approval page. No funds were moved.",
"failedAt": "2026-01-15T09:30:00.000Z",
"status": "failed",
"reasonCode": "user_signature_declined",
"reasonMessage": "The customer declined the payout from the approval page. No funds were moved.",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the failed transaction. |
customerId | string | Yes | Customer associated with this transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | Yes | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Source side of the failed transaction — same nested shape as GET /v2/transactions/:id. Populated even on terminal failures so the payload is self-contained. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | Yes | Destination side of the failed transaction. May surface as external_unknown when failure occurred before counterparty resolution. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
failureCode | enum: “user_signature_timeout” | “user_signature_expired” | “user_signature_declined” | “user_signature_rejected_by_provider” | “crypto_wallet_misconfigured” | “compliance_hold” | “compliance_review_rejected” | “compliance_rejected” | “returned_by_sender” | “rail_policy_rejected” | “insufficient_funds” | “insufficient_funds_at_settle” | “rail_unavailable” | “sender_info_timeout” | “travel_rule_rejected” | “provider_rejected” | “chain_broadcast_failed” | “roster_changed” | “insufficient_onchain_balance” | “source_account_unavailable” | “capability_suspended” | No | Machine-readable failure code identifying the cause (e.g. user_signature_timeout, provider_rejected, travel_rule_rejected). Present when the failure has a recoverable cause the integration can act on. When absent, the payout cannot be completed and retrying will not help — contact support if recovery is needed. |
failureMessage | string | No | Conduit’s own wording for failureCode: the public error catalog text for the code, the same for every transaction that fails with it, in live and sandbox builds. With no failureCode, the generic text This transaction could not be completed. Contact support if this persists. It never carries text from a bank, a chain or a sandbox simulator reason. Branch on failureCode, not on this text. |
returnCode | string | No | The return code the bank sent when it returned this deposit or payout, for example the Nacha code R01 on an ACH return. Present only with failureCode: returned_by_sender, and only when the bank sent a Nacha return code. The same value as returnCode on GET /v2/transactions/:id. returnReason says why the bank returned the transfer. The bank’s free-text return reason is never sent. |
returnReason | enum: “account_closed” | “incorrect_account_number” | “beneficiary_name_mismatch” | “payment_not_permitted” | “other” | No | Why the bank returned this transfer, as a Conduit code. Present only with failureCode: returned_by_sender when Conduit recorded the bank’s return, with or without returnCode. Absent on a return recorded before this field existed. account_closed: The bank account is closed. incorrect_account_number: The bank found no account with this account number. beneficiary_name_mismatch: The account holder’s name does not match the name on the payment. payment_not_permitted: The bank does not permit this payment on the account. other: The bank returned the payment for a different reason or gave no reason. Contact support for details. The set of values can grow. Treat a value you do not recognise as other. The bank’s free-text return reason is never sent. The reason Conduit knew when the event fired. A later GET /v2/transactions/:id can show a more specific returnReason when the bank’s detail arrives after Conduit recorded the return. |
returnedAt | string | No | ISO-8601 timestamp when Conduit recorded the bank’s return. Present with failureCode: returned_by_sender when the return is recorded, with or without returnCode. The same value as returnedAt on GET /v2/transactions/:id. |
payout | object | No | Payout rail metadata. Present only for outbound transactions. |
payout.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | null | Yes | Fiat payment rail used. Null for a crypto payout, and null for a fiat payout to a virtual-account destination, which names no rail. The same rail reads on destination.rail beside the rail context the payout was created with. |
failedAt | string | Yes | ISO-8601 timestamp when the transaction failed. |
status | ”failed” | Yes | Terminal status. Always failed on this event. |
reasonCode | enum: “user_signature_timeout” | “user_signature_expired” | “user_signature_declined” | “user_signature_rejected_by_provider” | “crypto_wallet_misconfigured” | “compliance_hold” | “compliance_review_rejected” | “compliance_rejected” | “returned_by_sender” | “rail_policy_rejected” | “insufficient_funds” | “insufficient_funds_at_settle” | “rail_unavailable” | “sender_info_timeout” | “travel_rule_rejected” | “provider_rejected” | “chain_broadcast_failed” | “roster_changed” | “insufficient_onchain_balance” | “source_account_unavailable” | “capability_suspended” | No | Why the transaction ended. The same value as failureCode, and absent when failureCode is absent. |
reasonMessage | string | Yes | Human-readable description of why the transaction ended. The same text as failureMessage. |
transaction.processing
Fired when a payout clears compliance and moves into active processing (signature collection, co-stamp, broadcast, or submission to the bank), and when the transaction a conversion executes moves into processing. The public status transitions frompending to processing at the same moment. On a multi-signer non-custodial payout this fires once, before transaction.awaiting_signature; while the payout waits for its per-wallet signing turn, follow its place with transaction.queue_position_changed instead of polling.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.processing",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the transaction that entered processing. |
customerId | string | Yes | Customer associated with the transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
transaction.queue_position_changed
Fired each time a payout moves forward in its wallet’s per-chain signing queue. A non-custodial wallet signs one payout at a time per chain; the rest wait in line. This event carries the payout’s currentqueuePosition (1 is next to sign) — the same value GET /v2/payouts/:id returns at that moment. It fires on entry to the queue and on each move forward, so you follow the place without polling. It does not fire when the payout leaves the queue: transaction.awaiting_signature (its turn came), transaction.failed with user_signature_timeout (it waited too long), or transaction.cancelled tells you what happened instead. A payout that gets the signing seat immediately never enters the queue and emits no transaction.queue_position_changed.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.queue_position_changed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"occurredAt": "2026-01-15T09:30:00.000Z",
"queuePosition": 3
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the payout waiting in the signing queue. |
customerId | string | Yes | Customer associated with the payout. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
queuePosition | integer | Yes | Place in the wallet’s signing queue for this chain. 1 is next to sign. |
transaction.quorum_met
Fired when all required signer stamps are in (collected >= required). Compliance already cleared before signing began, so Conduit now co-signs and broadcasts — no further review gate stands between quorum and broadcast.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.quorum_met",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the transaction that reached signer quorum. |
customerId | string | Yes | Customer associated with the transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
transaction.rejected
Fired when a compliance reviewer rejects the supporting document on an accepted payout, before execution. Terminal: funds are returned to the available balance. Resubmit a new payout with an acceptable document (see acceptedDocumentTypes) and a fresh idempotency key.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.rejected",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "virtual_account",
"virtualAccountId": "vac_2xKjF9mQb7vN4hL1pR3w8t",
"assetAmount": {
"code": "USD",
"amount": "1000.00"
}
},
"destination": {
"type": "external_bank",
"rail": "fedwire",
"recipient": {
"rail": "us",
"type": "individual",
"firstName": "Jane",
"lastName": "Doe",
"accountNumber": "0123456789",
"routingNumber": "021000021",
"accountType": "checking",
"bankAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"country": "USA"
},
"phone": "+15551234",
"postalAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"postalCode": "10001",
"country": "USA"
}
},
"assetAmount": {
"code": "USD",
"amount": "995.00"
}
},
"status": "failed",
"reasonCategory": "document_inadequate",
"reasonCode": "compliance_rejected",
"reasonMessage": "Supporting document rejected in compliance review",
"acceptedDocumentTypes": [
"bank_verification_letter",
"invoice",
"contract",
"payroll_register",
"investment_agreement",
"other"
],
"rejectedAt": "2026-01-15T09:30:00.000Z",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | Unique ID of the rejected payout. |
customerId | string | Yes | Customer who initiated this payout. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | ”withdrawal” | Yes | Always withdrawal — only payouts are subject to document review. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
status | ”failed” | Yes | Public terminal status. Always failed on this event; the payout is terminal and funds are returned. |
reasonCategory | enum: “document_inadequate” | Yes | Machine-readable rejection category. document_inadequate — the submitted document could not satisfy the compliance requirement. |
acceptedDocumentTypes | array of enum: “bank_verification_letter” | “invoice” | “contract” | “payroll_register” | “investment_agreement” | “other” | Yes | Document types that usually satisfy review for this payout’s purpose and customer. A business customer gets every type; an individual customer gets the types a person can usually give. The list is a hint: any supported file can be uploaded, and a reviewer judges the document itself. Attach a document and resubmit with a fresh idempotency key. |
rejectedAt | string | Yes | ISO-8601 timestamp when the document review rejection was recorded. |
reasonCode | ”compliance_rejected” | Yes | Why the transaction ended. The same value as failureCode on GET /v2/transactions/:id. |
reasonMessage | string | Yes | Human-readable description of why the review rejected the payout. |
transaction.signature_collected
Fired once per signer stamp collected on a multi-signer payout. Trackcollected / required to drive a progress UI; once collected >= required, transaction.quorum_met follows.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.signature_collected",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "wallet",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"address": "0x9a8f2e4c6b1d3f5a7e9c0b2d4f6a8c0e2b4d6f8a",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"destination": {
"type": "external_crypto",
"address": "0x742d35cc6634c0532925a3b844bc9e7595f0beb1",
"assetAmount": {
"code": "USDC",
"chain": "ethereum",
"amount": "1000.000000"
}
},
"occurredAt": "2026-01-15T09:30:00.000Z",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"collected": 1,
"required": 2
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the transaction being signed. |
customerId | string | Yes | Customer associated with the transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 time of the change this event reports. Every transaction event carries it under this name; an older name for the same time, such as completedAt, stays beside it. |
walletSignerId | string | Yes | ID of the signer whose stamp was just collected. |
collected | integer | Yes | Count of distinct signer stamps gathered so far. |
required | integer | Yes | Total signer stamps required (signingThreshold). |
transaction.under_review
Fired when a transaction enters review and itsstage becomes under_review — the same value the read surfaces report while the review is open. A payout can enter review before or after it is submitted; a deposit can enter review before it credits. No customer action is required unless hasRfi on the transaction says otherwise. There is no matching event when the review closes: the transaction resumes or terminates on its own, and the next event it sends is the one for what happened — transaction.completed when it settles, transaction.rejected when a payout’s document review is rejected, transaction.failed when any other review rejects it, transaction.cancelled when the client cancels it first, and transaction.processing when a payout is released and moves into processing. The payload carries no reason, category or review identifier, so the event does not disclose which review holds the transaction. Read GET /v2/transactions/{id} for the transaction as it stands. The event fires once for each review period, not once for each review inside it. A new period starts when the transaction enters review after Conduit asked you for something (the transaction read awaiting_customer_action), or after the transaction was sent to the bank. A transaction that moves from one review to the next, or leaves review and enters it again before either of those, does not fire it again.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "transaction.under_review",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"transactionId": "txn_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"clientReferenceId": "ext-payout-1",
"type": "withdrawal",
"source": {
"type": "virtual_account",
"virtualAccountId": "vac_2xKjF9mQb7vN4hL1pR3w8t",
"assetAmount": {
"code": "USD",
"amount": "1000.00"
}
},
"destination": {
"type": "external_bank",
"rail": "fedwire",
"recipient": {
"rail": "us",
"type": "individual",
"firstName": "Jane",
"lastName": "Doe",
"accountNumber": "0123456789",
"routingNumber": "021000021",
"accountType": "checking",
"bankAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"country": "USA"
},
"phone": "+15551234",
"postalAddress": {
"addressLine1": "1 Main St",
"city": "NYC",
"postalCode": "10001",
"country": "USA"
}
},
"assetAmount": {
"code": "USD",
"amount": "995.00"
}
},
"stage": "under_review",
"occurredAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
transactionId | string | Yes | ID of the transaction that entered review. |
customerId | string | Yes | Customer associated with the transaction. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
type | enum: “deposit” | “onramp” | “offramp” | “withdrawal” | “conversion” | “fiat_conversion” | “deposit_return” | No | Transaction type. Same value as on transaction.created. |
source | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Source side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
source.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
source.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
source.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
source.assetAmount | object | Yes | — |
source.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
source.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
source.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
source.txHash | string | No | — Present only when type is wallet or external_crypto. |
source.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
source.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
source.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
source.wireReceive.bankName | string | null | Yes | — |
source.wireReceive.accountLast4 | string | null | Yes | — |
source.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
source.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
source.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
source.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
source.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
source.memo.value | string | Yes | — |
source.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.ach | object | No | — Present only when type is external_bank. |
source.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
source.swift | object | No | — Present only when type is external_bank. |
source.swift.purposeOfPayment | string | No | — |
source.instant | object | No | — Present only when type is external_bank. |
source.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
source.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
source.recipient.accountNumber | string | No | — Present on some variants only. |
source.recipient.routingNumber | string | No | — Present on some variants only. |
source.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
source.recipient.bankName | string | No | — Present on some variants only. |
source.recipient.bankAddress | object | No | — Present on some variants only. |
source.recipient.bankAddress.addressLine1 | string | Yes | — |
source.recipient.bankAddress.addressLine2 | string | No | — |
source.recipient.bankAddress.city | string | Yes | — |
source.recipient.bankAddress.state | string | No | — |
source.recipient.bankAddress.postalCode | string | No | — |
source.recipient.bankAddress.country | string | Yes | — |
source.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
source.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
source.recipient.type | enum: “individual” | “business” | No | — |
source.recipient.firstName | string | No | — Present on some variants only. |
source.recipient.lastName | string | No | — Present on some variants only. |
source.recipient.dateOfBirth | string | No | — Present on some variants only. |
source.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
source.recipient.postalAddress | object | No | — |
source.recipient.postalAddress.addressLine1 | string | Yes | — |
source.recipient.postalAddress.addressLine2 | string | No | — |
source.recipient.postalAddress.city | string | Yes | — |
source.recipient.postalAddress.state | string | No | — |
source.recipient.postalAddress.postalCode | string | No | — |
source.recipient.postalAddress.country | string | Yes | — |
source.recipient.legalName | string | No | — Present on some variants only. |
source.recipient.countryOfRegistration | string | No | — Present on some variants only. |
source.recipient.iban | string | No | — Present on some variants only. |
source.recipient.bic | string | No | — Present on some variants only. |
source.recipient.sortCode | string | No | — Present on some variants only. |
source.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
source.recipient.address | string | No | — Present on some variants only. |
source.recipient.attestation | object | No | — Present on some variants only. |
source.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
source.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
source.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
source.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
source.sender.name | string | No | Name of the sending account holder. |
source.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
source.sender.accountNumber | string | No | Sending account number, when transmitted. |
source.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
source.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
source.sender.iban | string | No | Sender IBAN, when transmitted. |
source.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
source.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
source.originator.name | string | Yes | Name of the party that pulled the money. |
source.originator.id | string | No | The originator’s identifier on the network, when sent. |
source.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
source.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
source.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
source.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
destination | object (one of: wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown) | No | Destination side of the transaction, in the same nested shape as GET /v2/transactions/:id. |
destination.type | enum: “wallet” | “deposit_address” | “virtual_account” | “external_crypto” | “external_bank” | “external_bank_inbound” | “external_bank_debit” | “internal_transfer” | “external_unknown” | Yes | Discriminates the payload variant (one of wallet, deposit_address, virtual_account, external_crypto, external_bank, external_bank_inbound, external_bank_debit, internal_transfer, external_unknown). See the per-variant fields below. |
destination.walletId | string | Yes when type = wallet | — Present only when type is wallet. |
destination.address | string | Yes when type = wallet or deposit_address or external_crypto | — Present only when type is wallet or deposit_address or external_crypto. |
destination.assetAmount | object | Yes | — |
destination.assetAmount.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
destination.assetAmount.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat. |
destination.assetAmount.amount | string | Yes | Decimal string, asset-precision rounded |
destination.txHash | string | No | — Present only when type is wallet or external_crypto. |
destination.virtualAccountId | string | Yes when type = virtual_account | — Present only when type is virtual_account. |
destination.wireReceive | object (one of: us, swift, sepa, uk) | No | Receiving wire-instruction context: which Conduit bank account + rail the inbound deposit landed in. Captured at deposit-detect time. Present only when type is virtual_account. |
destination.wireReceive.rail | enum: “us” | “swift” | “sepa” | “uk” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk). See the per-variant fields below. |
destination.wireReceive.bankName | string | null | Yes | — |
destination.wireReceive.accountLast4 | string | null | Yes | — |
destination.wireReceive.routingNumber | string | null | Yes when rail = us | — Present only when rail is us. |
destination.wireReceive.bic | string | null | Yes when rail = swift or sepa | — Present only when rail is swift or sepa. |
destination.wireReceive.sortCode | string | null | Yes when rail = uk | — Present only when rail is uk. |
destination.memo | object (one of: text, id) | No | Destination memo (destination tag) for the receiving account. Required by shared custodial addresses such as exchanges. Only accepted on chains whose payments carry a memo. Present only when type is external_crypto. |
destination.memo.type | enum: “text” | “id” | Yes | Discriminates the payload variant (one of text, id). See the per-variant fields below. |
destination.memo.value | string | Yes | — |
destination.rail | enum: “fedwire” | “rtp” | “fednow” | “ach” | “ach_same_day” | “swift” | “sepa” | “faster_payments” | “chaps” | Yes when type = external_bank or external_bank_inbound or external_bank_debit | The payment network the payout was created with, as sent on the request’s rail. recipient.rail names the account family the coordinates belong to (us, swift, sepa, uk_domestic), not the network. For external_bank_inbound: The payment network the deposit arrived on (fedwire, ach, rtp, fednow, swift, sepa, faster_payments, chaps), or null when not known. Always present. Independent of the wire reference fields, which may be absent. For external_bank_debit: The payment network the bank pulled the money over (ach, fedwire, …), or null when not known. Always present. Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.ach | object | No | — Present only when type is external_bank. |
destination.ach.authorizationType | enum: “corporate_agreement” | “written” | “web” | Yes | — |
destination.swift | object | No | — Present only when type is external_bank. |
destination.swift.purposeOfPayment | string | No | — |
destination.instant | object | No | — Present only when type is external_bank. |
destination.instant.receiverNetworkPreference | enum: “tch” | “fednow” | No | — |
destination.recipient | object (one of: us, swift, sepa, uk_domestic, crypto) | Yes when type = external_bank | — Present only when type is external_bank. |
destination.recipient.accountNumber | string | No | — Present on some variants only. |
destination.recipient.routingNumber | string | No | — Present on some variants only. |
destination.recipient.accountType | enum: “checking” | “savings” | No | — Present on some variants only. |
destination.recipient.bankName | string | No | — Present on some variants only. |
destination.recipient.bankAddress | object | No | — Present on some variants only. |
destination.recipient.bankAddress.addressLine1 | string | Yes | — |
destination.recipient.bankAddress.addressLine2 | string | No | — |
destination.recipient.bankAddress.city | string | Yes | — |
destination.recipient.bankAddress.state | string | No | — |
destination.recipient.bankAddress.postalCode | string | No | — |
destination.recipient.bankAddress.country | string | Yes | — |
destination.recipient.phone | string | No | Recipient contact phone. Optional; forwarded to the banking partner when provided. |
destination.recipient.rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Discriminates the payload variant (one of us, swift, sepa, uk_domestic, crypto). See the per-variant fields below. |
destination.recipient.type | enum: “individual” | “business” | No | — |
destination.recipient.firstName | string | No | — Present on some variants only. |
destination.recipient.lastName | string | No | — Present on some variants only. |
destination.recipient.dateOfBirth | string | No | — Present on some variants only. |
destination.recipient.countryOfCitizenship | string | No | — Present on some variants only. |
destination.recipient.postalAddress | object | No | — |
destination.recipient.postalAddress.addressLine1 | string | Yes | — |
destination.recipient.postalAddress.addressLine2 | string | No | — |
destination.recipient.postalAddress.city | string | Yes | — |
destination.recipient.postalAddress.state | string | No | — |
destination.recipient.postalAddress.postalCode | string | No | — |
destination.recipient.postalAddress.country | string | Yes | — |
destination.recipient.legalName | string | No | — Present on some variants only. |
destination.recipient.countryOfRegistration | string | No | — Present on some variants only. |
destination.recipient.iban | string | No | — Present on some variants only. |
destination.recipient.bic | string | No | — Present on some variants only. |
destination.recipient.sortCode | string | No | — Present on some variants only. |
destination.recipient.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | — Present on some variants only. |
destination.recipient.address | string | No | — Present on some variants only. |
destination.recipient.attestation | object | No | — Present on some variants only. |
destination.recipient.attestation.custody | enum: “self” | “third_party” | Yes | — |
destination.fedwireImad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedwireOmad | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.swiftUetr | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.achTraceNumber | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.rtpTransactionId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.fedNowMessageId | string | No | — Present only when type is external_bank or external_bank_inbound or external_bank_debit. |
destination.bankScheduledFor | string | No | The settlement date the sending bank last reported for this payout, as a calendar date in the bank’s own time zone. Present only when the bank reports one, as on ACH. A date later than the payout date means the bank moved the entry to a later window; the payout, its rail and its obligation do not change, so do not send it again. Present only when type is external_bank. |
destination.sender | object | Yes when type = external_bank_inbound | Originator details on an inbound fiat deposit — what the sending bank transmitted with the payment. Each field is present only when provided. Present only when type is external_bank_inbound. |
destination.sender.name | string | No | Name of the sending account holder. |
destination.sender.country | enum: “AF” | “AL” | “DZ” | “AS” | “AD” | “AO” | “AI” | “AQ” | “AG” | “AR” | “AM” | “AW” | “AU” | “AT” | “AZ” | “BS” | “BH” | “BD” | “BB” | “BY” | “BE” | “BZ” | “BJ” | “BM” | “BT” | “BO” | “BQ” | “BA” | “BW” | “BV” | “BR” | “IO” | “BN” | “BG” | “BF” | “BI” | “CV” | “KH” | “CM” | “CA” | “KY” | “CF” | “TD” | “CL” | “CN” | “CX” | “CC” | “CO” | “KM” | “CG” | “CD” | “CK” | “CR” | “CI” | “HR” | “CU” | “CW” | “CY” | “CZ” | “DK” | “DJ” | “DM” | “DO” | “EC” | “EG” | “SV” | “GQ” | “ER” | “EE” | “SZ” | “ET” | “FK” | “FO” | “FJ” | “FI” | “FR” | “GF” | “PF” | “TF” | “GA” | “GM” | “GE” | “DE” | “GH” | “GI” | “GR” | “GL” | “GD” | “GP” | “GU” | “GT” | “GG” | “GN” | “GW” | “GY” | “HT” | “HM” | “VA” | “HN” | “HK” | “HU” | “IS” | “IN” | “ID” | “IR” | “IQ” | “IE” | “IM” | “IL” | “IT” | “JM” | “JP” | “JE” | “JO” | “KZ” | “KE” | “KI” | “KP” | “KR” | “KW” | “KG” | “LA” | “LV” | “LB” | “LS” | “LR” | “LY” | “LI” | “LT” | “LU” | “MO” | “MG” | “MW” | “MY” | “MV” | “ML” | “MT” | “MH” | “MQ” | “MR” | “MU” | “YT” | “MX” | “FM” | “MD” | “MC” | “MN” | “ME” | “MS” | “MA” | “MZ” | “MM” | “NA” | “NR” | “NP” | “NL” | “NC” | “NZ” | “NI” | “NE” | “NG” | “NU” | “NF” | “MK” | “MP” | “NO” | “OM” | “PK” | “PW” | “PS” | “PA” | “PG” | “PY” | “PE” | “PH” | “PN” | “PL” | “PT” | “PR” | “QA” | “RE” | “RO” | “RU” | “RW” | “BL” | “SH” | “KN” | “LC” | “MF” | “PM” | “VC” | “WS” | “SM” | “ST” | “SA” | “SN” | “RS” | “SC” | “SL” | “SG” | “SX” | “SK” | “SI” | “SB” | “SO” | “ZA” | “GS” | “SS” | “ES” | “LK” | “SD” | “SR” | “SJ” | “SE” | “CH” | “SY” | “TW” | “TJ” | “TZ” | “TH” | “TL” | “TG” | “TK” | “TO” | “TT” | “TN” | “TR” | “TM” | “TC” | “TV” | “UG” | “UA” | “AE” | “GB” | “US” | “UM” | “UY” | “UZ” | “VU” | “VE” | “VN” | “VG” | “VI” | “WF” | “EH” | “YE” | “ZM” | “ZW” | No | Country of the sending account holder, ISO 3166-1 alpha-2. |
destination.sender.accountNumber | string | No | Sending account number, when transmitted. |
destination.sender.routingNumber | string | No | US ABA routing number of the sending bank. |
destination.sender.sortCode | string | No | UK sort code of the sending bank, as the sending bank transmitted it, with spaces and hyphens stripped. |
destination.sender.iban | string | No | Sender IBAN, when transmitted. |
destination.sender.bic | string | No | BIC of the sending bank (ISO 9362). |
destination.originator | object | Yes when type = external_bank_debit | — Present only when type is external_bank_debit. |
destination.originator.name | string | Yes | Name of the party that pulled the money. |
destination.originator.id | string | No | The originator’s identifier on the network, when sent. |
destination.secCode | string | No | ACH Standard Entry Class code of the entry, e.g. CCD or WEB. Present only when type is external_bank_debit. |
destination.description | string | No | Entry description the originator sent with the debit. Present only when type is external_bank_debit. |
destination.effectiveDate | string | No | Date the originator asked the bank to settle the debit. Present only when type is external_bank_debit. |
destination.originatingTransactionId | string | Yes when type = internal_transfer | — Present only when type is internal_transfer. |
linkedOrderId | string | No | The Order this transaction belongs to: present on the Conversion an Order executes and on a Withdrawal chained from that Order’s autoPayout. Absent on transactions with no Order (deposits, standalone payouts, deposit returns). |
occurredAt | string | Yes | ISO-8601 timestamp when the transaction entered review. |
sequence | integer | No | Order of this status event among the status events of the same transaction: 1 for the first, then up by 1 for each next status event. Webhooks can arrive out of order, so apply a transaction’s status events in sequence order, not in the order they arrive. A gap means an earlier event has not reached you yet. Absent on events sent before this field existed. |
stage | ”under_review” | Yes | Progress stage the transaction entered. Always under_review on this event — the same value GET /v2/transactions/:id and GET /v2/payouts/:id report while the review is open. |
virtual_account.activated
Fired when a virtual account is activated.asset carries the currency the account collects; read the account to get its deposit instructions. Do not assume USD, and do not read the currency off a deposit-block type name: a block type names the rail family it collects on (us_domestic, swift, sepa, uk_domestic) and carries its own currency field.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "virtual_account.activated",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"virtualAccountId": "vac_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"asset": {
"code": "EUR"
},
"activatedAt": "2026-01-15T09:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
virtualAccountId | string | Yes | Unique ID of the now-active virtual account. |
customerId | string | Yes | Customer who owns this virtual account. |
asset | object | Yes | Asset this virtual account holds. |
asset.code | enum: “USD” | “EUR” | “GBP” | “CHF” | “JPY” | “CAD” | “AUD” | “NZD” | “SGD” | “HKD” | “CNY” | “KRW” | “INR” | “BRL” | “MXN” | “ARS” | “CLP” | “COP” | “PEN” | “ZAR” | “NGN” | “KES” | “GHS” | “EGP” | “AED” | “SAR” | “ILS” | “TRY” | “PLN” | “CZK” | “HUF” | “SEK” | “NOK” | “DKK” | “THB” | “IDR” | “MYR” | “PHP” | “VND” | “TWD” | “USDC” | “USDT” | “DAI” | “EURC” | “PYUSD” | “OUSD” | “BTC” | “ETH” | “SOL” | “TRX” | “XLM” | “POL” | Yes | Asset code (USDC, USD, etc.) |
asset.chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | No | Chain when the asset is on-chain; omitted for fiat |
activatedAt | string | Yes | ISO-8601 timestamp when the virtual account became active. |
wallet_ceremony.awaiting_admin_approval
Fired when a non-custodial wallet ceremony (roster add/remove, quorum change) is waiting for a customer admin’s passkey co-stamp to reach quorum. CarriesadminVerificationUrl — the Conduit-hosted approval page to route the admin to — and expiresAt, after which the ceremony auto-fails and must be resubmitted. For promote/remove ceremonies this webhook is the only channel that delivers the approval URL. (An extra passkey for a signer who is already enrolled parks on a separate wallet_signer.awaiting_admin_approval event instead.) With white-label custom domains, a webauthn_origin_change ceremony (the change of the wallet’s passkey origin at custom-domain activation or off-boarding) also flows through this event, so type gained the webauthn_origin_change value. An organization only receives that value once it uses a custom domain and Conduit has enabled origin-change ceremonies for its environment; consumers parsing type exhaustively should add the value before adopting the feature.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_ceremony.awaiting_admin_approval",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"ceremonyId": "wcy_2xKjF9mQb7vN4hL1pR3w8t",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"type": "signing_quorum_change",
"adminVerificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"expiresAt": "2026-01-15T10:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
ceremonyId | string | Yes | Unique ID of the ceremony awaiting admin approval. |
walletId | string | Yes | Wallet associated with this ceremony. |
customerId | string | Yes | Customer who owns this wallet. |
type | enum: “wallet_create” | “signing_quorum_change” | “root_quorum_update” | “recovery” | “roster_add” | “roster_remove” | “webauthn_origin_change” | Yes | Type of ceremony requiring admin approval. |
adminVerificationUrl | string | null | Yes | Conduit-hosted URL to route a customer admin to for the co-stamp. The only delivery channel for promote/remove ceremonies (whose API response carries no URL). Null when a URL cannot be resolved. |
expiresAt | string | Yes | ISO-8601 deadline — ceremony auto-fails if quorum is not reached by this time. |
wallet_ceremony.completed
Fired when a non-custodial wallet ceremony completes successfully. All roster or quorum changes requested by the ceremony are now in effect. With white-label custom domains, awebauthn_origin_change ceremony (the change of the wallet’s passkey origin at custom-domain activation or off-boarding) also flows through this event, so type gained the webauthn_origin_change value. An organization only receives that value once it uses a custom domain and Conduit has enabled origin-change ceremonies for its environment; consumers parsing type exhaustively should add the value before adopting the feature.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_ceremony.completed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"ceremonyId": "wcy_2xKjF9mQb7vN4hL1pR3w8t",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"type": "signing_quorum_change",
"status": "completed"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
ceremonyId | string | Yes | Unique ID of the completed ceremony. |
walletId | string | Yes | Wallet associated with this ceremony. |
customerId | string | Yes | Customer who owns this wallet. |
type | enum: “wallet_create” | “signing_quorum_change” | “root_quorum_update” | “recovery” | “roster_add” | “roster_remove” | “webauthn_origin_change” | Yes | Type of ceremony. |
status | enum: “completed” | Yes | Terminal status. Always completed on this event. |
wallet_ceremony.failed
Fired when a non-custodial wallet ceremony expires or fails. Any reserved resources have been released.status is failed on expiry or unrecoverable error; cancelled when the ceremony was explicitly cancelled. With white-label custom domains, a webauthn_origin_change ceremony (the change of the wallet’s passkey origin at custom-domain activation or off-boarding) also flows through this event, so type gained the webauthn_origin_change value. An organization only receives that value once it uses a custom domain and Conduit has enabled origin-change ceremonies for its environment; consumers parsing type exhaustively should add the value before adopting the feature.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_ceremony.failed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"ceremonyId": "wcy_2xKjF9mQb7vN4hL1pR3w8t",
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"type": "signing_quorum_change",
"status": "failed"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
ceremonyId | string | Yes | Unique ID of the failed ceremony. |
walletId | string | Yes | Wallet associated with this ceremony. |
customerId | string | Yes | Customer who owns this wallet. |
type | enum: “wallet_create” | “signing_quorum_change” | “root_quorum_update” | “recovery” | “roster_add” | “roster_remove” | “webauthn_origin_change” | Yes | Type of ceremony. |
status | enum: “failed” | “cancelled” | Yes | Terminal failure status. failed when the ceremony expired or encountered an unrecoverable error; cancelled when it was explicitly cancelled. |
wallet_signer.added
Fired when a wallet signer row is created on the roster (immediately at invite time, status pending_activation) — co-emitted withwallet_signer.invited from the same outbox transaction. Distinct from wallet_signer.invited (which carries the verification URL) and wallet_signer.enrolled (sent later when the signer completes credential enrollment).
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.added",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "signer@example.com",
"role": "signer",
"credentialType": "passkey",
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
credentialType | enum: “passkey” | “api_key” | Yes | Credential type the signer enrolled. |
wallet_signer.awaiting_admin_approval
Fired when an extra passkey for a signer who is already enrolled — a second device, for example — parks for a customer admin’s co-stamp. CarriessignerId + customerId (the signer’s identity — no walletId, since a signer’s roster can back several wallets), adminVerificationUrl — the Conduit-hosted approval page to route an admin to — and expiresAt, after which the pending add auto-fails. This is the only channel that delivers this admin link; if it is lost, recover it with POST /v2/customers/:customerId/wallet-signers/:signerId/reissue-admin-approval. (A new signer joining the roster, and any other roster or quorum change, instead uses wallet_ceremony.awaiting_admin_approval.)
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.awaiting_admin_approval",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"signerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"adminVerificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"expiresAt": "2026-01-15T10:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
signerId | string | Yes | The signer whose passkey add to a live roster is awaiting a customer admin’s co-stamp. Pass it to POST /v2/customers/:customerId/wallet-signers/:signerId/reissue-admin-approval to recover the link. |
customerId | string | Yes | Customer who owns the signer. The signer is identified by signerId + customerId; this topic carries no walletId — a signer’s roster can back several wallets, so no single wallet applies. |
adminVerificationUrl | string | null | Yes | Conduit-hosted URL to route a customer admin to for the co-stamp. Null when a URL cannot be resolved. |
expiresAt | string | Yes | ISO-8601 deadline — the pending approval auto-fails if it is not co-stamped by this time. |
wallet_signer.demoted
Fired when an admin becomes a signer because a promoted signer replaced it in the same ceremony.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.demoted",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "signer@example.com",
"role": "signer",
"previousRole": "admin",
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
previousRole | ”admin” | Yes | Role the signer held before demotion. |
wallet_signer.enrolled
Fired when a wallet signer completes credential enrollment via the verification URL.passkeyCount reflects the number of passkeys registered for passkey signers.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.enrolled",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "signer@example.com",
"role": "signer",
"passkeyCount": 1,
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
passkeyCount | integer | No | Number of passkeys the signer has enrolled. Present when credentialType is passkey. |
wallet_signer.enrollment_approved
Fired when a customer admin’s co-stamp approves a signer’s credential ceremony — a newcomer’s first passkey, or an existing signer adding a device. The post-approval counterpart towallet_ceremony.awaiting_admin_approval. Carries approvedByWalletSignerId (the approving admin) and approvedAt. Distinct from wallet_signer.enrolled, which fires when the signer submits their credential; this fires only once the admin approves it.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.enrollment_approved",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "signer@example.com",
"role": "signer",
"credentialType": "passkey",
"approvedByWalletSignerId": "wsg_9aLmN2pQr5sT8uV1wX4yZ7",
"approvedAt": "2026-01-15T10:32:00.000Z",
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
credentialType | enum: “passkey” | “api_key” | Yes | Credential type the newcomer enrolled. |
approvedByWalletSignerId | string | null | Yes | Wallet-signer ID of the admin whose co-stamp approved the newcomer’s credential. Null when attribution could not be resolved. |
approvedAt | string | Yes | ISO-8601 timestamp when the admin approved the credential. |
wallet_signer.invited
Fired when a wallet signer is invited to enroll their credential. Payload carries the per-signer enrollment verificationUrl the fintech distributes out-of-band, plus expiresAt — after which the invitation auto-expires.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.invited",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "signer@example.com",
"name": "Jane Doe",
"role": "signer",
"credentialType": "passkey",
"verificationUrl": "https://app.conduit.financial/verify/f7iKXgpCNdXOLh1ml4j5WXAuowNMIt5FXwyVr7TGNk0",
"expiresAt": "2026-01-22T09:30:00.000Z",
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
name | string | No | Display name of the signer, if provided at invite time. |
credentialType | enum: “passkey” | “api_key” | Yes | Credential type the signer will enroll. |
verificationUrl | string | Yes | Conduit-hosted enrollment URL the fintech routes the signer to. One URL per invited signer, distributed out-of-band. |
expiresAt | string | Yes | ISO-8601 deadline, 7 days after the invitation is sent — the invitation auto-expires if the signer has not enrolled by this time. |
wallet_signer.promoted
Fired when a wallet signer is promoted to admin in place of another admin, who becomes a signer in the same ceremony. A passkey admin must have at least 2 passkeys enrolled; a machine (api_key) admin needs none and is allowed only in the fully-automated signing mode.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.promoted",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "admin@example.com",
"role": "admin",
"previousRole": "signer",
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
previousRole | ”signer” | Yes | Role the signer held before promotion. |
wallet_signer.recovery_opened
Fired when Conduit issues a passkey recovery link for a signer who lost a passkey: on POST /v2/customers/:customerId/wallet-signers/:signerId/recovery, when the signer starts a recovery from their signer profile, or when Conduit support issues the link. CarriesverificationUrl, the link to route the signer to, and its expiresAt. The recovery then reports on the wallet_ceremony.* events with type recovery and the same ceremonyId: awaiting_admin_approval when a signer who is not an admin needs an admin approval, completed once the lost passkey is replaced, and failed if it stops.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.recovery_opened",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"signerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"ceremonyId": "wcy_2xKjF9mQb7vN4hL1pR3w8t",
"verificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw",
"expiresAt": "2026-01-15T10:30:00.000Z"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
signerId | string | Yes | The signer who lost a passkey. Pass it to POST /v2/customers/:customerId/wallet-signers/:signerId/recovery to get a fresh link. |
customerId | string | Yes | Customer who owns the signer. |
ceremonyId | string | Yes | Recovery ceremony. The later wallet_ceremony.* events of type recovery carry the same id. |
verificationUrl | string | Yes | Conduit-hosted recovery link to route the signer to. The signer creates the new passkey and confirms the change with the passkey they kept. |
expiresAt | string | Yes | ISO-8601 deadline of the link. After it, get a fresh link from the start endpoint. |
wallet_signer.removed
Fired when a wallet signer is removed from the roster.reason discriminates between customer-initiated removal (customer_removed) and internal ops removal (ops_removed). Pending payouts carrying the removed signer’s stamp are voided with failureCode roster_changed.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet_signer.removed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"walletSignerId": "wsg_2xKjF9mQb7vN4hL1pR3w8t",
"email": "signer@example.com",
"role": "signer",
"reason": "customer_removed",
"clientReferenceId": "ext-signer-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | Customer the signer belongs to. |
walletSignerId | string | Yes | Unique ID of the wallet signer. |
email | string | Yes | Email address of the signer. |
role | enum: “admin” | “signer” | Yes | Roster role of the signer. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
reason | enum: “customer_removed” | “ops_removed” | “claim_reset” | Yes | Why the signer was removed: customer_removed — a customer admin removed them via a roster ceremony; ops_removed — an internal ops action; claim_reset — the customer’s entire crypto-wallet claim was reset, tearing down the roster. |
wallet.awaiting_setup_signature
Fired when a new non-custodial wallet on a chain that needs a one-time on-chain setup (Stellar) waits for the customer’s signers to approve that setup. The signers approve it like a payout, at the same signing threshold. The setup moves no customer funds. The wallet readspending until the setup lands, then wallet.created fires. The payload is discriminated by signingMode, as transaction.awaiting_signature is.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet.awaiting_setup_signature",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"chain": "stellar",
"address": "GBEI2CAKY3H7KZTXY7SFXJLWVZVGOLVLENVRFX75AO6H7J7ZR4SVNZFJ",
"requiredApprovals": 1,
"expiresAt": "2026-01-15T10:30:00.000Z",
"signingMode": "passkey_required",
"verificationUrl": "https://app.conduit.financial/verify/mtQzSU2hdy0DuZ6za2IHIoVDgXzshrFtN38kMULRDFw"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
walletId | string | Yes | Wallet whose one-time setup waits for signatures. |
customerId | string | Yes | Customer who owns this wallet. |
chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | Yes | Blockchain network of the wallet. |
address | string | Yes | On-chain address of the wallet. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
requiredApprovals | integer | Yes | Signer stamps required to approve the setup. |
expiresAt | string | Yes | ISO-8601 deadline for this setup request. After it the wallet stays pending until Conduit opens a new request. |
signingMode | enum: “passkey_required” | “programmatic” | “programmatic_unattended” | Yes | Discriminates the payload variant (one of passkey_required, programmatic, programmatic_unattended). See the per-variant fields below. |
verificationUrl | string | Yes when signingMode = passkey_required; optional otherwise | Conduit-hosted URL to route your human signers to. |
signingRequestId | string | Yes when signingMode = programmatic or programmatic_unattended | Signing-request id. Your server reads it with GET /v2/signing-requests/ and approves via POST /v2/signing-requests//approve. Present only when signingMode is programmatic or programmatic_unattended. |
wallet.created
Fired when a crypto wallet is created and can receive. A non-custodial wallet on a chain that needs a one-time on-chain setup (Stellar) gets it when that setup lands, afterwallet.awaiting_setup_signature. Not delivered for the Conduit-managed funding address behind a deposit-funded order — that address is not a wallet resource, and the order’s depositInstructions publishes it instead.
{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet.created",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"chain": "ethereum",
"address": "0x742d35cc6634c0532925a3b8d4c9c2c7a3b3d7e1",
"custodyModel": "non_custodial",
"clientReferenceId": "ext-wallet-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
walletId | string | Yes | Unique ID of the newly created wallet. |
customerId | string | Yes | Customer who owns this wallet. |
chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | Yes | Blockchain network this wallet operates on. |
address | string | Yes | On-chain address of the wallet. |
custodyModel | enum: “non_custodial” | “custodial” | No | non_custodial — the customer co-signs each payout via the verify URL. custodial is a return-only value for legacy/operational wallets. Omitted until the custody model is determined. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
wallet.deleted
Fired when a crypto wallet is deleted (currently only via a crypto-wallet claim reset). Integrators mirroring wallet state must remove the corresponding record. Not delivered for a Conduit-managed deposit address, whose creation was never announced either.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet.deleted",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"chain": "ethereum",
"address": "0x742d35cc6634c0532925a3b8d4c9c2c7a3b3d7e1",
"reason": "claim_reset",
"clientReferenceId": "ext-wallet-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
walletId | string | Yes | Unique ID of the deleted wallet. |
customerId | string | Yes | Customer who owned this wallet. |
chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | Yes | Blockchain network this wallet operated on. |
address | string | Yes | On-chain address of the deleted wallet. |
reason | enum: “claim_reset” | Yes | Why the wallet was deleted. claim_reset — the customer’s crypto-wallet claim was reset, removing every wallet and signer. Integrators mirroring wallet state must drop the corresponding record. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
wallet.rotated
Fired when a crypto wallet is rotated. Not delivered for the Conduit-managed funding address behind a deposit-funded order: Conduit may replace that address at any time without notice, so read it off each order rather than tracking it per customer.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet.rotated",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"replacedByWalletId": "wlt_3yLkG0nRc8wO5iM2qS4x9u",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"chain": "ethereum",
"custodyModel": "non_custodial",
"rotatedAt": "2026-01-15T09:30:00.000Z",
"clientReferenceId": "ext-wallet-001"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
walletId | string | Yes | Unique ID of the wallet that was rotated (now inactive). |
replacedByWalletId | string | Yes | Unique ID of the new wallet that replaced this one. |
customerId | string | Yes | Customer who owns this wallet. |
chain | enum: “ethereum” | “base” | “solana” | “polygon” | “tron” | “stellar” | “tempo” | “arbitrum” | Yes | Blockchain network this wallet operates on. |
custodyModel | enum: “non_custodial” | “custodial” | No | non_custodial — the customer co-signs each payout on the replacement wallet (replacedByWalletId). custodial is a return-only value for legacy/operational wallets. Omitted when unknown. |
rotatedAt | string | Yes | ISO-8601 timestamp when the wallet was rotated. |
clientReferenceId | string | No | Caller-supplied external reference, if provided. |
wallet.threshold_changed
Fired when a wallet’s signing threshold changes — the number of admin stamps required to authorize a payout. Triggered by a completed SIGNING_QUORUM_CHANGE ceremony or an operator quorum override.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "wallet.threshold_changed",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"walletId": "wlt_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"threshold": 2
}
}
| Field | Type | Required | Description |
|---|---|---|---|
walletId | string | Yes | Wallet whose signing threshold changed. |
customerId | string | Yes | Customer who owns this wallet. |
threshold | integer | Yes | New signing threshold (number of admin stamps required to authorize a payout). |
whitelist_recipient.registered
Fired when compliance approves a pending intercompany whitelist registration. The recipient can now receive purpose=intercompany payouts for this customer, and purpose=personal_transfer_of_funds payouts when its relationship is self.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "whitelist_recipient.registered",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"whitelistRecipientId": "wlr_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"rail": "us",
"relationship": "group_entity",
"status": "registered",
"holderName": "Acme Treasury Inc",
"label": "acme-us-treasury"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
whitelistRecipientId | string | Yes | Unique ID of the whitelist recipient entry. |
customerId | string | Yes | Customer who owns this whitelist entry. |
rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Payment rail for this whitelist entry. A crypto entry is a group entity’s on-chain wallet. Switch on the value rather than assuming the set is closed. |
relationship | enum: “self” | “group_entity” | Yes | Intercompany relationship between the customer and the recipient. |
status | enum: “pending_review” | “registered” | “suspended” | “revoked” | “rejected” | Yes | Current status of the whitelist entry. Matches the status field on GET /v2/customers/:customerId/whitelist-recipients/:id. |
holderName | string | Yes | Legal name of the account holder. |
label | string | null | Yes | Optional caller-assigned label for this entry. |
whitelist_recipient.rejected
Fired when compliance rejects a pending registration.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "whitelist_recipient.rejected",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"whitelistRecipientId": "wlr_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"rail": "us",
"relationship": "group_entity",
"status": "rejected",
"holderName": "Acme Treasury Inc",
"label": "acme-us-treasury"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
whitelistRecipientId | string | Yes | Unique ID of the whitelist recipient entry. |
customerId | string | Yes | Customer who owns this whitelist entry. |
rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Payment rail for this whitelist entry. A crypto entry is a group entity’s on-chain wallet. Switch on the value rather than assuming the set is closed. |
relationship | enum: “self” | “group_entity” | Yes | Intercompany relationship between the customer and the recipient. |
status | enum: “pending_review” | “registered” | “suspended” | “revoked” | “rejected” | Yes | Current status of the whitelist entry. Matches the status field on GET /v2/customers/:customerId/whitelist-recipients/:id. |
holderName | string | Yes | Legal name of the account holder. |
label | string | null | Yes | Optional caller-assigned label for this entry. |
whitelist_recipient.revoked
Fired when an entry is revoked (terminal; client-initiated or compliance action).{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "whitelist_recipient.revoked",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"whitelistRecipientId": "wlr_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"rail": "us",
"relationship": "group_entity",
"status": "revoked",
"holderName": "Acme Treasury Inc",
"label": "acme-us-treasury"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
whitelistRecipientId | string | Yes | Unique ID of the whitelist recipient entry. |
customerId | string | Yes | Customer who owns this whitelist entry. |
rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Payment rail for this whitelist entry. A crypto entry is a group entity’s on-chain wallet. Switch on the value rather than assuming the set is closed. |
relationship | enum: “self” | “group_entity” | Yes | Intercompany relationship between the customer and the recipient. |
status | enum: “pending_review” | “registered” | “suspended” | “revoked” | “rejected” | Yes | Current status of the whitelist entry. Matches the status field on GET /v2/customers/:customerId/whitelist-recipients/:id. |
holderName | string | Yes | Legal name of the account holder. |
label | string | null | Yes | Optional caller-assigned label for this entry. |
whitelist_recipient.suspended
Fired when an active entry is suspended — it no longer satisfies intercompany or personal_transfer_of_funds payouts.{
"id": "evt_2xKjF9mQb7vN4hL1pR3w8t",
"type": "whitelist_recipient.suspended",
"createdAt": "2026-01-15T09:30:00.000Z",
"apiVersion": "2",
"mode": "live",
"data": {
"whitelistRecipientId": "wlr_2xKjF9mQb7vN4hL1pR3w8t",
"customerId": "cus_2xKjF9mQb7vN4hL1pR3w8t",
"rail": "us",
"relationship": "group_entity",
"status": "suspended",
"holderName": "Acme Treasury Inc",
"label": "acme-us-treasury"
}
}
| Field | Type | Required | Description |
|---|---|---|---|
whitelistRecipientId | string | Yes | Unique ID of the whitelist recipient entry. |
customerId | string | Yes | Customer who owns this whitelist entry. |
rail | enum: “us” | “swift” | “sepa” | “uk_domestic” | “crypto” | Yes | Payment rail for this whitelist entry. A crypto entry is a group entity’s on-chain wallet. Switch on the value rather than assuming the set is closed. |
relationship | enum: “self” | “group_entity” | Yes | Intercompany relationship between the customer and the recipient. |
status | enum: “pending_review” | “registered” | “suspended” | “revoked” | “rejected” | Yes | Current status of the whitelist entry. Matches the status field on GET /v2/customers/:customerId/whitelist-recipients/:id. |
holderName | string | Yes | Legal name of the account holder. |
label | string | null | Yes | Optional caller-assigned label for this entry. |