Changelog
Notable, partner-facing changes to the Seismic Orchestration API and the
seismic-orchestration client. Newest first.
Notable, partner-facing changes to the Seismic Orchestration API and the
seismic-orchestration client. Newest first.
sent status between processing and completed: a payment that has been sent to the receiving bank or network now reads sent instead of processing on reads, lists, the order status filter and order.status_changed webhooks. Clients that match order or liquidation statuses exhaustively, and older seismic-orchestration releases (whose response validation rejects the new value), must be updated to accept it.getDeviceFingerprint(), which computes end_user.device_fingerprint for a verification submit the same way the hosted verification link does, and a new Device fingerprinting guide covers collecting the IP address, user agent and fingerprint from your own frontend.acceptance_requirements.source_account_number_required, so clients know before accept when the payer's account number must be supplied.accepted_for_rails on fields that only some rails accept, so a request without rail shows which fields each rail rejects.funding_instructions; only the details the payer actually uses (such as the PIX code) are returned.awaiting_funds as the payment progresses (including to failed when it is never paid), instead of staying at awaiting_funds.status_reason on the order and on order.status_changed; some corridors previously reported the return with no reason.GET /v0/accounts/fiat/external/requirements now returns CorridorUnsupported for a currency or rail an external account can't be created with, instead of a field list.developer_fee_bps on automatic liquidation and deduct it from each liquidation, as in production.action_required. A KYC, business KYB, or org KYB submission that is handed back for review now reads under_review with no rejection_reason, on the API, the dashboard, the hosted link, and status webhooks alike.reference, comment, payment_reason and supporting documents when the payout starts.from_address given at accept; any other deposit stays in the customer's account.out.amount or more (to within 0.01%) when its funds arrive, unless the accept set expired_quote_behavior to flexible_destination_amount; otherwise the order ends expired and the funds remain in the customer's wallet.from_address when the payment is funded through a deposit address (the order comes back awaiting_funds with funding_instructions.toAddress).422 naming that minimum in that currency (for example "40 EUR") instead of an approximate USD figure.details.account_number; from 2026-11-14 that includes the UK, Sweden, Czechia, Poland and the remaining IBAN countries, and the requirements response now labels the field IBAN wherever an IBAN is expected and Account number elsewhere.customer.virtual_account_approval.changed when a customer is approved, so integrations that request USD virtual accounts on that event can be tested.COP payouts: register a Colombian bank account with the new co_bank shape (bank code, account number, account type, holder identity document) and pay out to it over the ach_colombia rail. Individual holders only.terminally_rejected status now updates when the verification decision is reversed on re-review. A customer declined by Seismic stays terminally_rejected.customer.virtual_account_approval.changed webhook tells you when a customer's approval for a virtual account changes, so you can open the account once it reports approved instead of on the KYC/KYB approved event.customer.kyb.status_changed or customer.kyc.status_changed; before, the new status only appeared on reads.account_holder_name now carries the beneficiary name the bank issues the account under, instead of a Virtual USD account placeholder.customer.virtual_account_approval.changed now waits until the customer's verification is approved, so status: approved always means the virtual account can be requested.details.bic on IBAN external accounts is now validated as an 8 or 11 character BIC; a malformed value is rejected with a validation error instead of being accepted.identity.tax_identification_number is required to complete verification) instead of a generic unexpected-failure reason, and the unexpected-failure reason no longer claims an upstream 500.under_review status: a payment held for a compliance review now reads under_review instead of processing on order reads and order.status_changed webhooks, and returns to processing once released. Payments held for a supporting document also read under_review, with status_reason tracking the document review and documents_approved remaining once the payment returns to processing. Clients that match order statuses exhaustively, and older seismic-orchestration releases (whose response validation rejects the new value), must be updated to accept it.operations.in_flow_of_funds set to true will have to send operations.registered_msb_description and operations.msb_compliance_screening_description before KYB submit succeeds (POST /v0/customers/{id}/kyc/submit for business customers and POST /v0/org/kyb/submit), reported in missing[] otherwise; today both are required only when operations.registered_msb is true, so fill them in for any such business currently mid-onboarding.details.account_type on an ach account at a US bank, and the bank's full street address in details.bank_address on a SWIFT account; the requirements endpoint keeps listing them as optional.operations.registered_msb can now be left unanswered (it is omitted on read until answered, and the client no longer defaults it to false); from November 1, 2026, POST /v0/org/kyb/submit will report it in missing[] when it is not answered true or false, instead of reading the omission as false.risk.source_of_wealth now takes the same values as risk.primary_source_of_funds; free text is still accepted until November 1, 2026, when the field becomes required at POST /v0/customers/{id}/kyc/submit and must be one of those values.customer.kyc.status_changed event whose customer_id matches no customer; each update now notifies once, keyed by the customer (or business) it concerns.operations.source_of_wealth field stays on the API, and the historical source of funds now backs the compliance answer previously filled from it.action_required verifications to the end customer as under review and never shows them a rejection reason; the API and dashboard still report both.account_holder.relationship, and for a business holder also account_holder.industry; a create without them returns 422, as does turning a USD account third-party through PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder without them. Accounts in other currencies, including BRL, MXN and ARS, don't require either field.details.intermediary_bank.routing_number, now listed by the requirements endpoint, and the top-level SWIFT details.routing_number is deprecated in its favor; from November 1, 2026, creating one for an individual account holder without it will return 400 MissingAccountFields.proof_of_address_type returns 422 naming it (for example documents.proof_of_address.proof_of_address_type or associated_persons[0].proof_of_address_type); to set the type on a document already on file, upload the same file again with the type.rails (or rail) with ach and/or wire, and a create that omits it is rejected with 400 MissingAccountFields. Accounts in other currencies, and USD accounts at banks outside the US, keep accepting an omitted rails.dba_registration document whenever business.trade_name is set; the hosted verification form lists the slot under the required documents.proof_of_address_type on a proof_of_address (utility_bill, bank_statement, rental_agreement, tax_document, government_correspondence), returned on document reads and on a KYC profile's documents.supporting_documents; re-uploading a file already on record with a type sets it.account_holder.is_third_party (true or false); a create that omits it returns 400 MissingAccountFields instead of assuming the account is the customer's own.type (invoice, purchase_order, delivery_slip, contract, customs_declaration, bill_of_lading, or other) as { "type", "file" } objects in accept files and on POST /v0/customers/orders/:id/documents; from November 1, 2026, a type will be required for every file and bare data-URI strings will be rejected.GET /v0/eligible-rails now lists only rails an external fiat account can be created over, so EUR returns sepa alone instead of also offering swift, which account creation refused.Idempotency-Key that is not a lowercase version-4 UUID no longer fails with an upstream validation error.200 with that existing account instead of a 400, so a retry is safe to send blind. The account is returned as stored and other details in the request are not applied; the response is the one an Idempotency-Key replay gives you, with request.idempotency_key naming the original create and request.created_at in the past. If you read the account id out of a bank account's 400 message, move to its related_ids field before then.dba_registration document (a government-issued DBA certificate or registration), offered in the hosted verification form when business.trade_name is set; a trade_name equal to legal_name is now rejected at submit.operations.in_flow_of_funds (true or false) for a business classified as marketplace or financial_services_provider, and for every organization (POST /v0/customers/{id}/kyc/submit for business customers and POST /v0/org/kyb/submit); a submit without it returns KybProfileIncomplete naming operations.in_flow_of_funds.details.bank_address are needed: details.bank_address.country on every shape, and on SWIFT accounts the bank's street address parts too. SWIFT holder-address fields carry the SWIFT text-form patterns (no punctuation, a two-letter region).details.tax_number on USD accounts at US banks, and details.swift_payment_code and details.ifsc on SWIFT accounts. The requirements response lists the payment codes a bank's country accepts, and now publishes options for details.account_type and account_holder.industry.required_when on optional fields: the conditions on other request fields (such as account_holder.address.country) under which the field is required.swift to a third-party beneficiary can now be accepted: quotes on routes that hold such a payment for review set acceptance_requirements.files_required, GET /v0/quotes/requirements lists those routes under route_conditions, held orders report status_reason documents_required / documents_under_review / documents_rejected / documents_approved, and the new POST /v0/customers/orders/{id}/documents submits a document when one is asked for.account_holder.address.line1 and line2 in max_length and regex, matching what account creation enforces.status_at, and a hold or credit that arrives out of order no longer overrides a later status.seismic-orchestration/token-store no longer loads the full schema type definitions, cutting its type-check memory by more than half; it now also exports the TokenPair type.bank no longer fail with an opaque upstream error when the customer's approval status can't be read in time; the account is requested at the default bank instead.POST /v0/customers/{id}/kyc/submit made with an API key will require end_user.ip_address, end_user.device_fingerprint and end_user.user_agent, the IP address, device fingerprint and browser user agent the customer accepted the terms of service from; all three are optional until then.control_person, officer, director, or authorized_signer roles; a person listed only as beneficial_owner is rejected at submit with a violation on associated_persons[i].roles.business.description outside 350–1,000 characters, operations.primary_source_of_funds_description and operations.account_purpose_explanation outside 200–1,000, an operations.msb_compliance_screening_description under 200 when operations.registered_msb is true, and a compliance screening narrative over 1,000; from November 14, 2026, operations.account_purpose_explanation is also required for every account purpose.503 with no Retry-After header (previously 502, 429, 500, 503 with Retry-After, or an empty 200), so create a new quote; a rejection you can fix, such as an amount below an option's minimum, now answers 422 where it used to answer 500 or 503. - Accepting a quote whose options all failed now returns that quote's own error, with or without a quote_id (previously QuoteNotReady or 400 QuoteIdInvalid), and reading another customer's quote returns 404.rtp are no longer quoted; use ach or wire instead.business.pre_revenue: true) must now set operations.primary_source_of_funds to private_capital and upload a ubo_source_of_funds document at KYB submission.409 VirtualAccountNotApproved instead of 201.rail: "fednow" instead of omitting it.is_named (the payment reaches the beneficiary under the customer's own legal name), and ?named=1 on POST /v0/quotes (api.quotes.create(req, { named: true })) returns and accepts only named options.account_holder.industry that GET /v0/industries/account-holder doesn't list is now rejected on external bank account creates and PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder with a not_in_allowed_set violation on the field, pointing at that list. Today the list is the whole GET /v0/industries catalog, so no code accepted before is refused.account_holder.address.state or account_holder.address.postal_code when the holder's country has no states or no postal codes, and SWIFT accounts now register with the holder details.phone and details.tax_number they were created with.409 AlreadyAccepted, or the first payment when it carries the same Idempotency-Key.New York) are now filed under the two-letter state code (NY), so they keep registering once two-letter codes become mandatory on November 14.+656587531018, or a UK number sent with its leading 0), and account creation applies the same check to holder phones.business.website_eta and business.social_media_profile alongside business.marketing_strategy.fees and return a destination amount net of it, so sandbox amounts follow the production fee model; payments just above the sandbox minimum may now be rejected.GET /v0/industries/account-holder currently lists every industry in GET /v0/industries, so any catalog code keeps an external business account usable as a payout destination on every route.GET /v0/industries/account-holder (api.accountHolderIndustries()) lists the NAICS codes an external account's account_holder.industry can name and still be usable as a payout destination on every route.x-request-id header, and error bodies include the same value as request_id. Quote it when contacting support.0x036CbD53842c5426634e7929541eC2318f3dCF7e) as their settlement token.closed and sends account.updated.236118, 561599, 712120 or 811198 no longer fail with a not_in_allowed_set violation on account_holder.industry when the account's currency and rail require an industry code.bacs (GBP), cnaps (CNY) and meps (SGD) rails no longer fail with a destination.rail validation error.400 on virtual account creation and PUT /v0/accounts/:id/liquidation, and is no longer listed by GET /v0/customers/:id/liquidation-destinations.account_holder.relationship code (the same set details.relationship_to_debtor now uses), which PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder can now set; send it on every third-party account, and account_holder.industry on a third-party business's, because an account without them can be registered for fewer settlement options and a create with no other option returns 422.GET /v0/quotes/requirements and client.quotes.requirements().422 when account_holder.relationship or account_holder.industry is missing; the account is created and registered for settlement once the fields are added with PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder, and a quote paying out to it before then returns 422 naming the missing fields.PUT /v0/accounts/:id/liquidation now returns a 400 with the account left unchanged, instead of a 500, when the new auto-liquidation target could not be applied.GET /v0/customers/:id/payout-approvals now reports USD payouts over ACH, wire and SWIFT as approved for customers whose verification already clears them, instead of showing them as still in review or awaiting action.422 naming the minimum instead of a retryable 503 saying the minimum could not be verified.PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder now accepts is_third_party, so an external bank account registered under the wrong party can be corrected; industry is now optional on that endpoint.acceptance_requirements.files_required so integrations can collect supporting documents before accepting a payment.volumes.monthly_deposits, volumes.monthly_withdrawals, the four volumes.monthly_*investment*_usd figures, counterparties.counterparties, operations.business_jurisdictions, and the beneficial owner's nationality, citizenship, source_of_wealth and previous_economic_activity are now optional; operations.funds_movement_jurisdictions is optional for business customers and still required for an organization's own profile. For individuals, volumes.monthly_deposits, volumes.monthly_withdrawals and jurisdictions.vendors_and_counterparties are now optional. The hosted verification forms no longer ask for any of them and run in fewer steps. - documents.articles_of_association is no longer required to submit a KYB profile. It is still accepted as an optional upload.account_holder.relationship for ACH, domestic wire, and SWIFT recipients and distinguishes it from the SGD, INR, and PHP bank-details field.400 at quote creation explaining that payouts need an external fiat account, and naming the missing account when the customer has none; sandbox applies the same rule except to SUSDC.dividend as a payment_reason when accepting a quote.GET/PUT /v0/org/branding; responses carry a public logo_url, and the hosted link's metadata includes the same branding object.CorridorUnsupported with the message "Sending a SWIFT payment to a US bank is not supported. Please use ACH or Fedwire instead." instead of the generic unsupported-corridor message.financial_services_provider business classification is now described as "Fintech company (e.g. non-custodial neobanks, payment processors, remittance apps)"; the wire value is unchanged.OrgSelfTransactingDisabled error message has been reworded; its code and status are unchanged.primary_source_of_funds field and the rule are unchanged.end_user.user_agent, the browser user agent the customer accepted the terms of service from, recorded alongside end_user.ip_address and end_user.device_fingerprint.account_holder.industry (NAICS code), returned with the holder's type on account reads, and PATCH /v0/customers/{id}/accounts/fiat/{account_id}/holder adds it to an existing account; send it for third-party business accounts so more payout routes can reach them.jp_zengin); CAD registration and restoration forward the required institution number as the bank code.funding_instructions; the payout starts once the deposit lands.0x0000…0000, 0x000…dEaD, or a single repeated digit) with a 400 on address.GET /v0/customers/orders and GET /v0/customers/{id}/orders) now return the same status_reason as GET /v0/customers/orders/{id}, so a failed or refunded order reads identically in both.account_holder.relationship accepts CONT (independent contractor) and LAND (landlord) for every holder, and VEND and OTHR for businesses too.proof_of_source_of_funds document kind is retired: uploads of it are rejected and one already on file no longer satisfies the KYB financing-and-operations requirement, which is now met by a bank_statement alone or a ubo_bank_statement together with a proof_of_address; the hosted verification form no longer offers a Proof of Source of Funds upload.eligibleRails accepts customerId with origin: "virtual" to list the chains a customer's virtual crypto account can be opened on; creating one on any other chain is refused as an invalid rail.operations.licensed_vendors as true and includes financial_services_provider in operations.business_classifications, so the attested vendor list, flow-of-funds document and customer-funds question are always requested; the dashboard shows both answers as fixed.409 instead of a 500, and no longer registers the destination twice.business.pre_revenue) will have to set operations.primary_source_of_funds to private_capital and upload the new ubo_source_of_funds document — evidence of where the funding beneficial owner's own money came from — before KYB submit succeeds; both are accepted today, so bring any pre-revenue business mid-onboarding in line now.gov_id_back_image_document_id on an associated person whose gov_id_kind is single-sided (passport, residence_permit, voters_card, other); omit the back image for these ID types.developer_fee_flat on stablecoin-funded payments.party; ZAND_BANK is third_party and lists with the other third-party banks, and the ClearBank banks are named Clearbank.Banking Circle and the AED bank Zand Bank, so pickers show the institution without its legal suffix.expires_at has passed now fails with quote_expired on every corridor, where some previously returned an opaque error instead.bank: "ZAND_BANK" now succeeds instead of being refused as an unavailable bank.GET /v0/virtual-account-banks lists every bank a virtual account can be opened at, unauthenticated, in display order. - Virtual-account banks now report a party of first_party or third_party, saying whether the account accepts a payment from anyone or only from the account holder; name no longer repeats it in parentheses. - Both bank lists arrive in display order, banks that accept third-party payments first, so a picker can render them as served.rate no longer includes your developer fee, which is already listed as its own line in fees, and quotes with a flat developer fee no longer overstate the destination amount.SSB and CLEARBANK are replaced by SSB_THIRD_PARTY/SSB_FIRST_PARTY and CLEARBANK_THIRD_PARTY/CLEARBANK_FIRST_PARTY, and bank on the virtual-account approvals response now always carries the catalog's code. A third-party account accepts a payment from anyone; a first-party account accepts only the holder's own.account_holder.is_third_party and account_holder.relationship — the latter with the accepted codes and their labels — so a destination belonging to someone else can be registered with the relationship recorded, and reading a fiat account back returns the code that was sent. Both fields are optional. The account holder's country is listed again where the payment setup requires it.swift rail, and naming swift alongside ach or wire on such a body is now refused — a domestic US destination is reached over ACH or Fedwire, so that rail advertised a settlement path the receiving bank refuses; a destination that settles over SWIFT is registered by naming swift with the SWIFT identifiers in details, which is unchanged.GET /v0/customers/{id}/virtual-account-banks?currency=GBP now lists CLEARBANK, so a GBP virtual account can be opened at a named bank instead of the list coming back empty.400 however it differs, including by liquidation.account_id — retarget the existing account with PUT /accounts/:id/liquidation instead of creating another.-reconstructed (X-Document-Reconstructed: true), or the available pages named -partial (X-Document-Partial: true, DocumentDownload.partial) when some can't be loaded; downloading part of a longer upload returns the whole upload.GET /v0/accounts/fiat/external/requirements now also publishes the fields an additional banking route asks for on US bank destinations, as optional ahead of being enforced — send them now and nothing changes until a later release moves them to required.bank they hold no account at is no longer refused as a duplicate of the account they already have.GET /v0/customers/{id}/virtual-account-banks?currency=EUR (and GBP) now lists the banks a customer is approved at for that currency, and bank can be set to one of them when creating the virtual account — a bank approved for more than one currency is offered under each.transaction_hash instead of leaving it empty.details.intermediary_bank record (name, bic, routing_number, account_number, country) and report it back, so a correspondent outside the US can be quoted by its own BIC instead of an ABA it does not have; the bank value for Slovak Savings Bank virtual accounts is now SSB for the third-party arrangement and SSB_FIRST_PARTY for the named one, and OPENPAYD, CLEARBANK, CLEARBANK_FIRST_PARTY and BANKINGCIRCLE_FIRST_PARTY can now be selected where the customer is approved for them.resubmit_available, so a resubmission is only offered when it would actually re-file the verification for review.identity.social_profile_url, an optional link to the customer's LinkedIn, Facebook, Instagram or X profile. Links to other hosts are rejected at submit; omitting the field changes nothing, and a later release will require it for customers whose government ID was issued outside the US, EU or Canada.business.publicly_traded, so a listed entity is filed as one instead of defaulting to not publicly traded.operations.business_classifications includes marketplace will have to upload a flow_of_funds and a licensed_vendors_attestation document before KYB submit succeeds — the same pair financial_services_provider already requires — so add both to any marketplace business currently mid-onboarding.expired_quote_behavior options as production, so accepting a virtual account → external bank payout with refund_payment, flexible_destination_amount or flexible_source_amount no longer returns a 400.InvalidRequest error and message as before, now also carrying related_ids with the existing Seismic account id. Account errors never surface an upstream identifier, and a single account with incomplete stored details no longer fails an entire account list request.customers.virtualAccountBanks(id, { currency }) and accepts bank on customers.createVirtualFiatAccount, so a virtual account can be opened at a bank the customer chose.bank, chosen from GET /v0/customers/{id}/virtual-account-banks; omit it and a bank is chosen for you as before.GET /v0/customers/{id}/virtual-account-banks?currency=USD lists the banks a customer can be issued a virtual account at, so the choice can be offered before the account is created.ca_eft external-account field list now includes details.bank_name, matching the fields account creation accepts.reference longer than 128 characters is now rejected at accept with a reference / too_long violation, instead of failing later during settlement.business.pre_revenue contradicts volumes.estimated_annual_revenue_usd: the flag must be true exactly when the reported revenue is 0.POST /customers/:id/kyc/submit accepts an optional end_user block recording the IP address and device fingerprint the customer accepted the terms of service from, stored against the verification with the version of the terms in force.rails (["ach", "wire"], still accepted as rail) and, for a US bank that receives each of them on a different ABA, a details.ach_routing_number / details.fedwire_routing_number in place of the single details.routing_number.rail wherever the resolved shape supports more than one — one routing number cannot serve rails a bank receives on different ABAs — so name the rail you intend to use and add a second rail, with its own routing number, to the existing account.USDT now settles over tron: the rail appears in GET /rails, under USDT on GET /currencies, and can be approved for an organization.rail now documents its meaning: the account is registered for every rail the shape supports, each against the single bank identifier supplied.ach_routing_number and fedwire_routing_number.routing_number still carries the registered ABA on every account.business fields — website_eta (an ISO-8601 date in the future, or 0000-00-00 when no website is planned) and social_media_profile (a profile URL for the entity or a beneficial owner); both are optional today and will become required for entities without a website, and the declaration is certified to compliance review with the submission.account_purpose accepts a new receive_payments_for_goods_and_services value for businesses collecting customer payments.operations.flow_of_funds_description is removed from business and org KYB profiles (it is no longer required at org submit and is ignored if sent); business KYB profiles whose operations.business_classifications includes financial_services_provider now require flow_of_funds and licensed_vendors_attestation documents at submit, and a new optional operations.in_flow_of_funds boolean records whether the business receives, holds, controls, converts, or transmits customer funds (required for financial services providers from 2026-09-30).details.bank_name against the Canadian bank options returned by the requirements endpoint.source.rail as swift on deposit webhooks and order funding instructions, instead of leaving the rail out.CAD external bank account now requires details.bank_name, chosen from the details.bank_name options reported by GET /v0/accounts/fiat/external/requirements, and the account's details echo it back.CAD external bank account over the eft rail no longer fails with a routing-number format error.GET /currencies now reports a direction of source, destination, or both per rail entry, so one-way corridors (payout-only local rails like INR/imps) are visible in the catalog instead of surfacing as CorridorUnsupported at quote time.GET /v0/customers/{id}/virtual-account-approvals no longer lists a USD offering that a virtual account can't be opened at, so an approved USD row now always matches what account creation accepts.flow_of_funds document at submit, whatever operations.conducts_money_services says.ca_eft shape (institution_number, transit_number, account_number).rail or details.account_type the original omitted, a genuinely different account type registers as a new account instead of returning a 400, and a deleted virtual account comes back with every payment rail it had gained.swift_account_number, swift_receiving_bank and account_type even when the issuing bank publishes no separate international coordinates, so a foreign payer can be quoted from any US virtual account.bicSwift could stay missing on accounts whose bank assigned it late.AccountIsLiquidationDestination, naming the accounts to retarget first.https://orchestration.seismic.systems/docs/api/mcp.account.deposit.liquidated webhook was not sent.GET /org/kyb/rfis reads the open information requests on your org's own verification, the counterpart of GET /customers/:id/kyc/rfis. GET /customers now takes customer_type, status, pending_rfi, cursor and limit, and returns next_cursor — sweep for open requests with ?pending_rfi=true instead of listing every customer. A request raised on a verification in action_required is no longer hidden from pending_rfi and the RFI reads.account.deposit_liquidated and GET /liquidations, where some previously came back null.base-sepolia as an alias for base and labels the network Base Sepolia (testnet); responses continue to use base.invalid_format with E.164 guidance; sandbox email links also correct accidental production-origin configuration.reference outside letters, numbers, spaces, dashes, and colons now fails up front with a typed reference / invalid_format violation naming the offending character, instead of being refused later in settlement.GET /v0/customers/{id}/kyc/rfis (and client.customers.rfis), each item carrying the profile field or document slot it targets, and the customer's hosted verification form answers them in place on a new "Requests" step.account_holder.date_of_birth when the live corridor and rail requirements demand it; missing or blank required values are rejected, and the value must be supplied even when already present in KYC.account.deposit_liquidated reports destination_address again when the settlement credited a registered crypto account.ubo_bank_statement document, which satisfies the financing-and-operations requirement together with a proof_of_address when the business has no bank statement of its own.supplemental section — free-form text and document entries (each with a title and description) for responding to requests for more information during review, with a matching Supplemental tab on the hosted verification flow.operations.source_of_wealth field — the net-worth question, taking the same options as primary_source_of_funds.addresses.operating_is_remote no longer requires a separate addresses.physical: a business whose operating address is its registered address can declare that address to be a control person's residence.POST /orgs now requires a compliance_email — creating an org without a compliance contact address is rejected with 400 InvalidRequest.certificate_of_incumbency kind, naming who is currently authorized to act for the entity.sw1a2aa → SW1A 2AA) before validation and verification submission, so spacing and casing variants no longer fail downstream checks.account.deposit_liquidated now waits up to 72 hours for the transaction hash, falling back to a hashless completion if recovery is exhausted; new liquidations no longer emit liquidation.settlement_recorded.business.target_customers_description, operations.flow_of_funds_description, and a licensed_vendors_attestation document at submit; both narratives are folded into the business description sent for compliance review.liquidation — name the crypto account credited funds should be converted and settled to. Accounts opened before this keep working; every other currency is unchanged.rtp_routing_number and a swift_account_number, each present only when the issuing bank publishes coordinates of its own for that route.addresses.operating_is_remote no longer need a company proof_of_address: the beneficial owner whose residential address matches the operating address covers it with their own document, which Seismic forwards as the company's proof of address. A company proof_of_address uploaded anyway is deduplicated by file name against that person's document, or kept as other with the description "Alternate proof of address for the company".addresses.operating_is_remote set, the operating address must match a beneficial owner's address, and an operating address that matches one requires the flag.liquidation.settlement_recorded when an on-chain transaction hash becomes available after the completion event.rejection_reason while a verification is still awaiting a decision, so a leftover reason can't read as a live rejection.PUT /v0/accounts/{id}/liquidation names the crypto account credited funds should be converted and settled to.terminally_rejected (previously action_required) with the rejection_reason, and the decision is final: further submissions for that customer are refused with 409 VerificationDeclined.rail and chain now always name a rail from GET /v0/rails, spelled the way that endpoint spells it: wire where it read DOMESTIC_WIRE, ach where it read ACH. An order's source_chain reads the same way. Schemes the platform has no rail for — same-day ACH and RTP among them — are omitted rather than named in an outside vocabulary, and stored history is rewritten so past records read like new ones.rail: "ach" even where the settlement network files it under a generic local-payments label, instead of omitting the rail.business.website now drops business.marketing_strategy, so a statement that no longer applies doesn't come back on a later read.action_required.last_submitted_at, so a resubmission is visible even though it lands back in the review it left.employment.occupation is removed; employment.occupation_soc replaces it and is now required at submit, taking a code from the catalog served by GET /v0/soc-codes.name, and crypto accounts held in the customer's own name return their full address rather than just a country.deposit.status_changed webhooks.order.status_changed webhook with the canceled state.slack_channel on PATCH /v0/org.account.deposit_liquidated now carries transaction_hash whenever the settlement network reports one, on every virtual account rather than only some.kind, later pages are filed as other documents named FILENAME_2.pdf, FILENAME_3.pdf, … — and a PDF under 10 KB gets a filler page so it clears the verification size floor.high_risk_activities_description.pending_rfi now goes false as soon as a customer resubmits their verification profile, instead of staying true until the review was decided.source.rail is now checked against the published rail catalog before it is recorded, and is omitted when no external network carried the funds or when the reported scheme names no rail we publish.source.rail whenever the settlement network names the scheme — including INTERNAL_TRANSFER for a book transfer within the network — and more orders now emit order.settlement_recorded with their settlement hash.ach_routing_number and fedwire_routing_number alongside routing_number, so each rail's ABA is explicit when a bank publishes different ones.customer.kyc.status_changed / customer.kyb.status_changed payloads now include an expanded flag, and the events also fire when an additional verification approval completes without a status change — on expanded: true with an unchanged status, re-read the approvals endpoints to pick up anything newly available.created_at — created_at / updated_at (plus status_at on deposits) on the deposit and liquidation objects, and an updated_at on the settlement and verification-status events.created_at timestamp recording when the event was recorded; retries and replays of an event keep its original value.articles_of_incorporation, residence permit or voters card images); these kinds are accepted again on read while remaining unavailable for new uploads.high_risk_activities (and, for businesses, business_classifications) — send ["none_of_the_above"] when none apply, so an unanswered disclosure is never read as a negative answer.business_formation document requirement now spells out what counts: the original filing from the time of formation (Articles of Incorporation, Articles of Organization, Certificate of Incorporation), not a later document such as a Certificate Confirming Registration.GET /v0/customers/orders (across every customer) and GET /v0/customers/:id/orders (one customer), with status / rail / schema filters and cursor pagination — the endpoints behind the client's customers.orders() and customers.listOrders().articles_of_association instead of articles_of_incorporation.account_holder block (holder address + is_third_party), matching fiat accounts.too_long violation naming the field.from_address for blockchain payments funded from an external wallet when the sending address was not captured at quote creation.other supporting document, which caused those uploads to be rejected.addresses.operating_is_remote must now send the control person's residence as addresses.physical; submitting the flag without it returns a Missing violation on addresses.physical.employment.occupation free text is now optional when employment.occupation_soc is set — the code's catalog title is recorded in its place — and the client gains socCodes() for driving an occupation picker from GET /v0/soc-codes.?resubmit_approved=1 opt-in on the submit endpoint (customers.submit(id, { resubmitApproved: true }) in the client) — the updated details are re-verified, and the status may move back into review until the re-check completes.sent is replaced by processing, aligning API responses and the Payments dashboard with payment-order lifecycle statuses.POST /v0/customers/{id}/kyc/sync-approvals submits a customer for any verification checks added after they were onboarded (expect RFIs by email; completion is announced by the customer.kyc.status_changed / customer.kyb.status_changed webhooks), and GET /v0/customers/{id}/virtual-account-approvals now includes Portage-issued USD accounts, reporting their review status from the customer's own verification standing.usd_capabilities_requested is removed from KybProfile and KycProfile, and USD virtual-account capabilities are no longer requested when a customer is registered. Sending the field is still accepted and now does nothing, so existing submits keep working; drop it from your payloads and stop reading it off a profile response.503 on currency pairs such as BRL → USDC and PHP → USDC.account.deposit_liquidated now names destination_chain with the same rail vocabulary as the rest of the API (base, not BASE), and states the fee the payout actually cost instead of always 0.articles_of_association document kind; articles_of_incorporation remains accepted.409 VirtualAccountNotApproved, naming the currency and where its approval stands, instead of a 500. Read GET /v0/customers/{id}/virtual-account-approvals for the currencies open to a customer today.details while it is still provisioning and when provisioning failed, rather than returning placeholder identifiers (all-9s account numbers, an XX00PROVISIONING IBAN) that were never payable; the block appears once the real identifiers are issued.Account.details is now optional, and this is the change most likely to break a running integration: 0.0.10 declared it required, so its response validation threw on any account served without one rather than surfacing an absent field. Account lists are validated as a whole, so one such account made a whole listAccounts page throw. details is absent on a closed account, and on a virtual bank account that is still provisioning or whose provisioning failed — upgrade before reading either, and treat account.details as possibly undefined. - The seismic-orchestration client is released as 0.0.11, and two further type changes can stop existing code compiling: details.bank_name on a Hong Kong (hk_fps) account is now optional because routing moved to details.bic, so reads of account.details.bank_name must handle undefined; and a KybProfile object literal now has to carry business.pre_revenue, addresses.operating_is_remote and associated_persons[].previous_economic_activity — send false / [] unless they apply. - 0.0.11 also picks up every API addition published since the last release: accounts.disableLiquidation, customers.liquidationDestinations, customers.linkSuggestions, addressRequirements, an optional idempotencyKey on customers.create, sourceOfFunds and sourceAccountNumber on quote accept, the full expiredQuoteBehavior set, and THB / IDR account types.under_review after their funds are liquidated: a completed liquidation now advances its deposit to completed and relays deposit.status_changed.draft as though it had never been sent; the status now reflects the submission while it awaits a decision.details; closure is announced on account.updated.source_of_funds on the accept request that declares where the money came from for that payment only (it defaults to the sender's verification profile).articles_of_association kind — the constitutional document governing an entity (titled Articles of Association, Bylaws, or Memorandum of Association depending on region). It supersedes articles_of_incorporation, which remains accepted for now; prefer the new kind for new uploads.business_classifications (marketplace, financial_services_provider, none_of_the_above), which implies acting_as_intermediary; high_risk_activities gains a none_of_the_above value so an explicit negative is distinguishable from an unanswered question; the screening narrative splits into msb_compliance_screening_description and high_risk_activities_description, which are concatenated under category headers into compliance_screening_explanation; and conducts_money_services is now registered_msb (with conducts_money_services_description becoming registered_msb_description), with the former spellings still accepted on input.account.created event — instead of provisioning a second.account_holder block carrying the holder's address and whether they are a third party.account.deposit_liquidated and appear as completed on GET /v0/liquidations, instead of silently stalling at sent.source.rail for any account that accepts exactly one rail.GET /v0/customers/:id/liquidation-destinations endpoint (client: customers.liquidationDestinations) reports whether a new virtual account in a currency can auto-liquidate and lists the crypto accounts eligible as its settlement destination; the dashboard's account-creation flow now offers only those.issuance_date / expiration_date on an individual's government_issued_identification, gov_id_issuance_date / gov_id_expiration_date on an associated person — and an expiry date is required before an AED account can be opened.PUT /v0/accounts/{id}/liquidation) and turned off (DELETE /v0/accounts/{id}/liquidation, client: accounts.disableLiquidation); previously the configuration was fixed at account creation.AmbiguousRail.can_enable_liquidation on virtual bank accounts without a liquidation target, and liquidation.can_turn_off on accounts with one..md to its URL by hand.POST /v0/customers/{id}/accounts/* endpoints return 409 CustomerNotVerified while verification is still in progress, instead of failing with an opaque error later.addresses.operating_is_remote to declare that the business operates from a control person's residence, whether or not a separate operating address is sent; the flag on addresses.physical.remote is deprecated.GET /v0/industries/mappings now covers the residential/nonresidential specialty-trade contractor codes (238111, 238112, …), so every code on Bridge's business industry list resolves to an accepted industry.processing as soon as the payment is reported in flight (including compliance review), instead of staying in awaiting_funds until final settlement; upstream cancellations now surface as canceled.source_of_wealth and previous_economic_activity; gender is now required at submit on KYC identities.POST /v0/customers now accepts an optional Idempotency-Key header (also idempotencyKey on the client's customers.create) — retries with the same key return the originally created customer instead of creating a duplicate, and reusing a key with a different type is rejected with a 409 carrying code IdempotencyKeyConflict.country_of_birth (ISO-3166-1 alpha-2), separate from nationality and citizenship.account_purpose gains charitable_donations, ecommerce_collections, freelance_collections, and salary_collections, and every value now submits as one the compliance surface accepts — business_operations and treasury_management still validate but are legacy, submitting as other with the purpose as account_purpose_explanation.ownership_percent of 25 or more without beneficial_owner in their roles — the two statements contradict each other. Holders below 25% are unaffected.gender is optional again at submit on KYC identities, as it already was on business associated persons.account_holder.address.postal_code and details.bank_address.postal_code against the format used by their country, returning a 400 that names the field and quotes the expected pattern instead of failing later with a generic error.source_of_wealth answer is now submitted for verification instead of only stored.source_account_number — the bank account the payment will be funded from. It is required for pay-ins in PHP, IDR, or VND with no attached source account, which previously failed at accept.gender ("male" or "female"), which Seismic needs before provisioning virtual accounts in some currencies.account_purpose accepts a new purchase_goods_and_services value for paying suppliers and vendors.GET /v0/accounts/fiat/external/requirements reports these fields as required for the affected corridors.POST /v0/customers/:id/accounts/fiat/external now requires the account holder's street address, city, state/region, and postal code for every USD external bank account (both a US bank and a USD account held at a non-US bank) — Seismic's registration requires these fields to settle the payment, and a request missing them now returns a clear 400 instead of failing later.developer_fee_flat alongside developer_fee_bps, so you can charge a fixed amount per payment and it shows to your customer as its own fee line.GET /v0/eligible-rails) — domestic accounts, e.g. USD at a US bank or SGD at a SG bank, need just the holder's country.POST /v0/customers/:id/accounts/fiat/external now validates the account holder's street address, city, state/region, and postal code up front for USD accounts held at a non-US bank (the swift shape) — previously these could pass local validation and fail with an opaque error at submission.developer_fee_flat is no longer rejected when the payment's source is a registered stablecoin account rather than an inline currency.pending_rfi is now raised by a Seismic compliance reviewer rather than inferred from the verification status, so it only flags customers who have actually been asked for something.expired_quote_behavior now accepts refund_payment (the default) and flexible_source_amount alongside flexible_destination_amount, so an expired quote can settle with either amount re-quoted at the market rate.risk.source_of_wealth field describing where the individual's overall wealth came from.KybNotApproved error until the organization's own KYB has been approved, and each customer is verified through the checks the organization has already cleared.addresses.physical) accept a remote flag for businesses submitting a control person's residential address in place of an office.GET /v0/customers/{id}/kyc/associated-persons/{person_id}/link-suggestions, which suggests the individual customers an associated person on a business customer's profile matches, ready to link.thb_bank and idr_bank shapes.INR as the source currency (e.g. collecting an IMPS deposit) now returns CorridorUnsupported immediately instead of the request hanging in pending forever. INR via imps remains fully supported as a destination.OrgSelfTransactingDisabled error (403); existing organization-owned accounts remain readable — details, balances, and payment history are unaffected.400 naming the existing account.GET /v0/customers/address-requirements so clients can look up a country's state and postal_code requirements before submitting an address.GET /v0/soc-codes lists the occupation codes accepted on a customer's occupation_soc, and both it and the industry catalog now publish every accepted code in the docs.paused — a compliance hold during which the customer cannot transact and verification submits are refused with a VerificationPaused error; it clears when the hold is lifted.customer.kyc.status_changed / customer.kyb.status_changed events now also fire when a compliance hold is lifted, not only when it is placed.409 customer_on_hold with the status that caused the refusal.deposit.status_changed; some of these updates were previously dropped.details.bic: the SWIFT code is required at create, details.bank_name is an optional display value (previously required against a published list), and an account's unique key is details.account_number + details.bic.state and postal_code are now required only where the country's address format requires them — a Hong Kong address no longer needs a postal code, a British one no longer needs a state — and the onboarding wizard shows each country only the fields it uses.business.pre_revenue: set it when the proof of nature of business is alternative documentation of the business' preparations to operate rather than invoices or executed agreements, and Seismic forwards that context to compliance review.in_upi is gone from the fiat_shape schema, and INR external accounts use in_ifsc (IFSC + account number).volumes.expected_monthly_payments_usd; when omitted it defaults to volumes.usd_value_of_fiat, and the KYB form now asks for the monthly payment volume once.source.from_address and source.chain in the client types, which the API already returned for crypto-rail deposits.pending_rfi, flagging a customer whose verification is waiting on requested information.GET /v0/customers/{id}/pay-in-approvals, .../payout-approvals, and .../virtual-account-approvals list the approved currency + rail combinations and issuable virtual accounts, narrowed to your organization's approved currencies and rails, via api.customers.payInApprovals() / payoutApprovals() / virtualAccountApprovals().GET /industries/mappings translates a NAICS code Seismic does not accept into the closest one it does: a single unauthenticated response carries both the accepted codes and a mapping for every other 2022 Census code, so all 1,012 six-digit 2022 industries resolve (999999 "Nonclassifiable Establishments" is the one exception — nothing in the catalog means "unclassifiable"). Each mapping is marked high confidence (the same kind of business, one industry group over — safe to apply automatically) or low (a related but materially different business, chosen by hand because nothing in the group fit — confirm it with the business before applying, since verification runs against the code you send). In the client, resolveIndustry(code) returns the verdict for one code and industryMappings() returns the whole table; orgs.kyb.setProfile, orgs.kyb.submit, customers.create, and customers.setProfile now throw UnsupportedIndustryError (carrying suggested, suggestedTitle, and confidence) before sending a profile whose industry would be rejected, rather than substituting a code you did not choose — pass industryAutoApply: "high" or "all" to have the client apply the suggestion for you instead, or industryGuard: false to skip the check. Available in seismic-orchestration 0.0.10.main, types, and exports previously pointed at TypeScript sources that were not included in the published tarball, so imports had to be patched by hand.GET /deposits and GET /liquidations now return a working next_cursor, and the client walks every page — orgs with more than 50 deposits no longer see a truncated list.business.website is now optional: set business.no_website when the entity has no public site and supply business.marketing_strategy (min 300 characters) instead, which Seismic forwards to compliance review up front.terminally_rejected ("Declined" in the UI) rather than action_required, so you're no longer prompted to correct and resubmit a decision that can't be cleared.estimated_annual_revenue_usd, account_purpose, address.state, and each associated person's selfie and proof-of-address are required, while usd_value_of_crypto and the other derived volume fields are optional.auth.passkeys.* for registration, sign-in, and credential management.account_id on their liquidation object, identifying the crypto account funds settle to.t3.0 and HKD ecg / chats payout rails.PUT /v0/accounts/{id}/liquidation (client: accounts.updateLiquidation) points the account at a different crypto account and updates the developer fee.deposit.status_changed webhook reports every deposit status change in one event, including holds that were previously silent. It replaces account.deposit_received and account.deposit_returned, which are now deprecated but still fire.operations.acting_as_intermediary — whether the business moves funds on behalf of others — from 2026-07-31.family_support and friends_support payment reasons under a single consolidated "family and friends support" category; both values remain accepted on quote accept.account_purpose on every individual (KYC) customer, and a selfie document for customers residing in high-risk jurisdictions, from 2026-07-31.business.description shorter than 350 characters with a business.description TooShort violation, matching the client-side floor.details.bic instead of a bank-name picker, and SWIFT accounts held by an individual require details.routing_number (the recipient bank's US correspondent ABA) from 2026-07-31. Both fields are accepted today.GET /industries now lists only the 311 NAICS codes Seismic can verify a business against; KYB business.industry values outside that set (including the former 999999 catch-all) are rejected as incomplete instead of failing later in verification.GET /v0/payment-reasons (unauthenticated) and the paymentReasons() client method — the closed set of values accepted on a quote-accept's paymentReason, each with a display label, so you can populate a picker without hard-coding them.email when one is on file, and the dashboard customer list can be searched by email.seismic-orchestration 0.0.8.regulated_status no longer accepts unregulated on KYB profiles — use not_required instead.account.deposit_returned webhooks now include the deposit's status_reason — why the funds were returned to the sender, when a reason was reported.GET /v0/rates?from=USDC&to=SGD works without an explicit to_country.account.deposit_received / account.deposit_returned / account.deposit_liquidated webhook instead of silently stalling.supporting_documents list is read-only and managed through the document endpoints.GET /v0/liquidations (client: api.liquidations.list) lists each liquidation with its lifecycle status, amounts, on-chain settlement, and a deposit_id link back to the funding deposit — the read-side twin of account.deposit_liquidated — and the dashboard shows them alongside payments on the customer's Payments tab.00000 downstream wherever a postal code is required.paymentReason (required by the client): categorize why the payment is being made. Seismic settles the payment under that reason (settlement networks require one for compliance) and echoes it back on the order.502 (code BadGateway) instead of 503, with a message asking you to reach out so we can resolve it.approved before Seismic can provision accounts for the customer.status_reason codes a refunded or failed order can carry, so the reason a payment was returned can be handled programmatically.POST /v0/customers/orders/{id}/cancel (client: api.customers.cancelOrder); the docs now cover the cancelable window, the 409 past it, and the 400 for payments that don't support cancellation.rejection_reason when the entity returns to review, so the state settles on "Under Review" instead of momentarily carrying a stale request-for-information note.Idempotency-Key values longer than 64 characters no longer fail with an internal error: keys up to 256 characters are accepted, and longer keys are rejected with a descriptive validation error.400 when the customer already has one for the same currency: digital-asset accounts are unique per currency and rail (USDC on Ethereum and USDC on Base can coexist), while bank accounts are unique per currency (one USD account covers every rail). Previously this failed with a generic error.client.users.me.ordersVolume() (GET /v0/users/me/orders/volume) returns settled payment volume for your org, aggregated per source currency per day — powers the dashboard's Total Volume graph and stays correct at any scale.account_holder is now optional when registering an external crypto account; omit it and Seismic derives the holder from the customer's own KYB/KYC profile. Pass it explicitly only for third-party-owned wallets.licensed_vendors flag; when set, a licensed_vendors_attestation document is required at submit. On your organization's own KYB, a licensed regulated status also requires a proof_of_licensure document.liquidation.developer_fee_bps (basis points, 100 = 1%) that Seismic applies to the auto-converted funds; it's echoed back on the account's liquidation block.sol-shape wallet is present.usd_capabilities_requested in POST /v0/org/kyb/submit) is now persisted and honored — previously the choice was accepted but discarded, and Seismic always provisioned USD rails for your organization.swift shape is now recognized alongside every other fiat shape.phone, registration_number, registration_type, date_of_incorporation, relationship_to_debtor; ARS: id_number, id_type, registration_number, registration_type; IBAN corridors incl. AED and SEK: bank_code, phone, id_number, id_type, registration_number, registration_type; USD at non-US banks: phone, tax_number — GET /v0/accounts/fiat/external/requirements reports when a route needs them and lists accepted values.phone, registration_number, registration_type, date_of_incorporation, relationship_to_debtor; ARS: id_number, id_type, registration_number, registration_type; IBAN corridors incl. AED and SEK: bank_code, phone, id_number, id_type, registration_number, registration_type; USD at non-US banks: phone, tax_number — GET /v0/accounts/fiat/external/requirements reports when a route needs them and lists accepted values.VG 1110); Seismic now normalizes them to the canonical form before validation.GET /v0/rates now returns mid-market quotes for AED, CNY, HKD, PHP, and SGD.order.settlement_recorded webhook, and the admin dashboard.order.settlement_recorded webhook, and the admin dashboard.event_type + data).id_type, branch_name; HKD: registration_number, registration_type, date_of_incorporation; BRL (bank): phone, id_number, id_type, registration_number, registration_type; MXN: tax_number (RFC); INR: phone, id_number, id_type, registration_number, registration_type, relationship_to_debtor — and GET /v0/accounts/fiat/external/requirements now returns the complete requirements for these corridors, reporting each field's requirement level per route along with its accepted values and format.status_reason explaining why a payment was refunded or failed (e.g. COMPLIANCE_BLOCKED), returned from POST /v0/quotes/:id/accept, GET /v0/customers/orders/:id, and the order.status_changed webhook.amount_leg: "destination" on POST /v0/quotes to guarantee what the recipient receives and get the required pay-in back; exact-out snapshots rank cheapest pay-in first.order.settlement_recorded with the on-chain hash and source counterparty of the refund, and expose them on the order — same as completed orders.order.settlement_recorded webhooks are now delivered — the event was documented and typed but never actually sent.