Formance Search API
Full-platform Search service that indexes ledger transactions and accounts, payments, and other resources so they can be queried across modules from a single endpoint, with a target/terms query model.
Full-platform Search service that indexes ledger transactions and accounts, payments, and other resources so they can be queried across modules from a single endpoint, with a target/terms query model.
openapi: 3.0.3
info:
title: Formance Platform API
description: >-
Open-source financial infrastructure for money movement. This specification
describes the REST surface of the Formance Platform across its modules -
Ledger (v2), Payments, Orchestration / Flows (v2), Wallets, Reconciliation,
Auth, Webhooks, and Search - as exposed by Formance Cloud. All resource
modules are served under a per-module path prefix (for example
`/api/ledger`, `/api/payments`) on a single stack host and are secured with
OAuth2 client-credentials Bearer tokens issued by the Auth module.
termsOfService: https://www.formance.com/terms
contact:
name: Formance
url: https://www.formance.com
license:
name: MIT
url: https://github.com/formancehq/ledger/blob/main/LICENSE
version: 'v1'
servers:
- url: https://{organization}.{environment}.formance.cloud
description: Formance Cloud stack host
variables:
organization:
default: sandbox
description: Your organization / stack slug.
environment:
default: eu.sandbox
description: The Formance Cloud environment / region for the stack.
security:
- oauth2: []
tags:
- name: Auth
description: OAuth2 / OIDC authorization server, clients, and users.
- name: Ledger
description: Programmable double-entry ledger (v2).
- name: Payments
description: Unified payments connectivity, connectors, and transfers.
- name: Orchestration
description: Flows workflows, instances, and triggers (v2).
- name: Wallets
description: White-label wallets, balances, and holds.
- name: Reconciliation
description: Reconciliation policies and runs.
- name: Webhooks
description: Webhook subscription configuration.
- name: Search
description: Cross-module search.
paths:
# ------------------------------------------------------------------ Auth
/api/auth/oauth/token:
post:
operationId: createToken
tags: [Auth]
summary: Request an OAuth2 access token
description: >-
Exchange a client id and secret for a Bearer access token using the
`client_credentials` grant. The returned token is used in the
`Authorization` header for every other Formance API call.
security: []
requestBody:
required: true
content:
application/x-www-form-urlencoded:
schema:
type: object
required: [grant_type, client_id, client_secret]
properties:
grant_type:
type: string
example: client_credentials
client_id:
type: string
client_secret:
type: string
scope:
type: string
responses:
'200':
description: Access token issued.
content:
application/json:
schema:
type: object
properties:
access_token:
type: string
token_type:
type: string
example: bearer
expires_in:
type: integer
example: 3600
scope:
type: string
/api/auth/.well-known/openid-configuration:
get:
operationId: getOIDCWellKnowns
tags: [Auth]
summary: Retrieve OpenID Connect configuration
responses:
'200':
description: OIDC configuration document.
/api/auth/clients:
get:
operationId: listClients
tags: [Auth]
summary: List OAuth clients
responses:
'200': { description: List of clients. }
post:
operationId: createClient
tags: [Auth]
summary: Create an OAuth client
requestBody:
content:
application/json:
schema: { $ref: '#/components/schemas/ClientOptions' }
responses:
'201': { description: Client created. }
/api/auth/clients/{clientId}:
parameters:
- { name: clientId, in: path, required: true, schema: { type: string } }
get:
operationId: readClient
tags: [Auth]
summary: Read an OAuth client
responses:
'200': { description: Client. }
put:
operationId: updateClient
tags: [Auth]
summary: Update an OAuth client
responses:
'200': { description: Client updated. }
delete:
operationId: deleteClient
tags: [Auth]
summary: Delete an OAuth client
responses:
'204': { description: Client deleted. }
/api/auth/clients/{clientId}/secrets:
parameters:
- { name: clientId, in: path, required: true, schema: { type: string } }
post:
operationId: createSecret
tags: [Auth]
summary: Add a secret to a client
responses:
'200': { description: Secret created. }
/api/auth/clients/{clientId}/secrets/{secretId}:
parameters:
- { name: clientId, in: path, required: true, schema: { type: string } }
- { name: secretId, in: path, required: true, schema: { type: string } }
delete:
operationId: deleteSecret
tags: [Auth]
summary: Delete a client secret
responses:
'204': { description: Secret deleted. }
/api/auth/users:
get:
operationId: listUsers
tags: [Auth]
summary: List users
responses:
'200': { description: List of users. }
/api/auth/users/{userId}:
parameters:
- { name: userId, in: path, required: true, schema: { type: string } }
get:
operationId: readUser
tags: [Auth]
summary: Read a user
responses:
'200': { description: User. }
# ------------------------------------------------------------------ Ledger v2
/api/ledger/v2:
get:
operationId: v2ListLedgers
tags: [Ledger]
summary: List ledgers
responses:
'200': { description: List of ledgers. }
/api/ledger/v2/{ledger}:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2GetLedger
tags: [Ledger]
summary: Get a ledger
responses:
'200': { description: Ledger. }
post:
operationId: v2CreateLedger
tags: [Ledger]
summary: Create a ledger
responses:
'204': { description: Ledger created. }
/api/ledger/v2/{ledger}/_info:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2GetLedgerInfo
tags: [Ledger]
summary: Get information about a ledger
responses:
'200': { description: Ledger info. }
/api/ledger/v2/{ledger}/_bulk:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
post:
operationId: v2CreateBulk
tags: [Ledger]
summary: Bulk request
responses:
'200': { description: Bulk result. }
/api/ledger/v2/{ledger}/accounts:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2ListAccounts
tags: [Ledger]
summary: List accounts from a ledger
responses:
'200': { description: Cursor of accounts. }
head:
operationId: v2CountAccounts
tags: [Ledger]
summary: Count the accounts from a ledger
responses:
'204': { description: Count returned in Count header. }
/api/ledger/v2/{ledger}/accounts/{address}:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
- { name: address, in: path, required: true, schema: { type: string } }
get:
operationId: v2GetAccount
tags: [Ledger]
summary: Get account by its address
responses:
'200': { description: Account. }
/api/ledger/v2/{ledger}/accounts/{address}/metadata:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
- { name: address, in: path, required: true, schema: { type: string } }
post:
operationId: v2AddMetadataToAccount
tags: [Ledger]
summary: Add metadata to an account
responses:
'204': { description: Metadata added. }
/api/ledger/v2/{ledger}/transactions:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2ListTransactions
tags: [Ledger]
summary: List transactions from a ledger
responses:
'200': { description: Cursor of transactions. }
post:
operationId: v2CreateTransaction
tags: [Ledger]
summary: Create a new transaction
description: >-
Post a double-entry transaction to the ledger. Provide either explicit
`postings` (source, destination, amount, asset) or a `script`
expressed in Numscript to compute complex multi-party money flows.
requestBody:
required: true
content:
application/json:
schema: { $ref: '#/components/schemas/V2PostTransaction' }
responses:
'200': { description: Transaction created. }
head:
operationId: v2CountTransactions
tags: [Ledger]
summary: Count the transactions from a ledger
responses:
'204': { description: Count returned in Count header. }
/api/ledger/v2/{ledger}/transactions/{id}:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
- { name: id, in: path, required: true, schema: { type: integer, format: bigint } }
get:
operationId: v2GetTransaction
tags: [Ledger]
summary: Get transaction by its ID
responses:
'200': { description: Transaction. }
/api/ledger/v2/{ledger}/transactions/{id}/metadata:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
- { name: id, in: path, required: true, schema: { type: integer, format: bigint } }
post:
operationId: v2AddMetadataOnTransaction
tags: [Ledger]
summary: Set the metadata of a transaction by its ID
responses:
'204': { description: Metadata set. }
/api/ledger/v2/{ledger}/transactions/{id}/revert:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
- { name: id, in: path, required: true, schema: { type: integer, format: bigint } }
post:
operationId: v2RevertTransaction
tags: [Ledger]
summary: Revert a ledger transaction by its ID
responses:
'201': { description: Reverting transaction created. }
/api/ledger/v2/{ledger}/aggregate/balances:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2GetBalancesAggregated
tags: [Ledger]
summary: Get the aggregated balances from selected accounts
responses:
'200': { description: Aggregated balances. }
/api/ledger/v2/{ledger}/volumes:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2GetVolumesWithBalances
tags: [Ledger]
summary: Get list of volumes with balances for (account/asset)
responses:
'200': { description: Cursor of volumes with balances. }
/api/ledger/v2/{ledger}/logs:
parameters:
- { name: ledger, in: path, required: true, schema: { type: string } }
get:
operationId: v2ListLogs
tags: [Ledger]
summary: List the logs from a ledger
responses:
'200': { description: Cursor of logs. }
# ------------------------------------------------------------------ Payments
/api/payments/v1/connectors:
get:
operationId: listAllConnectors
tags: [Payments]
summary: List all installed connectors
responses:
'200': { description: List of connectors. }
/api/payments/v1/connectors/configs:
get:
operationId: listConfigsAvailableConnectors
tags: [Payments]
summary: List the configs of each available connector
responses:
'200': { description: Available connector configs. }
/api/payments/v1/connectors/{connector}:
parameters:
- { name: connector, in: path, required: true, schema: { type: string } }
post:
operationId: installConnector
tags: [Payments]
summary: Install a connector
responses:
'201': { description: Connector installed. }
/api/payments/v1/connectors/{connector}/{connectorId}:
parameters:
- { name: connector, in: path, required: true, schema: { type: string } }
- { name: connectorId, in: path, required: true, schema: { type: string } }
delete:
operationId: uninstallConnectorV1
tags: [Payments]
summary: Uninstall a connector
responses:
'204': { description: Connector uninstalled. }
/api/payments/v1/connectors/transfers:
post:
operationId: connectorsTransfer
tags: [Payments]
summary: Transfer funds between accounts on a connector
responses:
'200': { description: Transfer created. }
/api/payments/v1/accounts:
get:
operationId: listAccountsPayments
tags: [Payments]
summary: List accounts
responses:
'200': { description: Cursor of accounts. }
post:
operationId: createAccount
tags: [Payments]
summary: Create an account
responses:
'200': { description: Account created. }
/api/payments/v1/accounts/{accountId}/balances:
parameters:
- { name: accountId, in: path, required: true, schema: { type: string } }
get:
operationId: getAccountBalances
tags: [Payments]
summary: Get account balances
responses:
'200': { description: Balances. }
/api/payments/v1/payments:
get:
operationId: listPayments
tags: [Payments]
summary: List payments
responses:
'200': { description: Cursor of payments. }
post:
operationId: createPayment
tags: [Payments]
summary: Create a payment
responses:
'200': { description: Payment created. }
/api/payments/v1/payments/{paymentId}:
parameters:
- { name: paymentId, in: path, required: true, schema: { type: string } }
get:
operationId: getPayment
tags: [Payments]
summary: Get a payment
responses:
'200': { description: Payment. }
/api/payments/v1/bank-accounts:
get:
operationId: listBankAccounts
tags: [Payments]
summary: List bank accounts
responses:
'200': { description: Cursor of bank accounts. }
post:
operationId: createBankAccount
tags: [Payments]
summary: Create a bank account
responses:
'200': { description: Bank account created. }
/api/payments/v1/bank-accounts/{bankAccountId}:
parameters:
- { name: bankAccountId, in: path, required: true, schema: { type: string } }
get:
operationId: getBankAccount
tags: [Payments]
summary: Get a bank account
responses:
'200': { description: Bank account. }
/api/payments/v1/transfer-initiations:
get:
operationId: listTransferInitiations
tags: [Payments]
summary: List transfer initiations
responses:
'200': { description: Cursor of transfer initiations. }
post:
operationId: createTransferInitiation
tags: [Payments]
summary: Create a transfer initiation
responses:
'200': { description: Transfer initiation created. }
/api/payments/v1/transfer-initiations/{transferId}:
parameters:
- { name: transferId, in: path, required: true, schema: { type: string } }
get:
operationId: getTransferInitiation
tags: [Payments]
summary: Get a transfer initiation
responses:
'200': { description: Transfer initiation. }
delete:
operationId: deleteTransferInitiation
tags: [Payments]
summary: Delete a transfer initiation
responses:
'204': { description: Deleted. }
/api/payments/v1/transfer-initiations/{transferId}/status:
parameters:
- { name: transferId, in: path, required: true, schema: { type: string } }
post:
operationId: updateTransferInitiationStatus
tags: [Payments]
summary: Update the status of a transfer initiation
responses:
'204': { description: Status updated. }
/api/payments/v1/pools:
get:
operationId: listPools
tags: [Payments]
summary: List pools
responses:
'200': { description: Cursor of pools. }
post:
operationId: createPool
tags: [Payments]
summary: Create a pool
responses:
'200': { description: Pool created. }
/api/payments/v1/pools/{poolId}:
parameters:
- { name: poolId, in: path, required: true, schema: { type: string } }
get:
operationId: getPool
tags: [Payments]
summary: Get a pool
responses:
'200': { description: Pool. }
delete:
operationId: deletePool
tags: [Payments]
summary: Delete a pool
responses:
'204': { description: Deleted. }
/api/payments/v1/pools/{poolId}/balances:
parameters:
- { name: poolId, in: path, required: true, schema: { type: string } }
get:
operationId: getPoolBalances
tags: [Payments]
summary: Get pool balances
responses:
'200': { description: Pool balances. }
# ------------------------------------------------------------------ Orchestration v2
/api/orchestration/v2/workflows:
get:
operationId: listWorkflows
tags: [Orchestration]
summary: List registered workflows
responses:
'200': { description: List of workflows. }
post:
operationId: createWorkflow
tags: [Orchestration]
summary: Create a workflow
responses:
'201': { description: Workflow created. }
/api/orchestration/v2/workflows/{flowId}:
parameters:
- { name: flowId, in: path, required: true, schema: { type: string } }
get:
operationId: getWorkflow
tags: [Orchestration]
summary: Get a workflow by id
responses:
'200': { description: Workflow. }
delete:
operationId: deleteWorkflow
tags: [Orchestration]
summary: Delete a workflow by id
responses:
'204': { description: Deleted. }
/api/orchestration/v2/workflows/{flowId}/instances:
parameters:
- { name: flowId, in: path, required: true, schema: { type: string } }
post:
operationId: runWorkflow
tags: [Orchestration]
summary: Run a workflow
responses:
'201': { description: Workflow instance started. }
/api/orchestration/v2/instances:
get:
operationId: listInstances
tags: [Orchestration]
summary: List workflow instances
responses:
'200': { description: List of instances. }
/api/orchestration/v2/instances/{instanceId}:
parameters:
- { name: instanceId, in: path, required: true, schema: { type: string } }
get:
operationId: getInstance
tags: [Orchestration]
summary: Get a workflow instance by id
responses:
'200': { description: Instance. }
/api/orchestration/v2/instances/{instanceId}/history:
parameters:
- { name: instanceId, in: path, required: true, schema: { type: string } }
get:
operationId: getInstanceHistory
tags: [Orchestration]
summary: Get a workflow instance history by id
responses:
'200': { description: Instance history. }
/api/orchestration/v2/triggers:
get:
operationId: listTriggers
tags: [Orchestration]
summary: List triggers
responses:
'200': { description: List of triggers. }
post:
operationId: createTrigger
tags: [Orchestration]
summary: Create a trigger
responses:
'201': { description: Trigger created. }
/api/orchestration/v2/triggers/{triggerId}:
parameters:
- { name: triggerId, in: path, required: true, schema: { type: string } }
get:
operationId: readTrigger
tags: [Orchestration]
summary: Read a trigger
responses:
'200': { description: Trigger. }
delete:
operationId: deleteTrigger
tags: [Orchestration]
summary: Delete a trigger
responses:
'204': { description: Deleted. }
/api/orchestration/v2/events:
post:
operationId: sendEvent
tags: [Orchestration]
summary: Send an event to a running workflow instance
responses:
'204': { description: Event sent. }
# ------------------------------------------------------------------ Wallets
/api/wallets/v1/wallets:
get:
operationId: listWallets
tags: [Wallets]
summary: List all wallets
responses:
'200': { description: Cursor of wallets. }
post:
operationId: createWallet
tags: [Wallets]
summary: Create a new wallet
responses:
'201': { description: Wallet created. }
/api/wallets/v1/wallets/{id}:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
get:
operationId: getWallet
tags: [Wallets]
summary: Get a wallet
responses:
'200': { description: Wallet. }
patch:
operationId: updateWallet
tags: [Wallets]
summary: Update a wallet
responses:
'204': { description: Wallet updated. }
/api/wallets/v1/wallets/{id}/summary:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
get:
operationId: getWalletSummary
tags: [Wallets]
summary: Get a wallet summary
responses:
'200': { description: Wallet summary. }
/api/wallets/v1/wallets/{id}/balances:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
get:
operationId: listBalances
tags: [Wallets]
summary: List balances of a wallet
responses:
'200': { description: Balances. }
post:
operationId: createBalance
tags: [Wallets]
summary: Create a balance
responses:
'201': { description: Balance created. }
/api/wallets/v1/wallets/{id}/credit:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
post:
operationId: creditWallet
tags: [Wallets]
summary: Credit a wallet
responses:
'204': { description: Wallet credited. }
/api/wallets/v1/wallets/{id}/debit:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
post:
operationId: debitWallet
tags: [Wallets]
summary: Debit a wallet
description: >-
Debit a wallet. When `pending` is true a hold is created that must be
later confirmed or voided (authorization then capture).
responses:
'200': { description: Debit / hold created. }
/api/wallets/v1/holds:
get:
operationId: getHolds
tags: [Wallets]
summary: Get all holds for a wallet
responses:
'200': { description: Cursor of holds. }
/api/wallets/v1/holds/{holdId}:
parameters:
- { name: holdId, in: path, required: true, schema: { type: string } }
get:
operationId: getHold
tags: [Wallets]
summary: Get a hold
responses:
'200': { description: Hold. }
/api/wallets/v1/holds/{holdId}/confirm:
parameters:
- { name: holdId, in: path, required: true, schema: { type: string } }
post:
operationId: confirmHold
tags: [Wallets]
summary: Confirm a hold
responses:
'204': { description: Hold confirmed (captured). }
/api/wallets/v1/holds/{holdId}/void:
parameters:
- { name: holdId, in: path, required: true, schema: { type: string } }
post:
operationId: voidHold
tags: [Wallets]
summary: Cancel a hold
responses:
'204': { description: Hold voided. }
# ------------------------------------------------------------------ Reconciliation
/api/reconciliation/v1/policies:
get:
operationId: listPolicies
tags: [Reconciliation]
summary: List reconciliation policies
responses:
'200': { description: Cursor of policies. }
post:
operationId: createPolicy
tags: [Reconciliation]
summary: Create a reconciliation policy
responses:
'201': { description: Policy created. }
/api/reconciliation/v1/policies/{policyID}:
parameters:
- { name: policyID, in: path, required: true, schema: { type: string } }
get:
operationId: getPolicy
tags: [Reconciliation]
summary: Get a policy
responses:
'200': { description: Policy. }
delete:
operationId: deletePolicy
tags: [Reconciliation]
summary: Delete a policy
responses:
'204': { description: Deleted. }
/api/reconciliation/v1/policies/{policyID}/reconciliation:
parameters:
- { name: policyID, in: path, required: true, schema: { type: string } }
post:
operationId: reconcile
tags: [Reconciliation]
summary: Reconcile using a policy
responses:
'200': { description: Reconciliation result. }
/api/reconciliation/v1/reconciliations:
get:
operationId: listReconciliations
tags: [Reconciliation]
summary: List reconciliations
responses:
'200': { description: Cursor of reconciliations. }
/api/reconciliation/v1/reconciliations/{reconciliationID}:
parameters:
- { name: reconciliationID, in: path, required: true, schema: { type: string } }
get:
operationId: getReconciliation
tags: [Reconciliation]
summary: Get a reconciliation
responses:
'200': { description: Reconciliation. }
# ------------------------------------------------------------------ Webhooks
/api/webhooks/configs:
get:
operationId: getManyConfigs
tags: [Webhooks]
summary: Get many configs
responses:
'200': { description: Cursor of configs. }
post:
operationId: insertConfig
tags: [Webhooks]
summary: Insert a new config
responses:
'200': { description: Config created. }
/api/webhooks/configs/{id}:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
put:
operationId: updateConfig
tags: [Webhooks]
summary: Update one config
responses:
'200': { description: Config updated. }
delete:
operationId: deleteConfig
tags: [Webhooks]
summary: Delete one config
responses:
'200': { description: Config deleted. }
/api/webhooks/configs/{id}/activate:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
put:
operationId: activateConfig
tags: [Webhooks]
summary: Activate one config
responses:
'200': { description: Config activated. }
/api/webhooks/configs/{id}/deactivate:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
put:
operationId: deactivateConfig
tags: [Webhooks]
summary: Deactivate one config
responses:
'200': { description: Config deactivated. }
/api/webhooks/configs/{id}/secret/change:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
put:
operationId: changeConfigSecret
tags: [Webhooks]
summary: Change the signing secret of a config
responses:
'200': { description: Secret changed. }
/api/webhooks/configs/{id}/test:
parameters:
- { name: id, in: path, required: true, schema: { type: string } }
get:
operationId: testConfig
tags: [Webhooks]
summary: Test one config
responses:
'200': { description: Test result. }
# ------------------------------------------------------------------ Search
/api/search/:
post:
operationId: search
tags: [Search]
summary: Search across the platform
description: >-
Query indexed resources (ledger transactions and accounts, payments,
and more) by target and terms across all modules.
requestBody:
content:
application/json:
schema:
type: object
properties:
target:
type: string
example: TRANSACTION
terms:
type: array
items: { type: string }
pageSize:
type: integer
responses:
'200': { description: Search response. }
components:
securitySchemes:
oauth2:
type: oauth2
description: >-
OAuth2 client-credentials flow. Exchange a client id and secret at
`/api/auth/oauth/token` for a Bearer access token, then send it as
`Authorization: Bearer <token>`.
flows:
clientCredentials:
tokenUrl: https://{organization}.{environment}.formance.cloud/api/auth/oauth/token
scopes:
ledger:read: Read ledger resources
ledger:write: Write ledger resources
payments:read: Read payments resources
payments:write: Write payments resources
wallets:read: Read wallets resources
wallets:write: Write wallets resources
schemas:
V2Posting:
type: object
required: [amount, asset, destination, source]
properties:
amount:
type: integer
format: bigint
example: 100
asset:
type: string
example: USD/2
destination:
type: string
example: users:001
source:
type: string
example: world
V2PostTransaction:
type: object
properties:
timestamp:
type: string
format: date-time
postings:
type: array
items: { $ref: '#/components/schemas/V2Posting' }
script:
type: object
description: A Numscript program and its variables.
properties:
plain:
type: string
example: |
send [USD/2 100] (
source = @world
destination = @users:001
)
vars:
type: object
additionalProperties: true
reference:
type: string
metadata:
type: object
additionalProperties:
type: string
ClientOptions:
type: object
properties:
name:
type: string
public:
type: boolean
redirectUris:
type: array
items: { type: string }
scopes:
type: array
items: { type: string }