Finmo <> ZenithProduction

Partner API, production

Base URL https://production.finmotreasury.net/v1. HTTP Basic with the production key pair Finmo sends you over a secure channel. The sandbox keys don't work here.

  • Organizations are real Finmo production organizations, named Zenith Test - <merchant name> so Finmo compliance can tell them apart.
  • KYB is approved by Finmo compliance, not instantly. Expect minutes to hours. Activation (AUD account details) is done by Finmo after approval.
  • Payouts and FX move real money from the sub account's balance.
  • Sandbox-only calls (/payout/simulate, /virtual-account/simulate-payin, /partner/kyb/simulate) return 404.
  • Send X-Idempotency-Key (UUID v4) on every POST. Never resend a payout after a timeout without checking GET /payout first.

Endpoints

POST/partner/invite-organizationwrappedAccepts abn / acn + address_city (and state, postcode, address_line1, organization_reference_id). Finmo pulls the company record and submits KYB. Name in Finmo is prefixed "Zenith Test - ".
GET/partner/organizationwrappedOnly sub accounts created through this API. Adds kyb.mode and kyb.action_required.
GET/partner/organization/{org_id}wrappedAdds abn, acn and kyb { status, action_required, submitted_at, approved_at }.
PUT/partner/organization-setting/{org_id}wrappedkey webhook_url (https) and key webhook_security_token. Finmo's webhooks reach your URL with your token in x-security-token.
PATCH/partner/kyb/save/{org_id}Finmo APIFor sub accounts created without an ABN.
POST/partner/organization-document/{org_id}Finmo APIUpload URL is valid for 30 seconds.
ANY/wallet, /virtual-account, /fx-rate, /payout-beneficiary, /payout, /transaction, /webhook-notification ...Finmo APIPassed to Finmo production unchanged. x-on-behalf-of is required and must be one of your sub accounts.
GET/payout-method/all, /payout-method/param/{name}Finmo APIReference data. Finmo production requires x-on-behalf-of here too.

Create a sub account by ABN

POST https://production.finmotreasury.net/v1/partner/invite-organization
X-Idempotency-Key: <uuid v4>
{
  "first_name": "Priya", "last_name": "Nair", "email": "accounts@merchant.com.au",
  "org_name": "Coral Coast Getaways Pty Ltd", "org_country": "AU",
  "abn": "<11-digit ABN>", "address_city": "Cairns", "address_state": "QLD", "address_zip_code": "4870",
  "organization_reference_id": "TPB2B-000417"
}

201 -> data.org_id, kyb { status: "NOT_STARTED", mode: "PARTNER_RELIANCE" }
Then: kyb.status SUBMITTED -> APPROVED (webhook ORGANIZATION_KYB_APPROVED) -> VA_CREATED when the AUD account is live.

Without abn/acn the call behaves exactly like Finmo's partner API today: send KYB yourself with PATCH /partner/kyb/save.

Webhooks

Set webhook_url and webhook_security_token per sub account with PUT /partner/organization-setting/{org_id}. Every delivery carries your token in x-security-token. Respond 2xx within 5 seconds. Retries: 15m, 1h, 3h, 6h, 12h, 24h. Dedupe on webhook_notification_id and event_id.

ORGANIZATION_KYB_APPROVEDFinmo compliance approved the sub accountproposed
ORGANIZATION_KYB_ACTION_REQUIREDRegistry data missing; Finmo compliance emails Zenith over a secure channelproposed
ORGANIZATION_KYB_REJECTEDSub account cannot be openedproposed
VA_CREATEDAccount activated: AUD BSB + account number livelive
VA_PAYIN_COMPLETED, PAYOUT_CREATED / COMPLETED / FAILED / RETURNED, FEES_PAYMENTSame as Finmo productionlive

KYB fields: what the registry gives and what Finmo still needs

For this test, fields the KYB data provider can't supply use demo values set by Finmo. For live merchants, Zenith would send them (or Finmo agrees a reliance attestation in their place).

Finmo needsFieldSource todayAsk of Zenith for live merchants
Business namenameZenith create call-
Legal registered namelegal_nameKYB data provider-
Business registration number (ACN)company_registration_numberKYB data provider, else Zenith-
Tax registration number (ABN)tax_registration_numberKYB data provider, else Zenith-
Date of incorporationincorporation_dateKYB data provider-
Country of incorporationcountryZenith create call-
Registered address (line 1, city, state, postcode)address_*KYB data provider, else Zenith-
Legal entity typebusiness_typeKYB data provider-
Websitedoes_org_has_website, website_urlKYB data provider, else ZenithMerchant website when the registry has none (or brochure / alternate online presence)
Compliance / dispute emails (max 3)dispute_email_listNot available: demo valueCompliance or disputes contact email for the merchant
Annual turnover bandannual_turnoverNot available: demo valueTurnover band from Zenith's onboarding record
Industryindustry_nameNot available: demo valueIndustry (e.g. offline travel agency, OTA, tour operator). Registry industry codes are unreliable
Business descriptionaccount_usage_purposeNot available: demo valueWhat the merchant will use the account for
Funds flowfunds_flow_descNot available: demo valueWhere money comes from and where it goes
Employees, expected monthly volume and countno_of_employees, expected_txn_*Not available: demo valueOptional; send if Zenith holds them
Certificate of incorporationcompany_registration_document_idKYB data provider report (PDF)-
Shareholding structurecompany_shareholding_structure_document_idKYB data provider report (PDF)-
Company address proofcompany_address_proof_document_idNot available: demo valueCompany address proof document (or confirmation the registry address is enough under reliance)
Directors and owners: name, role, share %business_owner[] name, type, percentageKYB data provider-
Directors and owners: date of birthbusiness_owner[].dobKYB data providerOnly when the registry has no DOB for a person
Directors and owners: residential addressbusiness_owner[].address_*Not available: demo valueResidential address per director/owner (registry addresses are partial)
Directors and owners: nationalitybusiness_owner[].nationalityNot available: demo valueNationality per director/owner
Directors and owners: ID type and numberbusiness_owner[].identification_*Not available: demo valueID type and number per director/owner from Zenith's KYC
Directors and owners: ID document, address proof, IDV reportbusiness_owner[].*_document_idNot available: demo valueID document, address proof and IDV result per person, or a reliance attestation in place of documents

The registry check runs inside POST /partner/invite-organization, before the sub account is created, so the call takes about 25 seconds. Set your client timeout to at least 60 seconds. If the check fails, no sub account is created and the call returns an error:

  • 422 REGISTRY_NO_MATCH_ERROR: no company record for the ABN/ACN. Check the number, business name and city.
  • 422 REGISTRY_INCOMPLETE_ERROR: a record exists but is missing one of legal_name, registration_number, incorporation_date, registered_address or directors_or_owners. The message names what's missing.
  • 502 REGISTRY_UNAVAILABLE_ERROR: the check couldn't complete. Safe to retry.

Gaps outside those core fields don't block the sub account. If Finmo compliance needs more, Zenith gets ORGANIZATION_KYB_ACTION_REQUIRED and compliance emails Zenith over a secure channel. Nothing is collected through the API.