Account is someone you send money to or on behalf of: who they are, and what they’re set up
to do. It holds no money. This page covers the resources a payout uses, how they fit together, and
the statuses they share.
The four resources
A payout links your side to theirs. It debits
financialAccountId and credits
receiver.payoutAddressId. You don’t name the receiving account, because the address already
belongs to it. Your credentials show which accounts are yours; no field links them to your
organization.
To find which balances can fund a payout in a given receiveCurrency, call
listFinancialAccounts. Each entry
has a currency, a label to tell same-currency balances apart, an availableBalance, and a
totalBalance. The difference between the two balances is the amount on hold.
Identity
identity describes who the account is. Set identityType to INDIVIDUAL for a person, with an
individual block, or ORGANIZATION for a company, with an organization block. You can’t
change the type later.
An individual’s block holds their name, date of birth, nationality, contact details, address, tax
numbers, and identity documents. An organization’s block holds its registration details (legal
name, registration number, date of incorporation, legal structure, registered address) and
associations: the people and companies that own or control it. Each association has a role,
such as UBO_THROUGH_OWNERSHIP, DIRECTOR, or ULTIMATE_PARENT_COMPANY, and an
ownershipPercent where they hold shares.
Most identity fields are optional in the schema. The capabilities you request decide which ones you
must send. If a required field is missing, the request fails with 422
IDENTITY_REQUIREMENT_UNMET. Capabilities lists the
fields for each one.
Two fields are just for you: label, a name to help you recognize the account, and metadata, for
a reference back to a record in your own system.
Capabilities
A capability lets an account be paid in a currency, or be named as the sender of a payout. Request them by id incapabilities when you
create the account, along with the identity
they need. You can only add capabilities at creation. An account created without any is just an
identity.
Each capability comes back as an AccountCapability with its id, its own status, and details
describing what it covers. Capabilities lists every capability and explains how
they control payouts.
Payout addresses
APayoutAddress is a bank account an account can be paid at. Its bankAccount holds the bank
details, and routingFamily decides which ones:
The address also shows the currencies and rails it can be paid in (
supportedCurrencies,
supportedRails) and the checks run on it (verifications[]).
An address belongs to one account, set by accountId, and you can’t edit it. To correct anything,
create a new address and archive the old one. Addresses aren’t included in the account; list them
with listPayoutAddresses, filtered
by accountId.
You can create an address before the account’s capability is ACTIVE. The account only needs
to hold a capability that can receive at that address, in any status. So you can set up the address
and the capability at the same time.
Roles on a payout
An account plays one of two roles on a payout, and each needs a capability.- The receiver is the account being paid: the owner of
receiver.payoutAddressId. It needs an ACTIVE capability that covers that address. - The sender is optional: another account, named as
senderon the quote or inline payout. The payout is made in their name, but the money still comes from your financial account. The sender needs an ACTIVE capability granting SEND_PAYOUTS_TO_THIRD_PARTIES for the destination. Today that exists only for INR.
The shared state machine
Three statuses decide whether you can pay:- The account’s own status (
AccountStatus): OpenFX’s view of the account as a whole. - Each capability’s status (
CapabilityStatus). - Each payout address’s status (
PayoutAddressStatus).
Only PENDING can move to ACTIVE, and an ACTIVE status never goes back to
PENDING. Anything that isn’t REJECTED can move to REQUIRES_INFORMATION or
REJECTED.
OpenFX’s request for information and your answer go through your usual support channel, not the API. Each section below says what to do after REJECTED.
Capabilities and payout addresses always start PENDING. An account starts PENDING or
ACTIVE.
Two rules apply to all three:
- Create responses show the current status.
createAccountandcreatePayoutAddressshow each status at the moment of the response, including checks that finished during the call. Read the response instead of assuming a starting value. - Every status change sends exactly one webhook, however quickly it happened. Creation has its
own webhook:
common.account.createdshows the starting status of the account and each capability, andpayments.payout_address.createdshows an address’s.
The account’s own status
AccountStatus is OpenFX’s decision on whether to do business with the account at all. It
doesn’t summarize the capabilities. An account can be ACTIVE while a capability is still
PENDING, or REJECTED while its capabilities are ACTIVE.
OpenFX’s risk and compliance review sets it. Today that’s a manual decision, made outside the API.
Each change sends
common.account.activated,
common.account.rejected, or
common.account.requires_information,
with the previousStatus.
A REJECTED account can’t be named on any payout, as receiver or sender. Create a new account
instead. Sending more identity details won’t reverse a rejection.
Capability status
createAccount succeeds once the request is valid and the identity requirements are met. Each
capability starts PENDING and its checks begin straight away. Checks that finish during the
call show up in the response, so a capability can already be ACTIVE there. The rest settle
later, by webhook.
PENDING means the capability’s checks haven’t finished. The API doesn’t show which checks run
or in what order, only the result. A minute is typical but not guaranteed, so don’t build a flow
that assumes a time limit. Wait for the webhook instead.
Each change sends its own webhook:
common.account.capability_activated,
common.account.capability_rejected, or
common.account.capability_requires_information.
data.capability says which capability changed, and data.capabilities[] has the current status of
every capability.
A fast check still sends its webhook, so it can arrive before your system has handled the create
response, or before common.account.created. Each webhook carries the resource as it was when the
event fired, minus a few fields webhooks never include. See
Webhook authentication.
A REJECTED capability can’t be used or revived. The account and its other capabilities aren’t
affected. The replacement is a different capability, never the same one, and capabilities can only
be requested when an account is created.
Payout address status
An address usually starts PENDING and its checks begin straight away. Some are listed inverifications[]; others OpenFX runs without listing. status reflects all of them. There’s no
time guarantee here either, and OpenFX retries temporary problems itself.
Each change sends one webhook:
payments.payout_address.activated,
payments.payout_address.rejected, or
payments.payout_address.requires_information.
payments.payout_address.verification_resolved
also fires whenever a listed check resolves, even if the status doesn’t change.
Checks continue for as long as the address exists, so an ACTIVE address can later be
rejected or need more information. A rejection after activation arrives as
payments.payout_address.rejected with previousStatus: "ACTIVE". If every entry in
verifications[] looks fine, the failure came from an unlisted check. A REJECTED address
can’t receive payouts. Since you can’t edit it, create a new one.
How a payout reads the model
A payout needs all three ACTIVE at once: the account, the capability the payout needs, and the payout address. REQUIRES_INFORMATION blocks a payout just like PENDING.createPayout checks all three, and its 409
errors say which one failed.
- The account: the status of the receiving account, and of the sender if there is one.
- The capability: the receiver and any sender each need an ACTIVE capability that covers the payout. See Capabilities. A missing capability fails the same way as one that isn’t ACTIVE.
- The address: the payout address’s own status.
Archiving
OpenFX sets status; you decide archiving. Accounts and payout addresses have anarchivedAt that’s
null until you call archiveAccount or
archivePayoutAddress. Archiving is
permanent. Both calls take no body and are safe to repeat: archiving again returns the record with
its original archivedAt.
Archived records are hidden from list calls by default, can still be fetched by id, and are kept in
full for regulatory and audit purposes. Nothing is deleted. You can’t pay an archived account or
create addresses for it, and you can’t pay an archived address. Payouts already under way carry on,
as described in
Payouts.
Archiving and status are separate. A REJECTED address stays live until you archive it, and an
archived ACTIVE account is still ACTIVE. Archiving sends
common.account.archived or
payments.payout_address.archived.
What’s next
Payouts
Set up a recipient and send a payout.
Capabilities
Every capability and the identity it requires.
Payment Webhooks
Every event these resources emit.