Skip to main content
New Feature
Payments: attach your own metadata for reconciliation
  • ACH, wire, book, crypto, international, and scheduled ACH create requests accept a metadata object with up to 20 string pairs and a 5 KB total limit.
  • Meow returns the metadata unchanged in create responses, approval reads, payment reads, and snapshot webhook events. A scheduled ACH payment inherits the schedule’s metadata.
  • Use metadata to carry identifiers from your system without parsing a payment description. Guide.
Breaking ChangeImprovement
Crypto transfers: a refund in flight is told apart from a refund that landed
  • Breaking: returned now means only that the refund reached the sender. A transfer whose delivery failed and whose refund is still moving reports refunding and then returned when the money is back. Previously both stages reported returned, so a consumer could not tell an owed refund from a settled one. Reconcile on returned, and treat refunding as in-flight.
  • Breaking: a transfer the network could not deliver now reports refunding rather than failed, because a refund follows it. failed is now reserved for a transfer that ended with no refund in progress. A consumer that alerted on failed for undeliverable transfers should read refunding instead.
  • The status values are unchanged; what changed is which provider states map onto them. Catalog.
  • GET /accounts/{account_id}/crypto/{transaction_id} follows the same split: an in-flight refund reads processing and only a settled refund reads returned.
  • The inbound id is the deposit’s own identifier, an unprefixed UUID. The event catalog example previously showed a prefixed form that the API does not emit.
Breaking ChangeNew FeatureImprovement
Information requests: explain a document you cannot provide, and read what is outstanding as data
  • POST /entities/{entity_id}/info-requests/{request_id} accepts unavailable_proof_explanations, keyed by proof_type. An accepted explanation settles that document exactly as an upload does, so a request for a document the business cannot produce no longer stays open forever. Guide.
  • answers on that endpoint is now optional, so a request that asks no questions can be settled with explanations alone.
  • Breaking: outstanding changes from a list of strings to a list of objects with kind, proof_type, and detail, on both EntityInfoRequestAnswersResponse and the info_request.created / info_request.updated webhook payloads. detail carries the previous string unchanged, so matching on kind and proof_type replaces parsing prose.
  • outstanding is also reported per request on next_step.info_requests[]. Reference.
  • Outstanding documents now name the proof type in the same public vocabulary as required_proof_types. Previously an item could read “Uk Shareholder Registry” beside a required_proof_types of shareholder_registry.
  • GET /entities/{entity_id}/info-requests/{request_id}/schema now returns a description on each file_upload element, carrying the same explanation the Meow dashboard shows. Reference.
Breaking ChangeNew FeatureImprovement
Crypto transfers: one bidirectional lifecycle webhook
  • crypto_deposit.created and crypto_deposit.updated are replaced by crypto_transfer.created and crypto_transfer.updated. This is a breaking rename with no compatibility period. Existing subscriptions are migrated to the new event names. Update consumers before deployment; queued legacy events are not translated to the new payload.
  • The data.object value is now crypto_transfer. direction identifies inbound deposits and outbound sends. deposit_tx_hash is renamed to source_tx_hash.
  • Wallet-funded and direct bank-funded outbound sends now emit lifecycle updates from Bridge provider state changes. Catalog.
  • GET /accounts/{account_id}/crypto/{transaction_id} now includes status for incoming and outgoing transactions. Reference.
  • GET /accounts/{account_id}/transactions?deposit_tx_hash=... now resolves deposits into bank accounts as well as global accounts.
  • Crypto transfer events include account_id. Webhook subscriptions are entity-scoped, so every matching subscription for the entity receives the event. Use account_id to route it.
New Feature
Bill Pay: pay a vendor in stablecoin
  • POST /bills and PATCH /bills/{bill_id} accept payment_type: "CRYPTO" with a crypto_contact_destination_id, one of the vendor’s saved crypto addresses from the contact’s payment_methods.crypto[].id. The bill stays a draft for dashboard approval, as every bill created through the API does. A crypto bill must be in USD. Reference, Guide.
  • GET /bills/{bill_id} returns bill_payment_details.crypto_destination, the address a crypto bill will pay.
  • The same fields are available through the create_bill and update_bill MCP tools.
New Feature
Transfers: pay a contact in their own currency
  • POST /accounts/{account_id}/international sends a payment in the recipient’s local currency, converting from US dollars at the rate quoted when you call. Fix either leg: pass recipient_amount to send an exact amount in their currency, or source_amount to spend an exact number of dollars. Reference, Guide.
  • POST /accounts/{account_id}/international/quote prices a payment without sending it, returning the rate, the fee and the total_debit so you can show them before committing. It reserves nothing, and the payment is priced again when you send, so figures can move with the rate. Reference.
  • GET /contacts/international-requirements reports the fields a destination needs, given a currency and bank country. Destinations differ: some route on an IBAN, others on a domestic routing code, and some want the recipient’s address. Check supported first, since not every currency reaches every country. Reference.
  • POST /contacts accepts international alongside counterparty and crypto_address, carrying the bank details those requirements ask for. Provide exactly one of the three. Reference.
  • To send US dollars instead, including to a bank outside the US, keep using POST /accounts/{account_id}/wire.
Accounts: convert incoming crypto to USD automatically
  • POST /accounts/{account_id}/liquidation-addresses creates a blockchain address that converts cryptocurrency sent to it into USD and deposits it into the account you name. Repeating the same account, network and currency returns the address that already exists rather than creating another. Reference.
New FeatureImprovement
Onboarding: see which agreements an application still owes
  • GET /entities/{entity_id} now returns consent, carrying status, consented_items, remaining_items, viewed_at and completed_at. Poll it to see whether the primary representative has finished the agreements behind consent_url. Reference.
  • next_step.step reports accept_terms after you submit while agreements are outstanding, and lists the outstanding ones in next_step.missing. It moves on to monitor_review once they are all accepted.
  • Previously a submitted application reported monitor_review with nothing missing even when every agreement was still unaccepted, so there was no way to tell from the API that it was waiting on the representative.
Transfers: send USDC over XDC
  • BlockchainNetwork accepts XDC, and PaymentMethodType accepts USDC_XDC.
Contacts: a contact returns its address
  • address on a contact now returns the full address object rather than being omitted.
New FeatureImprovement
Transfers: read incoming crypto deposits, and tell the two directions apart
  • GET /accounts/{account_id}/crypto/{transaction_id} now returns incoming deposits as well as outgoing transfers. An inbound deposit carries source_address, the on-chain address the funds came from, and source_tx_hash, the deposit’s on-chain hash. Use them to match a deposit to whoever sent it. Reference.
  • source_address is null when the sender is not known to us, so treat a null as “unattributed” rather than assuming an address is always present.
  • Pass the transaction ID that List Transactions reports. The same ID comes back on the response, so you can fetch the transfer again with it. Reference.
  • Every transfer response now carries direction, either inbound or outbound. ACH and wire have returned both directions for a while, and the field says which one you are looking at instead of leaving you to infer it. ACH, Wire.
  • On an inbound wire, counterparty_account_number, counterparty_routing_number and counterparty_bank_name are now null when the bank did not report them, where they previously came back as empty strings. purpose is null inbound, since a purpose is something you state when sending.
Idempotency: crypto and USDC transfers accept the key
  • POST /accounts/{account_id}/crypto and POST /accounts/{account_id}/usdc accept the Idempotency-Key header, so a retried send cannot create a second transfer. It is optional for now and will become required. Reference.
New Feature
Accounts: correlate a new account with your own reference
  • POST /accounts accepts an optional reference_id, your own identifier of up to 255 characters. It comes back on the create response, on GET /accounts and GET /accounts/{account_id} as referenceId, and in the account.created / account.updated webhooks. Reference.
  • This is how you match an account to the request that opened it. It matters most for products that open in the background: that response carries no account_id, so the reference is the only thing tying the later account.created event to your call. Catalog.
  • It is a label, not an idempotency key, so reuse it freely. Use the Idempotency-Key header to make a retry safe.
New FeatureImprovementDeprecated
Idempotency: send the key in the Idempotency-Key header
  • Every write that accepts an idempotency key now takes it in the Idempotency-Key header: 1-50 printable ASCII characters, no spaces. Reusing a key is rejected with a 400.
  • POST /accounts now requires the header. Opening an additional account was previously unguarded, so a retried request could open a second account. Reference.
  • Transfers and Bill Pay accept the header today; their idempotency_key body field is deprecated but still works. When you send both, they must match. Transfers, Bill Pay.
  • Webhook writes already required the header, and the guide’s examples now show it. Guide.
Webhooks: account lifecycle events
  • account.created fires when a Meow deposit account is live and addressable on GET /accounts. For Treasury Prime that is when the bank confirms the application, later than the POST /accounts response, so you can subscribe instead of polling. account.updated fires on status changes, including closes. Catalog.
New FeatureImprovement
Onboarding: hosted consent, additional products, and non-US businesses
  • Submitting an application now returns a consent_url, a hosted page where the primary representative reviews and accepts the required agreements, disclosures, and attestations in their browser, no login needed. The same link is returned on GET /entities/{entity_id} after submission. The attestation request field is retired; it is ignored if you still send it. Guide.
  • product_features on POST /entities/{entity_id}/submit requests additional products alongside the checking account. stablecoins requests USDC access, enabled once the representative accepts the terms and the application is approved.
  • GET /entities/{entity_id}/representatives lists every representative with their KYC status. Reference.
  • Non-US businesses can now complete onboarding through the API. Guide.
Webhooks: global subscriptions. Subscribe once with a global API key and receive events for every entity your user administers, including entities added later. Each delivery carries entity_id for routing. Reference.Accounts: PATCH /accounts/{account_id} sets a custom account nickname (2-25 characters) shown in the dashboard. Reference.
New Feature
Webhooks: delivery sequence numbers and partner webhooks
  • Out-of-order protection: every resource event now carries a per-resource sequence. Keep the highest you’ve applied per resource and drop anything at or below it. Monotonic, not gapless. How it works.
  • Richer delivery history: GET /webhooks/deliveries rows now include event_type, resource_object, resource_id, and sequence, so you can find and redrive a failure without opening the event.
  • Partner Webhooks: subscribe to onboarding application.* events with a partner API key. Same delivery machinery, scopes partner:webhooks:read / partner:webhooks:write. Reference.
  • Stricter allowlists: event_types now rejects events a subscription can’t receive: webhook.test, message.attempt.exhausted, and (on entity subscriptions) application.* return a 400.
  • Deleting a subscription retains its delivery history and frees the URL for reuse.
New Feature
Webhooks: subscribe to events and inspect deliveries
  • POST /webhooks/subscriptions to subscribe. Choose payload_mode: snapshot (full resource) or thin ({id, object}).
  • 13 events across ACH, wire, inbound transactions, check deposits, and global accounts. Dispatch on data.status.
  • Signed with Standard Webhooks headers.
  • GET /webhooks/deliveries and /attempts for history; POST /webhooks/deliveries/{id}/redrive to replay one.
  • New scopes: webhooks:read, webhooks:write.
  • Guide · event catalog.
New Feature
Cards: PATCH /cards/{card_id} to freeze, unfreeze, or update spend limits on a cardTax Forms: GET /tax-forms and GET /tax-forms/{taxFormId} to retrieve IRS 1099 tax formsInstant payments: FedNow supported as a payment rail
New Feature
Partner Onboarding API: Submit and track partner onboarding applications
  • POST /partner-onboarding/applications - Create an application
  • GET /partner-onboarding/applications - List applications
  • GET /partner-onboarding/applications/{application_id} - Get application details
  • POST /partner-onboarding/applications/{application_id}/upload-url - Get a presigned upload URL
  • POST /partner-onboarding/applications/{application_id}/confirm-document - Confirm a document upload
New Feature
Approval Workflow: Programmatic transfers now flow through configurable approval policies
  • Pending-approval state surfaced to API callers
  • Mutating endpoints honor entity-level approval requirements
New FeatureImprovement
Payment Networks: GET /accounts/{account_id}/payment-networks now returns deposit instruction fields for each supported methodAudit Logging: Structured audit logs added to all mutating Meow API endpoints
New Feature
Wallet Transfers: The Meow API now supports transfers from Global Account wallets
  • crypto_id accepted on wallet crypto transfers; currency is derived from the destination
Improvement
Invoices: Added lifecycle tracking fields (e.g., paid_at, voided_at, sent_at) to Invoice responses
New Feature
MCP Server: New MCP server for the Meow API with OAuth
New FeatureDeprecated
Crypto Transaction API: New endpoint for crypto transfers
  • GET /accounts/{account_id}/crypto/{transaction_id} - Get crypto transaction details
  • POST /accounts/{account_id}/crypto - Create crypto transaction (replaces legacy USDC endpoint)
  • New API scope: transfers:crypto:write
Check Deposit API: New endpoint for check deposit details
  • GET /accounts/{account_id}/check-deposits/{transaction_id} - Get check deposit details
Deprecated
  • POST /accounts/{account_id}/usdc - Use POST /accounts/{account_id}/crypto instead
  • GET /accounts/{account_id}/transactions/{transaction_id} - Use GET /accounts/{account_id}/crypto/{transaction_id} instead
New Feature
Treasury Products: Commercial paper and liquid treasuries holdings exposed in the Meow API
New Feature
Transfer Lookup: ACH and wire transfer GET endpoints now resolve Global Account-originated transfers
Improvement
  • Clarified that wire and ACH transfer GET endpoints return details for both incoming and outgoing transfers
  • Updated Transfers tag description to include all transfer types
New Feature
Billpay API: Bill management endpoints
  • GET /bills - List all bills with optional status filtering and pagination
  • GET /bills/{bill_id} - Get bill details including line items
  • New API scope: billpay:read
Deprecated
Crypto Fees: Removed total_fee_percentage from crypto transaction API responses (use the per-fee breakdown instead)
New FeatureImprovement
Scheduled ACH Transfers: Create and manage scheduled ACH transfers
  • POST /accounts/{account_id}/ach/scheduled - Create a scheduled ACH transfer
  • GET /accounts/{account_id}/ach/scheduled - List scheduled ACH transfers
  • transferMethod query parameter on transaction list endpoint to filter by transfer method (e.g., INCOMING_ACH, OUTGOING_WIRE, CARD)
Improvement
  • Updated first_occurrence field in recurring payment schemas to use Timestamp reference type
New Feature
ACH Transfer Details: Retrieve specific ACH transfer information
  • GET /accounts/{account_id}/achs/{ach_transfer_id} - Get ACH transfer details
  • RETURNED status added to TransferStatus enum
  • CASH_SOLANA added to PaymentMethodType enum
  • internal_note field added to wire transfer response
New Feature
Contacts API: Full CRUD operations for managing payment contacts
  • POST /contacts - Create a new contact with ACH/wire/check or crypto address details
  • GET /contacts - List all contacts with optional nickname filtering
  • GET /contacts/{contact_id} - Get contact details
  • PATCH /contacts/{contact_id} - Update contact information and add payment details
  • DELETE /contacts/{contact_id} - Delete a contact
  • New API scopes: contacts:read and contacts:write
Billing API: Complete invoice management system
  • Products: GET /billing/products, POST /billing/products, GET /billing/products/{product_id}
  • Customers: GET /billing/customers, POST /billing/customers, GET /billing/customers/{customer_id}
  • Invoices: GET /billing/invoices, POST /billing/invoices, GET /billing/invoices/{invoice_id}, GET /billing/invoices/{invoice_id}/pdf
  • Line Items: GET /billing/invoices/{invoice_id}/line-items, GET /billing/invoices/{invoice_id}/line-items/{line_item_id}
  • Payment Config: GET /billing/payment-method-types, GET /billing/accounts
  • New API scopes: billing:products:read/write, billing:customers:read/write, billing:invoices:read/write, billing:accounts:read
  • Recurring invoice support with RFC 2445 RRULE scheduling
  • Invoice email notifications with custom recipient lists
Transfer APIs: Comprehensive transfer capabilities
  • POST /accounts/{account_id}/book - Create internal book transfers between accounts
  • POST /accounts/{account_id}/ach - Create ACH transfers to external counterparties
  • POST /accounts/{account_id}/wire - Create wire transfers to external counterparties
  • GET /accounts/{account_id}/wires/{wire_transfer_id} - Get wire transfer details
  • New API scopes: transfers:book:write, transfers:ach:write, transfers:wire:write
Payment Networks API:
  • GET /accounts/{account_id}/payment-networks - List payment networks supported by an account
Routing Number Validation:
  • GET /routing-numbers/{routing_number} - Validate routing numbers and get bank information
API Keys Management:
  • GET /api-keys/accessible-entities - List all entities accessible by the current API key
  • GET /api-keys/current - Get metadata about the current API key
Multi-entity Support:
  • Optional x-entity-id header to scope API requests to specific entities
New Feature
Combined Read and Write APIs into a single unified Meow API.Accounts API: Comprehensive financial data access
  • GET /accounts - List bank accounts
  • GET /accounts/{account_id} - Get account details
  • GET /accounts/{account_id}/transactions - List transactions with time filtering and pagination
  • GET /accounts/{account_id}/balances - List account balances with time filtering
  • New API scopes: accounts:read, accounts:transactions, accounts:balances
USDC Transaction Support:
  • POST /accounts/{account_id}/usdc - Create USDC transactions
  • GET /accounts/{account_id}/transactions/{transaction_id} - Get USDC transaction details
  • New API scope: transfers:usdc:write
  • Support for multiple blockchain networks: Ethereum, Solana, Base
Health Check:
  • GET /health - API service health status endpoint
Authentication & Security:
  • API key authentication via x-api-key header
  • Standardized error handling with detailed validation responses
  • Scoped API permissions for granular access control