Skip to main content
Every event Meow sends has the same envelope. The data object is the resource snapshot (or {id, object} in thin mode). The lifecycle stage lives on data.status — dispatch on that, not the event name.
Envelope
{
  "type": "ach_transfer.updated",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": { "...": "..." },
  "sequence": 4
}
sequence is a per-resource counter for discarding stale deliveries — see Handle out-of-order deliveries. It rides resource events and is absent on webhook.test, message.attempt.exhausted, and partner application.* events. ID shapes.
  • Meow-managed IDs (entity_id, account_id, counterparty_id, virtual_account_id, subscription_id, delivery_id) are UUIDs.
  • Resource IDs (ach_transfer.id, wire_transfer.id, inbound transaction id, check_deposit.id, global_account_transfer.id) are opaque strings whose format varies by the underlying bank:
    • CRB / FirstBank: deposit_inach_11mn5s777xgveb9, withdrawal_txc_15wp3bd309xenf6p, book_11n0b3vs9vy0ypw, interest_txc_15wp2ghq09qm3141.
    • Bridge global accounts: bridge_va_inach_<uuid> (incoming ACH), bridge_va_iw_<uuid> (incoming wire), bridge_wallet_ext_ach_<uuid> (external ACH off-ramp), bridge_wallet_ext_wire_<uuid> (external wire), wallet_transfer_group_<uuid> / wallet_deposit_group_<uuid> (wallet send / receive).
    • Treasury Prime: TP’s own external IDs.
    Treat resource IDs as tokens; don’t parse them.
EventWhen it fires
ach_transfer.createdA new outbound ACH transfer was created.
ach_transfer.updatedAn outbound ACH transfer changed state.
wire_transfer.createdA new outbound wire was created.
wire_transfer.updatedAn outbound wire changed state.
inbound_ach_transfer.createdAn ACH credit or debit hit your account.
inbound_ach_transfer.updatedAn inbound ACH changed state.
inbound_wire_transfer.createdA wire arrived at your account.
inbound_wire_transfer.updatedAn inbound wire changed state.
check_deposit.createdA check deposit was submitted.
check_deposit.updatedA check deposit changed state.
global_account_transfer.createdActivity on a global (virtual) account. Single-emission.
webhook.testA test event you triggered.
message.attempt.exhaustedA delivery hit 10 failed attempts and the subscription was auto-disabled.
Partner subscriptions (partner:webhooks:*) receive a separate catalog — the application.* onboarding events below. The two catalogs don’t overlap: an entity subscription can’t subscribe to application.*, and a partner subscription can’t subscribe to the rail events above. Listing the wrong catalog’s events in event_types returns a 400.
EventWhen it fires
application.createdA partner created an onboarding application.
application.under_reviewKYB review is pending.
application.submittedKYB approved; the banking account is not yet active.
application.approvedOnboarding finished — the account is active.
application.rejectedThe application was rejected.

ach_transfer

status values: pending, processing, sent, returned, canceled, error. Optional fields not shown in the sample: operation_request_id.
{
  "type": "ach_transfer.updated",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": {
    "id": "withdrawal_txc_15wp3bd309xenf6p",
    "object": "ach_transfer",
    "created": "2026-04-28T07:59:50Z",
    "updated": "2026-04-28T08:00:00Z",
    "entity_id": "6f3b1d7c-aa90-4f0c-a5d2-9c8b1d3e2c10",
    "status": "sent",
    "amount": "1500.00",
    "counterparty_id": "5dada3c2-7f3a-4f2e-8a91-3d6f1c9b9e22",
    "counterparty_name": "Acme Corp",
    "counterparty_account_number": "****1234",
    "counterparty_routing_number": "021000021",
    "description": "April invoice",
    "error": null
  }
}

wire_transfer

Same status values as ach_transfer. Extra wire-only fields: counterparty_bank_name, purpose, imad (Fed reference), instructions.
{
  "type": "wire_transfer.updated",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": {
    "id": "wire_dom_a8e9c7d24b1f4a3e8a91d9e87c5b9001",
    "object": "wire_transfer",
    "created": "2026-04-28T07:59:50Z",
    "updated": "2026-04-28T08:00:00Z",
    "entity_id": "6f3b1d7c-aa90-4f0c-a5d2-9c8b1d3e2c10",
    "status": "sent",
    "amount": "10000.00",
    "counterparty_id": "5dada3c2-7f3a-4f2e-8a91-3d6f1c9b9e22",
    "counterparty_name": "Acme Corp",
    "counterparty_bank_name": "JPMorgan Chase",
    "purpose": "Q2 settlement",
    "imad": "20260428B1QGC07C012345"
  }
}

inbound_ach_transfer

status values: pending, posted, scheduled, failed, canceled, returned. Casing matches outbound (lowercase on the wire).
{
  "type": "inbound_ach_transfer.updated",
  "timestamp": "2026-04-28T14:00:00Z",
  "data": {
    "id": "deposit_inach_11mn5s777xgveb9",
    "object": "inbound_ach_transfer",
    "created": "2026-04-28T13:59:00Z",
    "updated": "2026-04-28T14:00:00Z",
    "entity_id": "6f3b1d7c-aa90-4f0c-a5d2-9c8b1d3e2c10",
    "account_id": "a8e9c7d2-4b1f-4a3e-8a91-d9e87c5b9001",
    "amount": "250.00",
    "currency": "USD",
    "status": "posted",
    "originator_name": "Stripe Connect"
  }
}

inbound_wire_transfer

Same shape as inbound ACH; object is inbound_wire_transfer.

check_deposit

Same shape as inbound ACH; object is check_deposit.

global_account_transfer

Activity on a global (virtual) account. Each activity is one-shot — funds_scheduled and funds_received for the same deposit share deposit_id but arrive as two separate events with different ids. activity_type values: funds_scheduled, funds_received, payment_submitted, payment_processed, refund_in_flight, refunded, refund_failed. currency is lowercase: usd, usdc, usdt, usdb, usdg, pyusd, dai, cash.
{
  "type": "global_account_transfer.created",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": {
    "id": "bridge_va_inach_f5140b06-814e-4f4b-810b-217859d7b721",
    "object": "global_account_transfer",
    "created": "2026-04-28T08:00:00Z",
    "updated": null,
    "entity_id": "6f3b1d7c-aa90-4f0c-a5d2-9c8b1d3e2c10",
    "virtual_account_id": "9b3a7c5e-1d20-4a6f-8c1d-e7b34f25a8e9",
    "activity_type": "funds_received",
    "amount": "5000.00",
    "currency": "usdc",
    "payment_rail": null
  }
}

webhook.test

Triggered manually via POST /webhooks/subscriptions/{id}/test. Always sent in full (the thin mode falls through because there’s no id to GET).
{
  "type": "webhook.test",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": {
    "subscription_id": "7b9e8a5f-3c2d-4d11-9a8c-1e6c4f2a5b30",
    "entity_id": "6f3b1d7c-aa90-4f0c-a5d2-9c8b1d3e2c10",
    "generated_at": "2026-04-28T08:00:00Z"
  }
}

message.attempt.exhausted

Fires when a delivery hits 10 failed attempts. The subscription is auto-disabled (disabled_reason=retry_exhausted). Use this to page an on-call. last_response_status is null if every attempt failed before getting an HTTP response (timeout, DNS, TLS).
{
  "type": "message.attempt.exhausted",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": {
    "delivery_id": "0c5b4a3e-9d2c-4f1a-b7e0-21b1d8c4a9f1",
    "subscription_id": "7b9e8a5f-3c2d-4d11-9a8c-1e6c4f2a5b30",
    "event_type": "ach_transfer.updated",
    "attempt_count": 10,
    "last_response_status": 504,
    "last_error_message": "Your endpoint did not respond within the timeout."
  }
}

application

Delivered to partner subscriptions only. Each event reports an onboarding application reaching a new status; the event name and data.status always match. application_id is the application identifier (the KYB info public id); entity_id is the onboarded business, present on every event including application.created. previous_status is null only on application.created. status values: pending_document_upload, pending_user_action, under_review, submitted, approved, rejected. Note submitted sits later in the lifecycle than under_reviewunder_review means KYB review is pending, submitted means KYB approved but the account is not yet active. Unlike the rail events, application.* events carry no sequence and are always delivered as a full snapshot (partner subscriptions don’t support thin mode).
{
  "type": "application.approved",
  "timestamp": "2026-04-28T08:00:00Z",
  "data": {
    "application_id": "8f2a1c4d-3b9e-4a7c-9d18-2e6c4f0a5b31",
    "entity_id": "6f3b1d7c-aa90-4f0c-a5d2-9c8b1d3e2c10",
    "partner_reference_id": "your-internal-ref-001",
    "status": "approved",
    "previous_status": "submitted",
    "business_name": "Acme Corp"
  }
}