To connect, reconnect, or disconnect one of these Integrations, see Integrations. Any other Integration kind answers every route on this page with
422 and INTEGRATION_BANK_FEED_NOT_SUPPORTED_ERROR.
The route that reads the Integration’s accounts lives under the Organization, at /api/organizations/:organizationId/integrations/:integrationId/discovered-accounts. The routes that feed a Bank Account live under the Entity the Bank Account belongs to, at /api/entities/:entityId/integrations/:integrationId, and take an Integration of that Entity’s Organization. An Integration of another Organization answers 404 with INTEGRATION_NOT_FOUND_ERROR. Path parameters are UUIDs.
Authentication
Use a session cookie or an API key via thex-api-key header. Mutations with an API key also require x-audit-actor. See Get an API Key.
Get discovered accounts
GET /api/organizations/:organizationId/integrations/:integrationId/discovered-accounts
Read the live account panel for one Integration. This fetches the Provider’s current status, the discovered accounts, and, for each Entity of the Organization, the local Bank Accounts and Ledger Accounts you can map to.
An API key confined to one Entity gets its own Entity as the one entry of entities, and doesn’t see an account that already feeds a Bank Account of another Entity.
Response
Each element of
accounts carries:
Each element of
entities carries:
Map a discovered account to an existing Bank Account
POST /api/entities/:entityId/integrations/:integrationId/bank-account-feeds
Create a feed that attaches a discovered account to an existing Bank Account of the Entity in the path. The server derives the currency from the Provider and rejects a mismatch. The first sync runs before the server answers, so the request can take a while. For Mercado Pago it usually takes about a minute.
Request body
Response
The Bank Account that now carries the feed, withfeed populated. The shape is the one documented on the Bank Accounts page, without the balance and unreconciledCount summary fields.
Refusals
The endpoint returns400 Bad Request with a body of { "code": "<code>", "params": { ... } } in these cases:
The map also refuses these cases, each with the same coded body:
Create a Bank Account from a discovered account
POST /api/entities/:entityId/integrations/:integrationId/bank-accounts
Create a new Bank Account in the Entity in the path, and feed it from a discovered account, in one operation. The creation is always kind bank, so only a Cash Account (an asset Ledger Account with the Cash sub-type) is accepted. Like the map, the first sync runs before the server answers.
Request body
Response
The created Bank Account with itsbalance and unreconciledCount summary, in the same shape as the list response on the Bank Accounts page, plus one field:
Short history
The feed lands the account’s balance onfeedStartDate as an opening balance, and loads the Provider’s movements from that day on. Some Providers don’t keep a long history. When the Provider can’t show that its history reaches feedStartDate, any movement between feedStartDate and the oldest movement it served is missing, and its amount sits inside the opening balance.
Sintropix still creates the Bank Account, and tells you once in shortHistory. Nothing stores it, so a later read of the Bank Account doesn’t carry it. shortHistory stays null when:
- The Provider holds a movement before
feedStartDate, or states the balance on that day. A quiet period after the start doesn’t count as a short history. - The opening balance is
0, such as for an account opened afterfeedStartDate.
shortHistory: that Bank Account already holds every row before feedStartDate.
Refusals
The endpoint refuses the samefeedStartDate cases as the map: 400 with BANK_FEED_START_DATE_IN_FUTURE_ERROR or BANK_FEED_START_DATE_AFTER_PENDING_MOVEMENT_ERROR. It also refuses the map’s cases about the discovered account (DISCOVERED_ACCOUNT_NOT_FOUND_ERROR, BANK_FEED_PROVIDER_REFRESHING_ERROR, BANK_FEED_PROVIDER_HAS_NO_DATA_ERROR, DISCOVERED_ACCOUNT_ALREADY_FED_ERROR, BANK_FEED_MAP_RACED_ERROR, and DISCOVERED_ACCOUNT_IS_CARD_ERROR), and the cases of creating a Bank Account, such as an id that already exists.
To stop a feed or sync it on demand, use the feed routes on the Bank Accounts page. To check whether a feed’s Movements add up to the Provider’s balance, read its tie-out. To stop every feed of an Integration at once, disconnect the Integration.
What each Provider lands
Cardda
Cardda is a prepaid wallet and card provider. The company holds one CLP wallet, and every card movement lands on that wallet.- Only approved rows that affect the balance land as Movements. Pending rows, declined rows, and rows that do not affect the balance stay out of the books.
- The reported balance is the wallet amount minus the pending holds that affect the balance.
- The Movement date is the transaction’s
authorized_at, orcreated_atwhenauthorized_atis absent. Sintropix reads that timestamp as the calendar day in Santiago (Chile). - A Movement that landed stays when Cardda later declines its transaction. It isn’t a restatement: the sync still lands, and the account goes out of tie-out by its amount.
dLocal Go
dLocal Go is a payment processor that reports payments and settlements. The feed lands those as inflows and outflows on the mapped Bank Account.- A paid payment lands as an inflow. It joins the feed by the day dLocal Go created it: a payment created on or after the feed start date lands, and one created before it belongs in the opening balance, even when dLocal Go paid it later.
- The payment’s Movement date is the day dLocal Go approved it. If dLocal Go later changes that date, the Movement keeps the day it first landed on, and the payment never lands a second time.
- A completed settlement lands as an outflow, dated and joined by the day dLocal Go paid it.
- A payment that landed stays when dLocal Go later rejects it. It isn’t a restatement: the sync still lands, and the account goes out of tie-out by its amount.
- The feed start date must be on or before the creation day of the oldest payment that is still open. A later date is refused with
BANK_FEED_START_DATE_AFTER_PENDING_MOVEMENT_ERROR, andearliestPendingDateis that creation day.
Fintoc
A Fintoc feed reads a bank account through the bank login you connected with the Fintoc widget.- Only posted movements land. A movement the bank still shows as pending, such as a deposited check that hasn’t cleared, lands on the first sync after Fintoc serves it as posted. If it never posts, for example a check that bounces, it never lands.
- The bank’s balance already counts a pending movement. Each sync leaves pending movements out of the balance it checks against, so a pending check doesn’t put the account out of tie-out.
- When you create a Bank Account from a Fintoc account, the opening balance leaves out the movements pending on that day too. Each lands once, when it posts.
- The discovered account’s
balance.currentis the bank’s balance as Fintoc reports it, pending movements included. - Some banks complete a movement’s text after it lands. For example, BCI first serves
Pago Recibidoand, a day later,Pago Recibido PRV <RUT> <bank>for the same movement. The next sync writes the newer text into the Movement’s description, even when the Movement is already booked. See Sync a bank account feed. - Some banks serve a movement’s text percent-encoded, such as
Traspaso Internet a T. Cr%C3%A9ditoorImpuesto Sobregiro %2F Uso LCA. Sintropix decodes it, so the description readsTraspaso Internet a T. CréditoandImpuesto Sobregiro / Uso LCA. A%that doesn’t start a valid encoded character, as in100% cubierto, stays as the bank sent it.
Global66
A Global66 Integration reads the wallets of the Global66 client you connected. Each wallet holds one currency, and a client can hold more than one wallet in the same currency. Map the wallets your books need. You don’t have to map every wallet. Discovered accounts- The Integration discovers every active wallet of the client.
nameis the wallet’s alias at Global66, orGlobal66followed by the currency, such asGlobal66 USD, when the wallet has no alias.providerAccountIdandnumberare both the Global66 wallet id.- A wallet in a currency Sintropix doesn’t know is left out. The other wallets of the client are still listed.
balance.currentandbalance.availableare both the available balance Global66 states for the wallet.
Mercado Pago
A Mercado Pago feed mirrors the account’s available money. Each sync reads Mercado Pago’s release report, which lists every movement of that money: payments net of fees, purchases paid from the balance, payouts, refunds, credit repayments, and holds.- Each sync covers the days from the feed start date to the end of yesterday, so the feed runs about a day behind.
- Each sync can leave a release report in the account’s list of reports in Mercado Pago, marked as manual.
- Every row of the report lands as a Movement.
- Sintropix refuses a report whose running balance does not chain from one row to the next, and checks the landed Movements against the report’s closing balance.
- Before you map the account, the discovered account shows the closing balance of the newest release report. It shows
0when the account has no release report yet.
Plaid
A Plaid Integration reads a US bank login through Plaid. Connect it with Plaid Link, then map the accounts you want in your books. You don’t have to map every account: leave out the ones you don’t need, such as a cash sweep account. Discovered accounts- Only depository accounts (such as checking, savings, and money market) and credit accounts are listed. Loan, investment, and other accounts are left out, because Plaid gives them no movements.
- An account is also left out when Plaid states no ISO currency for it, when Sintropix doesn’t know its currency, or when its current balance has more decimals than its currency allows. The other accounts of the bank login are still listed.
numberis the last four digits of the account number, andtypeisdepositoryorcredit.- A credit account is a card account. Mapping it to a Bank Account is refused with
DISCOVERED_ACCOUNT_IS_CARD_ERROR.
refreshing: true and a map or Bank Account creation is refused with 409 and BANK_FEED_PROVIDER_REFRESHING_ERROR. Retry when refreshing is false.
What lands
- Only posted transactions land. A pending transaction never lands. When it posts, it lands as a new Movement on the next sync.
- The Movement date is the day the transaction posted, and the description is the transaction name the bank reports. Plaid’s categories are not used.
- Money that leaves the account lands as a negative amount, and money that comes in lands as a positive amount.
- Each sync checks the landed Movements against the account’s current balance at Plaid, less the pending transactions that balance counts. A pending transaction doesn’t put the account out of tie-out, and
feed.tieOut.reportedBalanceis the balance after that subtraction. - When you create a Bank Account from a Plaid account, the opening balance leaves out the pending transactions in the same way. Each one lands once, when it posts.
The Additional Information holds these lines, in this order, each only when Plaid states it:
A sync updates the description and these lines on every Movement it landed, booked or not. See Sync a bank account feed.
Errors. When the bank login expires at the bank, a sync answers
424 with BANK_FEED_PROVIDER_UNAUTHORIZED_ERROR. When the bank login was removed at Plaid, it answers 410 with INTEGRATION_GRANT_GONE_ERROR. In both cases, disconnect the Integration and connect it again. Plaid Integrations don’t reconnect.
Polar
Polar is a Merchant of Record: it charges your buyers, holds the money in a USD balance, and pays it out to your bank. A Polar feed mirrors that USD balance, row by row. Who can connect. Polar shows an organization’s money only to its owner, admin, and finance roles. Connect Polar with a user who has one of those roles. When the connected user has another role, such as member, the discovered accounts and every sync answer424 with BANK_FEED_PROVIDER_ROLE_REFUSED_ERROR and params.integrationKind set to polar. Sintropix never feeds an empty account in that case. Connect Polar again from Configuración → Integraciones with an owner, admin, or finance user.
- The Integration discovers one account per Polar organization the user can read.
nameisPolarfollowed by the organization name, andnumberis the organization’s slug.currencyisUSD, andbalance.currentandbalance.availableare both the organization’s Polar balance.
- The Movement date is the day Polar created the row, read in the calendar of Santiago (Chile).
- Money that comes into the Polar balance lands as a positive amount, and money that leaves it lands as a negative amount.
- A payout lands in USD. The amount your bank received, in its own currency, lands on that bank’s Bank Account through its own feed. Reconcile the two Movements as a transfer.
The Additional Information holds these lines, in this order, each only when Polar states it:
Balance check. Each sync reads the whole Polar ledger and checks it against the organization’s Polar balance. When the ledger doesn’t add up to the balance, the map, the Bank Account creation, and every sync answer
424 with BANK_FEED_PROVIDER_FAILURE_ERROR, so no made-up opening balance absorbs the gap. A row type, fee type, or currency that Sintropix doesn’t know refuses the sync with the same code. When the landed Movements don’t reach the balance, the sync still lands and leaves the Bank Account out of tie-out.
The Polar Integration renews its authorization on its own before a sync reads.
Stripe
Stripe holds the money it collects for you in a balance, one per currency, until it pays it out to your bank. A Stripe feed mirrors one currency of that balance, row by row, from Stripe’s balance transactions. Discovered accounts- The Integration discovers one account per currency of the Stripe balance.
nameisStripefollowed by the currency, such asStripe USD, andnumberis the Stripe account id (acct_…).balance.currentandbalance.availableboth hold the available and pending funds of that currency together.
stripe_fee) land as their own Movements, so you can book them to an expense account.
- A Movement lands at the transaction’s net amount: the gross minus the fee Stripe took. The gross and the fee stay in its Additional Information.
- A transaction lands as soon as Stripe creates it, while its funds are still pending. The Movement date is the day Stripe created it, read in the calendar of Santiago (Chile).
- Money that comes into the balance lands as a positive amount, and money that leaves it lands as a negative amount.
- A payout lands in the balance currency. The amount your bank received lands on that bank’s Bank Account through its own feed. Reconcile the two Movements as a transfer.
- Only the transactions of Stripe’s payments balance land. Transactions of any other Stripe balance, such as Stripe Issuing, never land, and each sync records them as skipped.
Stripe, the transaction type in Spanish, and Stripe’s own description of the transaction when it has one, such as Stripe Cobro: Payment for Invoice:
Any other type keeps Stripe’s own name, such as
Stripe dispute.
The Additional Information holds these lines, in this order, each only when Stripe states it. The lines of the charge and of the invoice let you match a Movement to its sale and its tax document without opening Stripe.
The customer on the invoice can differ from the cardholder, for example when a person’s card pays a company’s invoice. A charge of the feed’s first days can land without its invoice lines, because Stripe can record the invoice payment before the feed start date.
Each sync rewrites these lines on every Movement it landed, booked Movements included, so a Movement always shows what Stripe states now.
Balance check. Each sync reads the balance transactions from the feed start date and checks the landed Movements against the available and pending funds of the currency. When they don’t add up, the sync still lands and leaves the Bank Account out of tie-out. Stripe keeps the account’s whole history, so any feed start date works.
Provider time
Every Movement a feed lands carries aproviderTime: the time the Provider states for the row, or null when the Provider gives no time Sintropix can trust. It orders the Movements of one day, and so the running balance within that day. A Movement without one comes before every Movement of its day that has one. See Order of movements.
The time is written once. A sync can give a time to a landed Movement that has none, booked or not, but only while the Provider still dates the row on the Movement’s day. It never changes a time a Movement already holds, so a dLocal Go payment whose approval date changes keeps its first time. Movements that landed before Provider time existed have
null until a sync fills it.
