---
title: "Upsert a customer's profile"
method: PUT
path: "/v0/customers/{id}/kyc/profile"
tags: ["Customers"]
---

# Upsert a customer's profile

`PUT /v0/customers/{id}/kyc/profile`

## Request

- Base URL: `https://orchestration.seismic.systems/api`
- URL: `https://orchestration.seismic.systems/api/v0/customers/{id}/kyc/profile`
- Auth: API key in header `Api-Key`

Save the profile — partial drafts are fine; validation runs at submit, not here. `kyc_link` is server-managed and absent from the request body.

## Path parameters

- `id` string, uuid, required

## Request body

- union: Request body for `PUT /v0/customers/:id/kyc/profile`. The link is server-managed and not part of the upsert surface, so callers send only `{ type, profile }` — `kyc_link` is read-only and absent here.
  - object
    - `profile` KycProfile, required
      - `addresses` KycProfileAddresses
        - `mailing` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
        - `residential` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
      - `attestations` KycProfileAttestations
        - `information_attested` boolean
        - `terms_and_conditions_accepted` boolean: Both must be `true` at submit.
      - `contact` KycProfileContact
        - `email` string, nullable
        - `phone` string, nullable
        - `phone_country_code` string, nullable: ISO-3166-1 alpha-2 code of the country whose dialing code is on `phone`. Required at submit.
      - `documents` KycProfileDocuments
        - `government_issued_identification` GovernmentIdentification
          - `back_image_document_id` string, uuid, nullable: Document id of the back-of-card scan. Often absent for passports.
          - `country` string, nullable: Issuing country (ISO-3166-1 alpha-2).
          - `expiration_date` string, date, nullable: Date the document expires (`YYYY-MM-DD`). Optional in general, but required by some jurisdictions before an account can be opened — notably AED.
          - `front_image_document_id` string, uuid, nullable: Document id of the front-of-card scan, from the documents upload endpoint.
          - `issuance_date` string, date, nullable: Date the document was issued (`YYYY-MM-DD`). Optional.
          - `kind` 'passport' | 'drivers_license' | 'national_id' | 'residence_permit' | 'voters_card' | 'other'
          - `number` string, nullable
        - `supporting_documents` SupportingDocumentRef[]: Free-form supporting documents (bank statements, proof of address, etc.), each referencing an uploaded document by id. Read-only: this list is derived from the documents attached via the document endpoints and is ignored on write — manage it through `POST`/`DELETE /v0/customers/{id}/kyc/documents`, not the profile.
          - `document_id` string, uuid, required
          - `kind` string, required
          - `proof_of_address_type` 'utility_bill' | 'bank_statement' | 'rental_agreement' | 'tax_document' | 'government_correspondence': What a proof of address is. Declared with the upload, because each verification review files a proof of address under one of these and nothing else about the file says which.
      - `employment` KycProfileEmployment
        - `employer_name` string, nullable
        - `employment_description` string, nullable: Required when `employment_status == Other`.
        - `employment_status` 'employee' | 'self_employed' | 'retired' | 'unemployed' | 'homemaker' | 'student' | 'other'
        - `occupation_soc` string, nullable: The individual's occupation, as a 6-digit SOC code (`NN-NNNN`) from the catalog served by `GET /v0/soc-codes`. Required at submit.
      - `identity` KycProfileIdentity
        - `citizenship` string, nullable: Citizenship (ISO-3166-1 alpha-2).
        - `country_of_birth` string, nullable: Country of birth (ISO-3166-1 alpha-2). Distinct from `nationality` and `citizenship` — a person can be born somewhere they hold neither.
        - `country_of_residence` string, nullable: Where the user actually lives (ISO-3166-1 alpha-2). Often equal to `nationality`.
        - `date_of_birth` string, date, nullable
        - `first_name` string, nullable
        - `gender` 'male' | 'female': Gender of an individual, as recorded on their government identification. Optional today. Seismic requires it before provisioning a virtual account in some currencies, and asks it of every beneficial owner of a business, not only of the account holder.
        - `last_name` string, nullable
        - `middle_name` string, nullable
        - `nationality` string, nullable: Passport country (ISO-3166-1 alpha-2).
        - `social_profile_url` string, nullable: Link to the customer's profile on LinkedIn, Facebook, Instagram or X. Optional; when present it must be an http(s) link to one of those networks. Corroborates the identity on the government ID during review.
        - `tax_identification_number` string, nullable: Tax ID / SSN. Required for US residents.
        - `transliterated_first_name` string, nullable: Latin-1 transliterations, required when the matching canonical name contains non-Latin-1 characters.
        - `transliterated_last_name` string, nullable
        - `transliterated_middle_name` string, nullable
      - `jurisdictions` KycProfileJurisdictions
        - `funds_send_receive_jurisdictions` string[]: Countries the user expects to send / receive funds to-from (ISO-3166-1 alpha-2).
        - `high_risk_activities` KyHighRiskActivity[]: High-risk activities the user engages in. Required at submit from 2026-09-14: send `["none_of_the_above"]` when none apply, so an unanswered disclosure is never mistaken for a negative one.
        - `vendors_and_counterparties` CounterpartyType[]
      - `risk` KycProfileRisk
        - `account_purpose` 'personal_use' | 'investment' | 'crypto_investment' | 'savings' | 'remittances' | 'payroll' | 'purchase_goods_and_services' | 'other' | 'charitable_donations' | 'ecommerce_collections' | 'freelance_collections' | 'salary_collections' | 'receive_payments_for_goods_and_services' | 'business_operations' | 'treasury_management'
        - `account_purpose_explanation` string, nullable: Required when `account_purpose == Other`.
        - `acting_as_intermediary` boolean: Whether this entity sits between any payer and payee. This includes marketplaces and fintech companies, even non-custodial ones that are not in the flow of funds. Defaults to `false`.
        - `pep_status` boolean: Self-attested PEP (Politically Exposed Person) flag.
        - `primary_source_of_funds` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
        - `primary_source_of_funds_description` string, nullable: Required when `primary_source_of_funds == Other`.
        - `source_of_wealth` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
      - `supplemental` SupplementalEntry[]: Supplemental-information entries: free-form text notes and document attachments for anything that doesn't fit the rest of the form. Omitted while empty.
        - `description` string, nullable
        - `document_id` string, uuid, nullable: The uploaded document this entry attaches (kind `supplemental`). Document entries only.
        - `id` string, uuid, nullable: Stable per-entry id assigned on first persistence. Omitted on create; echo it back to keep the entry stable across saves.
        - `kind` 'text' | 'document', required: Discriminant of a profile's supplemental-information entry: a free-form text note or a document attachment.
        - `title` string, nullable
      - `volumes` KycProfileVolumes: Expected activity volumes. Counts and USD values are whole integers — coarse estimates are fine.
        - `expected_monthly_payments_usd` integer, nullable: Expected monthly USD payments, whole dollars.
        - `monthly_crypto_deposits` integer, nullable
        - `monthly_crypto_investment_deposit_usd` integer, nullable
        - `monthly_crypto_investment_withdrawal_usd` integer, nullable
        - `monthly_crypto_withdrawals` integer, nullable
        - `monthly_deposits` integer, nullable: Monthly fiat deposit count.
        - `monthly_investment_deposit_usd` integer, nullable: Monthly investment deposit value in whole USD.
        - `monthly_investment_withdrawal_usd` integer, nullable
        - `monthly_withdrawals` integer, nullable
        - `usd_value_of_crypto` integer, nullable: Monthly crypto activity in whole USD.
        - `usd_value_of_fiat` integer, nullable: Monthly fiat activity in whole USD.
    - `type` 'individual', required
  - object
    - `profile` KybProfile, required
      - `addresses` KybProfileAddresses
        - `operating_is_remote` boolean: The business operates remotely, so the address it operates from is the residential address of a control person rather than an office. Setting it adds a statement to that effect to the supplemental information document compliance review reads. A `physical` address sent alongside it must match the address of one of the profile's beneficial owners, and the rule runs the other way too: an operating address that is a beneficial owner's residence requires this flag. `physical` itself stays optional — the residence may be the registered address the profile already carries.
        - `physical` OperatingAddress: The address the business operates from. Carries every `Address` field inline.
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
          - `remote` boolean: Deprecated — set `operating_is_remote` on the addresses object instead. Still accepted as the same declaration, and still returned in step with `operating_is_remote` while an operating address is on file.
        - `registered` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
      - `associated_persons` AssociatedPerson[]
        - `address` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
        - `citizenship` string, nullable
        - `country_of_birth` string, nullable: Country of birth (ISO-3166-1 alpha-2). Distinct from `nationality` and `citizenship` — a person can be born somewhere they hold neither.
        - `customer_id` string, uuid, nullable: The individual customer this person is asserted to be. Set it to reuse that customer's verification instead of verifying the same human twice; Seismic accepts the link only when the identifying details match exactly. Available on business customers only.
        - `date_of_birth` string, date, nullable
        - `documents` KybDocumentRef[]: Metadata (filename/size/type/date) for the documents referenced by the `*_document_id` fields above. Populated on read; ignored on write (the document ids are the source of truth).
          - `content_type` string, required
          - `deleted_at` string, date-time, nullable: When the document was soft-deleted, if it has been. Only ever populated on the internal admin documents view; the partner list omits soft-deleted documents entirely, so this is always absent there.
          - `description` string, nullable: User-supplied label; only ever set for multi-instance `other` docs.
          - `document_id` string, uuid, required
          - `filename` string, required
          - `kind` 'business_formation' | 'articles_of_association' | 'memorandum_of_association' | 'dba_registration' | 'bank_statement' | 'ubo_bank_statement' | 'ownership_information' | 'shareholder_register' | 'certificate_of_incumbency' | 'flow_of_funds' | 'proof_of_nature_of_business' | 'compliance_screening' | 'government_issued_id' | 'passport' | 'drivers_licence_front' | 'drivers_licence_back' | 'identity_card_front' | 'identity_card_back' | 'selfie' | 'proof_of_address' | 'ubo_source_of_funds' | 'tax_document' | 'licensed_vendors_attestation' | 'proof_of_licensure' | 'proof_of_verification' | 'supplemental' | 'other', required
          - `proof_of_address_type` 'utility_bill' | 'bank_statement' | 'rental_agreement' | 'tax_document' | 'government_correspondence': What a proof of address is. Declared with the upload, because each verification review files a proof of address under one of these and nothing else about the file says which.
          - `size_bytes` integer, required
          - `uploaded_at` string, date-time, required
        - `email` string, nullable
        - `first_name` string, nullable
        - `gender` 'male' | 'female': Gender of an individual, as recorded on their government identification. Optional today. Seismic requires it before provisioning a virtual account in some currencies, and asks it of every beneficial owner of a business, not only of the account holder.
        - `gov_id_back_image_document_id` string, uuid, nullable
        - `gov_id_country` string, nullable
        - `gov_id_expiration_date` string, date, nullable: Date the government ID expires (`YYYY-MM-DD`). Optional in general, but required by some jurisdictions before an account can be opened — notably AED.
        - `gov_id_front_image_document_id` string, uuid, nullable
        - `gov_id_issuance_date` string, date, nullable: Date the government ID was issued (`YYYY-MM-DD`). Optional.
        - `gov_id_kind` 'passport' | 'drivers_license' | 'national_id' | 'residence_permit' | 'voters_card' | 'other'
        - `gov_id_number` string, nullable
        - `id` string, uuid, nullable: Stable per-person id assigned on first persistence. Omitted on create; required by callers (e.g. document upload) to address a specific UBO row.
        - `last_name` string, nullable
        - `middle_name` string, nullable
        - `nationality` string, nullable
        - `ownership_percent` string, nullable: This person's stake in the business, as a percentage with up to two decimal places (e.g. `"33.33"`). Sent as a decimal string. Sums across all associated persons must not exceed 100; decimals let fractional stakes sum to 100 rather than being forced to whole numbers that overshoot.
        - `phone` string, nullable
        - `phone_country_code` string, nullable
        - `previous_economic_activity` EconomicActivity[]: What this person does for a living. A set, because more than one can apply at once; an empty array means unanswered.
        - `proof_of_address_document_id` string, uuid, nullable
        - `relationship_established_at` string, date, nullable: Calendar date the business's relationship with this person began. Required at submit, optional in the draft.
        - `roles` KybAssociatedPersonRole[]: Set of roles this person holds at the business. Must be non-empty at submit time.
        - `selfie_document_id` string, uuid, nullable
        - `source_of_wealth` 'salary' | 'dividends' | 'property_rental' | 'investment' | 'inheritance' | 'gambling' | 'donation': Where a beneficial owner's overall wealth came from. The net-worth question, distinct from `primary_source_of_funds`, the business's historical source of funds: where its funds have come from to date. A person gives one answer.
        - `tax_id` string, nullable
        - `tax_id_type` 'ssn' | 'itin': Which US taxpayer identifier an associated person's `tax_id` is. An SSN and an ITIN cannot be told apart by format, and verification needs to know which register to check.
        - `title` string, nullable
        - `transliterated_first_name` string, nullable
        - `transliterated_last_name` string, nullable
        - `transliterated_middle_name` string, nullable
      - `attestations` KybProfileAttestations: Submission-time attestations. Both must be `true` at submit.
        - `information_attested` boolean
        - `terms_and_conditions_accepted` boolean
      - `business` KybProfileBusiness
        - `corporate_entity_type_description` string, nullable: Required when `entity_type == Other`.
        - `country_of_registration` string, nullable
        - `description` string, nullable: What the business does, who its customers are, how it makes money, and how funds move through it. At least 350 characters at submit, and from 2026-11-01 at most 1,000.
        - `entity_type` 'sole_proprietorship' | 'llc' | 's_corporation' | 'c_corporation' | 'b_corporation' | 'non_profit' | 'partnership' | 'limited_partnership' | 'limited_liability_partnership' | 'trust' | 'dao' | 'cooperative' | 'other'
        - `formation_date` string, date, nullable
        - `industry` string, nullable
        - `is_dao` boolean
        - `legal_name` string, nullable
        - `marketing_strategy` string, nullable: How the entity markets themselves to generate business. Required when the entity has no website, and dropped on save when a website is given.
        - `no_website` boolean: The entity has no public-facing website. Setting it clears `website` and makes `marketing_strategy`, `website_eta`, and `social_media_profile` required.
        - `pre_revenue` boolean: The entity has no revenue yet, so its proof of nature of business is alternative documentation of its preparations to operate rather than invoices or executed agreements. Setting it adds a statement to that effect to the supplemental information document compliance review reads.
        - `publicly_traded` boolean: The entity's shares trade on a public exchange. Listed entities carry disclosure obligations that change what verification is required of them, so compliance review needs the answer stated rather than assumed. Defaults to `false`, which is what an entity that has never been asked submits.
        - `registration_number` string, nullable
        - `social_media_profile` string, nullable: A social media profile URL for the entity, or for one of its beneficial owners, standing in for the website it does not have. Required when the entity has no website, and dropped on save when a website is given.
        - `state_of_incorporation` string, nullable
        - `target_customers_description` string, nullable: Who the entity's customers are, in the detail compliance review needs: whether they are individuals or businesses, where they are located, their top personas, their financial motivation for opening an account, and how they use it in practice. Required at submit on your own organization's KYB, and included in the supplemental information document compliance review reads.
        - `tax_id` string, nullable
        - `trade_name` string, nullable
        - `transliterated_legal_name` string, nullable
        - `transliterated_trade_name` string, nullable
        - `website` string, nullable: Public-facing URL. Optional — omit it when the entity has no public website, in which case `marketing_strategy`, `website_eta`, and `social_media_profile` are required instead.
        - `website_eta` string, nullable: When the entity expects to publish a website: an ISO-8601 date in the future, or `0000-00-00` when it does not intend to have one. Required when the entity has no website, and dropped on save when a website is given.
      - `contact` KybProfileContact
        - `email` string, nullable
        - `phone` string, nullable
        - `phone_country_code` string, nullable
      - `counterparties` KybProfileCounterparties
        - `counterparties` CounterpartyType[]
      - `documents` KybDocumentRef[]
        - `content_type` string, required
        - `deleted_at` string, date-time, nullable: When the document was soft-deleted, if it has been. Only ever populated on the internal admin documents view; the partner list omits soft-deleted documents entirely, so this is always absent there.
        - `description` string, nullable: User-supplied label; only ever set for multi-instance `other` docs.
        - `document_id` string, uuid, required
        - `filename` string, required
        - `kind` 'business_formation' | 'articles_of_association' | 'memorandum_of_association' | 'dba_registration' | 'bank_statement' | 'ubo_bank_statement' | 'ownership_information' | 'shareholder_register' | 'certificate_of_incumbency' | 'flow_of_funds' | 'proof_of_nature_of_business' | 'compliance_screening' | 'government_issued_id' | 'passport' | 'drivers_licence_front' | 'drivers_licence_back' | 'identity_card_front' | 'identity_card_back' | 'selfie' | 'proof_of_address' | 'ubo_source_of_funds' | 'tax_document' | 'licensed_vendors_attestation' | 'proof_of_licensure' | 'proof_of_verification' | 'supplemental' | 'other', required
        - `proof_of_address_type` 'utility_bill' | 'bank_statement' | 'rental_agreement' | 'tax_document' | 'government_correspondence': What a proof of address is. Declared with the upload, because each verification review files a proof of address under one of these and nothing else about the file says which.
        - `size_bytes` integer, required
        - `uploaded_at` string, date-time, required
      - `operations` KybProfileOperations
        - `account_purpose` 'personal_use' | 'investment' | 'crypto_investment' | 'savings' | 'remittances' | 'payroll' | 'purchase_goods_and_services' | 'other' | 'charitable_donations' | 'ecommerce_collections' | 'freelance_collections' | 'salary_collections' | 'receive_payments_for_goods_and_services' | 'business_operations' | 'treasury_management'
        - `account_purpose_explanation` string, nullable: How the business will use its accounts. Required when `account_purpose` or `primary_source_of_funds` is `other`, and from 2026-11-14 whatever the purpose. From 2026-11-01, 200 to 1,000 characters when given.
        - `acting_as_intermediary` boolean: Whether this entity sits between any payer and payee. This includes marketplaces and fintech companies, even non-custodial ones that are not in the flow of funds. Defaults to `false`.
        - `business_classifications` BusinessClassification[]: How the business positions itself between payers and payees. Selecting `marketplace` or `financial_services_provider` implies `acting_as_intermediary`, and requires a `flow_of_funds` and a `licensed_vendors_attestation` document at submit. Required at submit from 2026-09-14: send `["none_of_the_above"]` when none apply. The organization's own profile always includes `financial_services_provider`, whatever is sent.
        - `business_jurisdictions` string[]
        - `compliance_screening_explanation` string, nullable: The combined screening narrative sent to compliance. Set it directly to supply the whole thing, or answer `msb_compliance_screening_description` / `high_risk_activities_description` and it is assembled from those. From 2026-11-01, the assembled narrative, section headers included, may be at most 1,000 characters.
        - `funds_movement_jurisdictions` string[]
        - `has_complex_ownership` boolean: Set true when the business has UBOs requiring beneficial-owner disclosure (typically at least one `beneficial_owner` role in `associated_persons`).
        - `high_risk_activities` KyHighRiskActivity[]: The high-risk activities the business is involved in. Required at submit from 2026-09-14: send `["none_of_the_above"]` when none apply, so an unanswered disclosure is never mistaken for a negative one.
        - `high_risk_activities_description` string, nullable: The business's involvement in the verticals it disclosed. Required when `high_risk_activities` names a real vertical.
        - `in_flow_of_funds` boolean, nullable: Whether the entity will at any point receive, hold, control, convert, or transmit customer funds, fiat or digital. Asked of marketplaces and financial services providers, and included in the supplemental information document compliance review reads. Required at submit for marketplaces and financial services providers, which includes every organization; `false` is an answer. From 2026-11-01, `true` requires `registered_msb_description` and `msb_compliance_screening_description`.
        - `licensed_vendors` boolean: The entity relies on licensed / regulated vendors as a core part of its business. When true, an attested list of those vendors is a required document at submit (`documents.licensed_vendors_attestation`). Always `true` on the organization's own profile, whatever is sent.
        - `msb_compliance_screening_description` string, nullable: The compliance screening program behind the business's money services. Required when `registered_msb` is `true`. From 2026-11-01, also required when `in_flow_of_funds` is `true`, and at least 200 characters.
        - `operates_in_prohibited_countries` boolean
        - `primary_source_of_funds` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
        - `primary_source_of_funds_description` string, nullable: Detail on the business's historical source of funds. Required at submit whatever `primary_source_of_funds` is; from 2026-11-01, 200 to 1,000 characters.
        - `registered_msb` boolean, nullable: Whether the business is registered as a money services business in any country. On a business customer, omitting it means `false`. On the organization's own profile it is a required yes/no answer at submit from 2026-11-01, and `false` is an answer.
        - `registered_msb_description` string, nullable: The money services the business provides. Required when `registered_msb` is `true`, and from 2026-11-01 also when `in_flow_of_funds` is `true`.
        - `regulated_activity_description` string, nullable: Free-text describing the licensed activity. All four `regulated_*` fields are absent together when the business does not conduct regulated activities, and set together when it does.
        - `regulated_authority_country` string, nullable
        - `regulated_authority_name` string, nullable
        - `regulated_license_number` string, nullable
        - `regulated_status` 'regulated' | 'registered' | 'licensed' | 'not_required'
        - `source_of_wealth` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
      - `supplemental` SupplementalEntry[]: Supplemental-information entries: free-form text notes and document attachments for anything that doesn't fit the rest of the form. Omitted while empty.
        - `description` string, nullable
        - `document_id` string, uuid, nullable: The uploaded document this entry attaches (kind `supplemental`). Document entries only.
        - `id` string, uuid, nullable: Stable per-entry id assigned on first persistence. Omitted on create; echo it back to keep the entry stable across saves.
        - `kind` 'text' | 'document', required: Discriminant of a profile's supplemental-information entry: a free-form text note or a document attachment.
        - `title` string, nullable
      - `volumes` KybProfileVolumes: Expected activity volumes. Counts and USD values are whole integers — coarse estimates are fine.
        - `estimated_annual_revenue_usd` integer, nullable: Annual revenue, whole dollars.
        - `expected_monthly_payments_usd` integer, nullable: Expected monthly USD payments, whole dollars. Defaults to `usd_value_of_fiat` when omitted.
        - `monthly_crypto_deposits` integer, nullable
        - `monthly_crypto_investment_deposit_usd` integer, nullable
        - `monthly_crypto_investment_withdrawal_usd` integer, nullable
        - `monthly_crypto_withdrawals` integer, nullable
        - `monthly_deposits` integer, nullable: Monthly fiat deposit count.
        - `monthly_investment_deposit_usd` integer, nullable: Monthly investment deposit value in whole USD.
        - `monthly_investment_withdrawal_usd` integer, nullable
        - `monthly_withdrawals` integer, nullable
        - `usd_value_of_crypto` integer, nullable: Monthly expected crypto activity in whole USD.
        - `usd_value_of_fiat` integer, nullable: Monthly expected fiat activity in whole USD.
    - `type` 'business', required

## Response `200`

The saved profile envelope.

- union: `GET /v0/customers/:id` and the response of `PUT /v0/customers/:id/kyc/profile` and `GET /v0/customers/:id/kyc/profile`. Carries the saved `profile` plus the hosted KYC link inline.
  - object
    - `kyc_link` HostedKycLink, required: Hosted KYC link surfaced inline on every customer payload. The partner emails `url` to their customer; the customer clicks through to the standalone `/kyc-link/<token>` page and fills in the hosted verification form. `token` is the same plaintext embedded in the URL — exposed so partners can build their own URLs against a different frontend host. Rotation: `POST /v0/customers/:id/kyc-link/rotate` overwrites the token in place and returns the new pair. There is no expiry or revocation.
      - `token` string, required
      - `url` string, required: Absolute URL the partner emails to their customer — origin + optional base path + `/kyc-link/<kind>/<token>`. The origin is Seismic's hosted origin for the environment (`https://orchestration.seismic.systems` in production, `https://orchestration.seismictest.net` in sandbox). Partners embedding the link in their own branded frontend can ignore this and rebuild the URL against their own host using `token`.
    - `profile` KycProfile, required
      - `addresses` KycProfileAddresses
        - `mailing` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
        - `residential` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
      - `attestations` KycProfileAttestations
        - `information_attested` boolean
        - `terms_and_conditions_accepted` boolean: Both must be `true` at submit.
      - `contact` KycProfileContact
        - `email` string, nullable
        - `phone` string, nullable
        - `phone_country_code` string, nullable: ISO-3166-1 alpha-2 code of the country whose dialing code is on `phone`. Required at submit.
      - `documents` KycProfileDocuments
        - `government_issued_identification` GovernmentIdentification
          - `back_image_document_id` string, uuid, nullable: Document id of the back-of-card scan. Often absent for passports.
          - `country` string, nullable: Issuing country (ISO-3166-1 alpha-2).
          - `expiration_date` string, date, nullable: Date the document expires (`YYYY-MM-DD`). Optional in general, but required by some jurisdictions before an account can be opened — notably AED.
          - `front_image_document_id` string, uuid, nullable: Document id of the front-of-card scan, from the documents upload endpoint.
          - `issuance_date` string, date, nullable: Date the document was issued (`YYYY-MM-DD`). Optional.
          - `kind` 'passport' | 'drivers_license' | 'national_id' | 'residence_permit' | 'voters_card' | 'other'
          - `number` string, nullable
        - `supporting_documents` SupportingDocumentRef[]: Free-form supporting documents (bank statements, proof of address, etc.), each referencing an uploaded document by id. Read-only: this list is derived from the documents attached via the document endpoints and is ignored on write — manage it through `POST`/`DELETE /v0/customers/{id}/kyc/documents`, not the profile.
          - `document_id` string, uuid, required
          - `kind` string, required
          - `proof_of_address_type` 'utility_bill' | 'bank_statement' | 'rental_agreement' | 'tax_document' | 'government_correspondence': What a proof of address is. Declared with the upload, because each verification review files a proof of address under one of these and nothing else about the file says which.
      - `employment` KycProfileEmployment
        - `employer_name` string, nullable
        - `employment_description` string, nullable: Required when `employment_status == Other`.
        - `employment_status` 'employee' | 'self_employed' | 'retired' | 'unemployed' | 'homemaker' | 'student' | 'other'
        - `occupation_soc` string, nullable: The individual's occupation, as a 6-digit SOC code (`NN-NNNN`) from the catalog served by `GET /v0/soc-codes`. Required at submit.
      - `identity` KycProfileIdentity
        - `citizenship` string, nullable: Citizenship (ISO-3166-1 alpha-2).
        - `country_of_birth` string, nullable: Country of birth (ISO-3166-1 alpha-2). Distinct from `nationality` and `citizenship` — a person can be born somewhere they hold neither.
        - `country_of_residence` string, nullable: Where the user actually lives (ISO-3166-1 alpha-2). Often equal to `nationality`.
        - `date_of_birth` string, date, nullable
        - `first_name` string, nullable
        - `gender` 'male' | 'female': Gender of an individual, as recorded on their government identification. Optional today. Seismic requires it before provisioning a virtual account in some currencies, and asks it of every beneficial owner of a business, not only of the account holder.
        - `last_name` string, nullable
        - `middle_name` string, nullable
        - `nationality` string, nullable: Passport country (ISO-3166-1 alpha-2).
        - `social_profile_url` string, nullable: Link to the customer's profile on LinkedIn, Facebook, Instagram or X. Optional; when present it must be an http(s) link to one of those networks. Corroborates the identity on the government ID during review.
        - `tax_identification_number` string, nullable: Tax ID / SSN. Required for US residents.
        - `transliterated_first_name` string, nullable: Latin-1 transliterations, required when the matching canonical name contains non-Latin-1 characters.
        - `transliterated_last_name` string, nullable
        - `transliterated_middle_name` string, nullable
      - `jurisdictions` KycProfileJurisdictions
        - `funds_send_receive_jurisdictions` string[]: Countries the user expects to send / receive funds to-from (ISO-3166-1 alpha-2).
        - `high_risk_activities` KyHighRiskActivity[]: High-risk activities the user engages in. Required at submit from 2026-09-14: send `["none_of_the_above"]` when none apply, so an unanswered disclosure is never mistaken for a negative one.
        - `vendors_and_counterparties` CounterpartyType[]
      - `risk` KycProfileRisk
        - `account_purpose` 'personal_use' | 'investment' | 'crypto_investment' | 'savings' | 'remittances' | 'payroll' | 'purchase_goods_and_services' | 'other' | 'charitable_donations' | 'ecommerce_collections' | 'freelance_collections' | 'salary_collections' | 'receive_payments_for_goods_and_services' | 'business_operations' | 'treasury_management'
        - `account_purpose_explanation` string, nullable: Required when `account_purpose == Other`.
        - `acting_as_intermediary` boolean: Whether this entity sits between any payer and payee. This includes marketplaces and fintech companies, even non-custodial ones that are not in the flow of funds. Defaults to `false`.
        - `pep_status` boolean: Self-attested PEP (Politically Exposed Person) flag.
        - `primary_source_of_funds` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
        - `primary_source_of_funds_description` string, nullable: Required when `primary_source_of_funds == Other`.
        - `source_of_wealth` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
      - `supplemental` SupplementalEntry[]: Supplemental-information entries: free-form text notes and document attachments for anything that doesn't fit the rest of the form. Omitted while empty.
        - `description` string, nullable
        - `document_id` string, uuid, nullable: The uploaded document this entry attaches (kind `supplemental`). Document entries only.
        - `id` string, uuid, nullable: Stable per-entry id assigned on first persistence. Omitted on create; echo it back to keep the entry stable across saves.
        - `kind` 'text' | 'document', required: Discriminant of a profile's supplemental-information entry: a free-form text note or a document attachment.
        - `title` string, nullable
      - `volumes` KycProfileVolumes: Expected activity volumes. Counts and USD values are whole integers — coarse estimates are fine.
        - `expected_monthly_payments_usd` integer, nullable: Expected monthly USD payments, whole dollars.
        - `monthly_crypto_deposits` integer, nullable
        - `monthly_crypto_investment_deposit_usd` integer, nullable
        - `monthly_crypto_investment_withdrawal_usd` integer, nullable
        - `monthly_crypto_withdrawals` integer, nullable
        - `monthly_deposits` integer, nullable: Monthly fiat deposit count.
        - `monthly_investment_deposit_usd` integer, nullable: Monthly investment deposit value in whole USD.
        - `monthly_investment_withdrawal_usd` integer, nullable
        - `monthly_withdrawals` integer, nullable
        - `usd_value_of_crypto` integer, nullable: Monthly crypto activity in whole USD.
        - `usd_value_of_fiat` integer, nullable: Monthly fiat activity in whole USD.
    - `type` 'individual', required
  - object
    - `kyc_link` HostedKycLink, required: Hosted KYC link surfaced inline on every customer payload. The partner emails `url` to their customer; the customer clicks through to the standalone `/kyc-link/<token>` page and fills in the hosted verification form. `token` is the same plaintext embedded in the URL — exposed so partners can build their own URLs against a different frontend host. Rotation: `POST /v0/customers/:id/kyc-link/rotate` overwrites the token in place and returns the new pair. There is no expiry or revocation.
      - `token` string, required
      - `url` string, required: Absolute URL the partner emails to their customer — origin + optional base path + `/kyc-link/<kind>/<token>`. The origin is Seismic's hosted origin for the environment (`https://orchestration.seismic.systems` in production, `https://orchestration.seismictest.net` in sandbox). Partners embedding the link in their own branded frontend can ignore this and rebuild the URL against their own host using `token`.
    - `profile` KybProfile, required
      - `addresses` KybProfileAddresses
        - `operating_is_remote` boolean: The business operates remotely, so the address it operates from is the residential address of a control person rather than an office. Setting it adds a statement to that effect to the supplemental information document compliance review reads. A `physical` address sent alongside it must match the address of one of the profile's beneficial owners, and the rule runs the other way too: an operating address that is a beneficial owner's residence requires this flag. `physical` itself stays optional — the residence may be the registered address the profile already carries.
        - `physical` OperatingAddress: The address the business operates from. Carries every `Address` field inline.
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
          - `remote` boolean: Deprecated — set `operating_is_remote` on the addresses object instead. Still accepted as the same declaration, and still returned in step with `operating_is_remote` while an operating address is on file.
        - `registered` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
      - `associated_persons` AssociatedPerson[]
        - `address` Address
          - `city` string, nullable
          - `line1` string, nullable
          - `line2` string, nullable
          - `postal_code` string, nullable
          - `state` string, nullable
          - `country` string, nullable: ISO-3166-1 alpha-2 country code: two letters (`SG`, `US`, `GB`), never the country name.
          - `transliterated_address` AddressLines
            - `city` string, nullable
            - `line1` string, nullable
            - `line2` string, nullable
            - `postal_code` string, nullable
            - `state` string, nullable
        - `citizenship` string, nullable
        - `country_of_birth` string, nullable: Country of birth (ISO-3166-1 alpha-2). Distinct from `nationality` and `citizenship` — a person can be born somewhere they hold neither.
        - `customer_id` string, uuid, nullable: The individual customer this person is asserted to be. Set it to reuse that customer's verification instead of verifying the same human twice; Seismic accepts the link only when the identifying details match exactly. Available on business customers only.
        - `date_of_birth` string, date, nullable
        - `documents` KybDocumentRef[]: Metadata (filename/size/type/date) for the documents referenced by the `*_document_id` fields above. Populated on read; ignored on write (the document ids are the source of truth).
          - `content_type` string, required
          - `deleted_at` string, date-time, nullable: When the document was soft-deleted, if it has been. Only ever populated on the internal admin documents view; the partner list omits soft-deleted documents entirely, so this is always absent there.
          - `description` string, nullable: User-supplied label; only ever set for multi-instance `other` docs.
          - `document_id` string, uuid, required
          - `filename` string, required
          - `kind` 'business_formation' | 'articles_of_association' | 'memorandum_of_association' | 'dba_registration' | 'bank_statement' | 'ubo_bank_statement' | 'ownership_information' | 'shareholder_register' | 'certificate_of_incumbency' | 'flow_of_funds' | 'proof_of_nature_of_business' | 'compliance_screening' | 'government_issued_id' | 'passport' | 'drivers_licence_front' | 'drivers_licence_back' | 'identity_card_front' | 'identity_card_back' | 'selfie' | 'proof_of_address' | 'ubo_source_of_funds' | 'tax_document' | 'licensed_vendors_attestation' | 'proof_of_licensure' | 'proof_of_verification' | 'supplemental' | 'other', required
          - `proof_of_address_type` 'utility_bill' | 'bank_statement' | 'rental_agreement' | 'tax_document' | 'government_correspondence': What a proof of address is. Declared with the upload, because each verification review files a proof of address under one of these and nothing else about the file says which.
          - `size_bytes` integer, required
          - `uploaded_at` string, date-time, required
        - `email` string, nullable
        - `first_name` string, nullable
        - `gender` 'male' | 'female': Gender of an individual, as recorded on their government identification. Optional today. Seismic requires it before provisioning a virtual account in some currencies, and asks it of every beneficial owner of a business, not only of the account holder.
        - `gov_id_back_image_document_id` string, uuid, nullable
        - `gov_id_country` string, nullable
        - `gov_id_expiration_date` string, date, nullable: Date the government ID expires (`YYYY-MM-DD`). Optional in general, but required by some jurisdictions before an account can be opened — notably AED.
        - `gov_id_front_image_document_id` string, uuid, nullable
        - `gov_id_issuance_date` string, date, nullable: Date the government ID was issued (`YYYY-MM-DD`). Optional.
        - `gov_id_kind` 'passport' | 'drivers_license' | 'national_id' | 'residence_permit' | 'voters_card' | 'other'
        - `gov_id_number` string, nullable
        - `id` string, uuid, nullable: Stable per-person id assigned on first persistence. Omitted on create; required by callers (e.g. document upload) to address a specific UBO row.
        - `last_name` string, nullable
        - `middle_name` string, nullable
        - `nationality` string, nullable
        - `ownership_percent` string, nullable: This person's stake in the business, as a percentage with up to two decimal places (e.g. `"33.33"`). Sent as a decimal string. Sums across all associated persons must not exceed 100; decimals let fractional stakes sum to 100 rather than being forced to whole numbers that overshoot.
        - `phone` string, nullable
        - `phone_country_code` string, nullable
        - `previous_economic_activity` EconomicActivity[]: What this person does for a living. A set, because more than one can apply at once; an empty array means unanswered.
        - `proof_of_address_document_id` string, uuid, nullable
        - `relationship_established_at` string, date, nullable: Calendar date the business's relationship with this person began. Required at submit, optional in the draft.
        - `roles` KybAssociatedPersonRole[]: Set of roles this person holds at the business. Must be non-empty at submit time.
        - `selfie_document_id` string, uuid, nullable
        - `source_of_wealth` 'salary' | 'dividends' | 'property_rental' | 'investment' | 'inheritance' | 'gambling' | 'donation': Where a beneficial owner's overall wealth came from. The net-worth question, distinct from `primary_source_of_funds`, the business's historical source of funds: where its funds have come from to date. A person gives one answer.
        - `tax_id` string, nullable
        - `tax_id_type` 'ssn' | 'itin': Which US taxpayer identifier an associated person's `tax_id` is. An SSN and an ITIN cannot be told apart by format, and verification needs to know which register to check.
        - `title` string, nullable
        - `transliterated_first_name` string, nullable
        - `transliterated_last_name` string, nullable
        - `transliterated_middle_name` string, nullable
      - `attestations` KybProfileAttestations: Submission-time attestations. Both must be `true` at submit.
        - `information_attested` boolean
        - `terms_and_conditions_accepted` boolean
      - `business` KybProfileBusiness
        - `corporate_entity_type_description` string, nullable: Required when `entity_type == Other`.
        - `country_of_registration` string, nullable
        - `description` string, nullable: What the business does, who its customers are, how it makes money, and how funds move through it. At least 350 characters at submit, and from 2026-11-01 at most 1,000.
        - `entity_type` 'sole_proprietorship' | 'llc' | 's_corporation' | 'c_corporation' | 'b_corporation' | 'non_profit' | 'partnership' | 'limited_partnership' | 'limited_liability_partnership' | 'trust' | 'dao' | 'cooperative' | 'other'
        - `formation_date` string, date, nullable
        - `industry` string, nullable
        - `is_dao` boolean
        - `legal_name` string, nullable
        - `marketing_strategy` string, nullable: How the entity markets themselves to generate business. Required when the entity has no website, and dropped on save when a website is given.
        - `no_website` boolean: The entity has no public-facing website. Setting it clears `website` and makes `marketing_strategy`, `website_eta`, and `social_media_profile` required.
        - `pre_revenue` boolean: The entity has no revenue yet, so its proof of nature of business is alternative documentation of its preparations to operate rather than invoices or executed agreements. Setting it adds a statement to that effect to the supplemental information document compliance review reads.
        - `publicly_traded` boolean: The entity's shares trade on a public exchange. Listed entities carry disclosure obligations that change what verification is required of them, so compliance review needs the answer stated rather than assumed. Defaults to `false`, which is what an entity that has never been asked submits.
        - `registration_number` string, nullable
        - `social_media_profile` string, nullable: A social media profile URL for the entity, or for one of its beneficial owners, standing in for the website it does not have. Required when the entity has no website, and dropped on save when a website is given.
        - `state_of_incorporation` string, nullable
        - `target_customers_description` string, nullable: Who the entity's customers are, in the detail compliance review needs: whether they are individuals or businesses, where they are located, their top personas, their financial motivation for opening an account, and how they use it in practice. Required at submit on your own organization's KYB, and included in the supplemental information document compliance review reads.
        - `tax_id` string, nullable
        - `trade_name` string, nullable
        - `transliterated_legal_name` string, nullable
        - `transliterated_trade_name` string, nullable
        - `website` string, nullable: Public-facing URL. Optional — omit it when the entity has no public website, in which case `marketing_strategy`, `website_eta`, and `social_media_profile` are required instead.
        - `website_eta` string, nullable: When the entity expects to publish a website: an ISO-8601 date in the future, or `0000-00-00` when it does not intend to have one. Required when the entity has no website, and dropped on save when a website is given.
      - `contact` KybProfileContact
        - `email` string, nullable
        - `phone` string, nullable
        - `phone_country_code` string, nullable
      - `counterparties` KybProfileCounterparties
        - `counterparties` CounterpartyType[]
      - `documents` KybDocumentRef[]
        - `content_type` string, required
        - `deleted_at` string, date-time, nullable: When the document was soft-deleted, if it has been. Only ever populated on the internal admin documents view; the partner list omits soft-deleted documents entirely, so this is always absent there.
        - `description` string, nullable: User-supplied label; only ever set for multi-instance `other` docs.
        - `document_id` string, uuid, required
        - `filename` string, required
        - `kind` 'business_formation' | 'articles_of_association' | 'memorandum_of_association' | 'dba_registration' | 'bank_statement' | 'ubo_bank_statement' | 'ownership_information' | 'shareholder_register' | 'certificate_of_incumbency' | 'flow_of_funds' | 'proof_of_nature_of_business' | 'compliance_screening' | 'government_issued_id' | 'passport' | 'drivers_licence_front' | 'drivers_licence_back' | 'identity_card_front' | 'identity_card_back' | 'selfie' | 'proof_of_address' | 'ubo_source_of_funds' | 'tax_document' | 'licensed_vendors_attestation' | 'proof_of_licensure' | 'proof_of_verification' | 'supplemental' | 'other', required
        - `proof_of_address_type` 'utility_bill' | 'bank_statement' | 'rental_agreement' | 'tax_document' | 'government_correspondence': What a proof of address is. Declared with the upload, because each verification review files a proof of address under one of these and nothing else about the file says which.
        - `size_bytes` integer, required
        - `uploaded_at` string, date-time, required
      - `operations` KybProfileOperations
        - `account_purpose` 'personal_use' | 'investment' | 'crypto_investment' | 'savings' | 'remittances' | 'payroll' | 'purchase_goods_and_services' | 'other' | 'charitable_donations' | 'ecommerce_collections' | 'freelance_collections' | 'salary_collections' | 'receive_payments_for_goods_and_services' | 'business_operations' | 'treasury_management'
        - `account_purpose_explanation` string, nullable: How the business will use its accounts. Required when `account_purpose` or `primary_source_of_funds` is `other`, and from 2026-11-14 whatever the purpose. From 2026-11-01, 200 to 1,000 characters when given.
        - `acting_as_intermediary` boolean: Whether this entity sits between any payer and payee. This includes marketplaces and fintech companies, even non-custodial ones that are not in the flow of funds. Defaults to `false`.
        - `business_classifications` BusinessClassification[]: How the business positions itself between payers and payees. Selecting `marketplace` or `financial_services_provider` implies `acting_as_intermediary`, and requires a `flow_of_funds` and a `licensed_vendors_attestation` document at submit. Required at submit from 2026-09-14: send `["none_of_the_above"]` when none apply. The organization's own profile always includes `financial_services_provider`, whatever is sent.
        - `business_jurisdictions` string[]
        - `compliance_screening_explanation` string, nullable: The combined screening narrative sent to compliance. Set it directly to supply the whole thing, or answer `msb_compliance_screening_description` / `high_risk_activities_description` and it is assembled from those. From 2026-11-01, the assembled narrative, section headers included, may be at most 1,000 characters.
        - `funds_movement_jurisdictions` string[]
        - `has_complex_ownership` boolean: Set true when the business has UBOs requiring beneficial-owner disclosure (typically at least one `beneficial_owner` role in `associated_persons`).
        - `high_risk_activities` KyHighRiskActivity[]: The high-risk activities the business is involved in. Required at submit from 2026-09-14: send `["none_of_the_above"]` when none apply, so an unanswered disclosure is never mistaken for a negative one.
        - `high_risk_activities_description` string, nullable: The business's involvement in the verticals it disclosed. Required when `high_risk_activities` names a real vertical.
        - `in_flow_of_funds` boolean, nullable: Whether the entity will at any point receive, hold, control, convert, or transmit customer funds, fiat or digital. Asked of marketplaces and financial services providers, and included in the supplemental information document compliance review reads. Required at submit for marketplaces and financial services providers, which includes every organization; `false` is an answer. From 2026-11-01, `true` requires `registered_msb_description` and `msb_compliance_screening_description`.
        - `licensed_vendors` boolean: The entity relies on licensed / regulated vendors as a core part of its business. When true, an attested list of those vendors is a required document at submit (`documents.licensed_vendors_attestation`). Always `true` on the organization's own profile, whatever is sent.
        - `msb_compliance_screening_description` string, nullable: The compliance screening program behind the business's money services. Required when `registered_msb` is `true`. From 2026-11-01, also required when `in_flow_of_funds` is `true`, and at least 200 characters.
        - `operates_in_prohibited_countries` boolean
        - `primary_source_of_funds` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
        - `primary_source_of_funds_description` string, nullable: Detail on the business's historical source of funds. Required at submit whatever `primary_source_of_funds` is; from 2026-11-01, 200 to 1,000 characters.
        - `registered_msb` boolean, nullable: Whether the business is registered as a money services business in any country. On a business customer, omitting it means `false`. On the organization's own profile it is a required yes/no answer at submit from 2026-11-01, and `false` is an answer.
        - `registered_msb_description` string, nullable: The money services the business provides. Required when `registered_msb` is `true`, and from 2026-11-01 also when `in_flow_of_funds` is `true`.
        - `regulated_activity_description` string, nullable: Free-text describing the licensed activity. All four `regulated_*` fields are absent together when the business does not conduct regulated activities, and set together when it does.
        - `regulated_authority_country` string, nullable
        - `regulated_authority_name` string, nullable
        - `regulated_license_number` string, nullable
        - `regulated_status` 'regulated' | 'registered' | 'licensed' | 'not_required'
        - `source_of_wealth` 'salary' | 'savings' | 'business_revenue' | 'company_capital' | 'investment_returns' | 'inheritance' | 'trust' | 'gift' | 'grant' | 'sale_of_assets' | 'real_estate' | 'loan' | 'private_capital' | 'marital' | 'winnings' | 'other'
      - `supplemental` SupplementalEntry[]: Supplemental-information entries: free-form text notes and document attachments for anything that doesn't fit the rest of the form. Omitted while empty.
        - `description` string, nullable
        - `document_id` string, uuid, nullable: The uploaded document this entry attaches (kind `supplemental`). Document entries only.
        - `id` string, uuid, nullable: Stable per-entry id assigned on first persistence. Omitted on create; echo it back to keep the entry stable across saves.
        - `kind` 'text' | 'document', required: Discriminant of a profile's supplemental-information entry: a free-form text note or a document attachment.
        - `title` string, nullable
      - `volumes` KybProfileVolumes: Expected activity volumes. Counts and USD values are whole integers — coarse estimates are fine.
        - `estimated_annual_revenue_usd` integer, nullable: Annual revenue, whole dollars.
        - `expected_monthly_payments_usd` integer, nullable: Expected monthly USD payments, whole dollars. Defaults to `usd_value_of_fiat` when omitted.
        - `monthly_crypto_deposits` integer, nullable
        - `monthly_crypto_investment_deposit_usd` integer, nullable
        - `monthly_crypto_investment_withdrawal_usd` integer, nullable
        - `monthly_crypto_withdrawals` integer, nullable
        - `monthly_deposits` integer, nullable: Monthly fiat deposit count.
        - `monthly_investment_deposit_usd` integer, nullable: Monthly investment deposit value in whole USD.
        - `monthly_investment_withdrawal_usd` integer, nullable
        - `monthly_withdrawals` integer, nullable
        - `usd_value_of_crypto` integer, nullable: Monthly expected crypto activity in whole USD.
        - `usd_value_of_fiat` integer, nullable: Monthly expected fiat activity in whole USD.
    - `type` 'business', required

## Other responses

- `400`: Malformed body, or `type` contradicts the customer's actual kind.
- `401`: Missing or invalid API key.
- `404`: Customer not found.
- `422`: A referenced document id does not resolve to one of this customer's documents — the error carries the offending field path.

---

[API](https://skmtc.dev/seismic/apis/seismic-orchestration-api.md) - [All operations](https://skmtc.dev/seismic/apis/seismic-orchestration-api/llms.txt) - [OpenAPI document](https://skmtc.dev/seismic/apis/seismic-orchestration-api/revisions/08ada1f159fa?raw)
