fintoc kind connects a bank login through the Fintoc widget. Only staff can connect or reconnect a bank through Fintoc. A client connects a bank by storing its Bank Login. The global66 kind connects Global66 with a client id and a client secret, and discovers every active wallet of that client. The cardda kind connects a Cardda company with its API key, and the dlocal kind connects a dLocal Go merchant with its API key and secret key. Sintropix reads the Provider before it stores the credentials, so credentials that cannot read are refused at connect.
The plaid kind connects a US bank through Plaid Link. Plaid Link shows US banks only, in English, and asks for access to the bank’s transactions, with up to 730 days of history. Your bank password goes to Plaid and never reaches Sintropix. It can feed Bank Accounts with the bank’s posted transactions. See POST /integrations/plaid/link-tokens and Bank Feeds.
The mercadopago kind connects a Mercado Pago account through OAuth. It can feed a Bank Account with the account’s available money. See Bank Feeds.
The gmail and outlook kinds connect an email account: a Gmail account or a Microsoft Outlook account. You connect it from the app. Sintropix only reads: it never sends, changes, or deletes email. An Organization can connect several email accounts, but each account can be connected only once. You can search and read the email of a connected account through the API.
The mailbox kind is an email address that Sintropix holds for the Organization, such as [email protected]. You create it in Sintropix: there’s no outside account to connect. An Organization can hold several Mailboxes, all at its own email domain. See Mailbox.
The google_sheets kind connects one Google Sheet through Google OAuth. Sintropix writes the General Ledger of the current Fiscal Year of every Entity of the Organization to that Sheet, every four hours and whenever you ask. See Google Sheets.
The xpendit kind connects the enterprise of an Xpendit account, the expense tool, with its API key. You can read the expenses and funds of each of its Subsidiaries, and route each Subsidiary to a Source of Expense Renditions. See Xpendit.
The stripe kind connects a Stripe account through OAuth, by installing the Sintropix Stripe App in that account with read-only access. It can feed a Bank Account with each currency of the account’s Stripe payments balance. See Stripe and Bank Feeds.
The buk kind connects a Buk tenant, the payroll system, with its address and an API key. It feeds nothing yet. You can list the Empresas the key reaches. See Buk.
The rho kind connects a business on Rho, the US business banking platform, with a read-only API access token. It feeds nothing yet, but you can preview every account of the business with its current balance, Treasury and rewards accounts included. See Rho.
The notion kind connects a Notion workspace through OAuth, with read-only access to the pages and databases you share at consent. It feeds nothing yet, but you can preview each database it reaches. See Notion.
The polar kind connects a Polar account through OAuth. You grant Sintropix read-only access to the account’s organizations, orders, payments, refunds, disputes, transactions, and payouts. If you clear the transactions or payouts permission on Polar’s consent screen, Sintropix refuses the connection and stores nothing. Sign in to Polar as a user with the owner, admin, or finance role in the organization: Polar shows an organization’s money to those roles only. It can feed a USD Bank Account with each organization’s Polar balance. Sintropix only reads: it never charges, refunds, or withdraws money. See Bank Feeds.
To connect a bank that no Provider reads, such as a credit card Fintoc can’t fetch, store its login as a Bank Login. To connect the Getnet merchant portal, store its login as a Getnet Login. To give Sintropix access to Clay, the Chilean ERP you migrate your books from, store it as a Clay Login. None of these is an Integration kind, but the app lists them with the Integrations.
The sii_mirror kind connects the SII, the Chilean tax authority, and is the only SII document Provider. You connect it with the company’s RUT and its SII password (Clave), and the SII checks them at once. It then reads the RCV registers of that RUT from Sintropix’s Chilean SII mirror. The mirror reads the SII registers every 4 hours, so a document reaches it a few hours after the SII records it. See SII.
In the app, open Configuración → Integraciones and click Conectar integración. The catalog lists every option with its logo, and you can search it or filter it by tag: Banco, Pagos, Ventas, Facturador, Impuestos, Rendiciones, Correo, ERP, or Remuneraciones. Each Chilean bank is its own option, and you can find it by its short name too, such as “bci”. Pick an option and fill in its form. For a Provider that uses OAuth, such as Google or Mercado Pago, you continue on the Provider’s page and return to Sintropix afterwards.
Connecting asks for no Entity. When the connection is stored, its panel opens on the step it still lacks, where you route it to the Entities (Entidades legales) of the Organization. For a document Provider, pick the Source each Document Family lands in, from the Sources of every Entity grouped by Entity, and the date to read from. You can also create a Source in any Entity. For a bank Provider, link each of its accounts to a Bank Account of any Entity, or create one in the Entity you pick. Until you finish that step, the list shows the connection as Falta elegir fuentes or Falta elegir cuentas.
The list shows every connection of the Organization. Each Integration’s row names the Entities its feeds reach, or Sin asignar until a feed routes it. A Portal Login’s row names its own Entity.
Integrations belong to the Organization
An Integration belongs to the Organization, not to one Entity. Its feeds route it: each Source Feed or bank feed names the Entity whose Source or Bank Account it fills. One Integration can feed several Entities of its Organization. For example, one bank login can feed a Bank Account in each of two Entities. No tax id decides or limits where a feed lands: any feed can land in any Entity of the Organization. The routes follow the same split:- Every Integration route lives under
/api/organizations/:organizationId/integrations: connect, list, the Fintoc Link Intent, the Plaid Link token, reconnect, the replacement of an API key, the purpose, the SII legal representative’s Clave, the discovered accounts, the Provider Accounts, the General Ledger Export, a Mailbox and its Conversations, the email of a Gmail, Outlook, or Mailbox account, the expenses of an Xpendit account, the accounts of a Rho business, the preview of a Notion database, and disconnect. - Every feed route lives under the Entity it lands in,
/api/entities/:entityId/.... So does the copy of an email attachment into an Entity. They take an Integration of that Entity’s Organization. An Integration of another Organization answers404withINTEGRATION_NOT_FOUND_ERROR.
books write permission in the Organization, which a client or staff caller holds. A viewer can only list Integrations, and can’t read the email of a Gmail, Outlook, or Mailbox account, the expenses of an Xpendit account, or the preview of a Notion database. An API key confined to one Entity:
- Lists every Integration of its Organization, but sees only the Sources and Bank Accounts of its own Entity.
- Can’t connect, reconnect, renew, or disconnect an Integration, replace its API key, run a General Ledger Export, read or copy the email of a Gmail, Outlook, or Mailbox account, or read the expenses of an Xpendit account or the preview of a Notion database. It gets
403withPERMISSION_DENIED_ERROR. - Adds and removes only the feeds that land in its own Entity.
PATCH /api/entities/:entityId/organization.
The Integration object
The access token is stored encrypted and is never returned on any read.POST /integrations
POST /api/organizations/:organizationId/integrations
Create an Integration of the Organization by handing Sintropix a provider-issued access token. The token is verified against the provider once, then stored encrypted. Connecting asks for no Entity: route the Integration to Entities afterwards, through its feeds.
This route connects the document Providers, the bank Providers, Xpendit, Buk, and Rho. Mercado Pago, Mercado Libre, Gmail, Outlook, Polar, Google Sheets, Stripe, and Notion use OAuth and are connected from Configuración → Integraciones in the Sintropix app. You cannot create them through this endpoint. A Mailbox has its own route: POST /integrations/mailbox.
Body. The shape depends on kind. Every kind takes an id:
sii_mirror, the SII checks the RUT and Clave before Sintropix creates the Integration, so the request can take up to about a minute. A Clave the SII refuses answers 422 with SII_CLAVE_REFUSED_ERROR. When the SII gives no answer in time, the request answers 503 with SII_UNAVAILABLE_ERROR and creates nothing. Retry in a few minutes.
Credentials the Provider refuses answer 422 with INTEGRATION_CONNECT_REJECTED_ERROR. An API key Xpendit or Buk refuses, or a token Rho refuses, answers 422 with INTEGRATION_PROVIDER_UNAUTHORIZED_ERROR. A Rho token that lacks a scope Sintropix needs answers 422 with INTEGRATION_CONNECT_REJECTED_ERROR. A Buk address that holds no tenant, or a key that reaches no Empresa, answers 422 with INTEGRATION_CONNECT_REJECTED_ERROR. An external account another Integration already holds answers 409 with INTEGRATION_ACCOUNT_ALREADY_CONNECTED_ERROR.
- Response (
201): the Integration object (itssourceFeedsandfedBankAccountsare empty on creation).
POST /integrations/fintoc/link-intents
POST /api/organizations/:organizationId/integrations/fintoc/link-intents
Start the Fintoc connect flow. Sintropix creates a Link Intent at Fintoc and answers what the frontend needs to open the Fintoc widget. When the user completes the widget, it mints an exchange token. Send that token to POST /integrations with kind: "fintoc".
The widget needs a browser, so you can’t complete a Fintoc connect from the API alone.
staff caller can create a Link Intent. Any other caller gets 403 (PERMISSION_DENIED_ERROR). A client connects a bank by storing a Bank Login instead.POST /integrations/plaid/link-tokens
POST /api/organizations/:organizationId/integrations/plaid/link-tokens
Start the Plaid connect flow. Sintropix creates a Link token at Plaid and answers it. Open Plaid Link with it. When the user signs in to the bank, Plaid Link mints a public token. Send that token to POST /integrations with kind: "plaid".
Plaid Link needs a browser, so you can’t complete a Plaid connect from the API alone. No request body.
Response
institutionName. Next, list the bank’s accounts and feed them into Bank Accounts.
POST /integrations/:integrationId/reconnect
POST /api/organizations/:organizationId/integrations/:integrationId/reconnect
Restore a Fintoc Integration whose bank stopped trusting the stored grant. You know it needs this when its discovered accounts answer status: "login_required". Run the Fintoc widget again and send the fresh exchange token. The Integration keeps its id and every feed it holds.
Only fintoc Integrations reconnect, and only a staff caller can reconnect one. Any other caller gets 403 (PERMISSION_DENIED_ERROR). To repair a Global66, Cardda, dLocal Go, or Plaid Integration whose credentials stopped working, disconnect it and connect again. For Plaid, this includes a bank login that expired. For Xpendit or Buk, replace its API key instead.
Body
fintoc, is refused with 409 and INTEGRATION_GRANT_MISMATCH_ERROR.
- Response: the restored Integration object.
GET /integrations
GET /api/organizations/:organizationId/integrations
List every Integration of the Organization, in the order they were connected, including any Mercado Pago, Mercado Libre, Gmail, Outlook, Polar, Google Sheets, Stripe, or Notion authorization connected from the app, and every Mailbox. Each item carries its Source Feeds, the Bank Accounts it feeds, and the Entities its feeds reach. A Google Sheets Integration carries its last General Ledger Export.
An API key confined to one Entity gets every Integration of the Organization, with only the Source Feeds and Bank Accounts of its own Entity. routedEntities still names every Entity a feed reaches.
- Response: array of Integration objects.
PUT /integrations/:integrationId/purpose
PUT /api/organizations/:organizationId/integrations/:integrationId/purpose
Set or clear the purpose of an Integration: what the account is for, in your own words. Write it so a colleague or an agent can tell your accounts apart, for example “Casilla de facturas de proveedores” for one Gmail account and “Correo personal de la gerenta” for another. Any kind of Integration takes a purpose.
In the app, open the Integration’s panel. Propósito is the first row of its details, and you edit it in place.
Body
- Response: the Integration object, with its new
purpose.
DELETE /integrations/:integrationId
DELETE /api/organizations/:organizationId/integrations/:integrationId
Remove an Integration. A Mailbox can’t be removed. Every feed of the Integration is removed as part of the same operation, in every Entity: its Source Feeds and the feed of each Bank Account it fed. The Sources, the Bank Accounts, and the documents and Movements already landed stay.
- For a
fintocIntegration, Sintropix also deletes the Link at Fintoc, so the bank stops being read. - For a
plaidIntegration, Sintropix first removes the bank login at Plaid. If Plaid already removed it, the disconnect still succeeds. If Plaid fails or can’t be reached, the disconnect answers424or503and the Integration stays. Retry later. - For a
sii_mirrorIntegration, the SII mirror first deletes the company Clave and the legal representative’s Clave, and stops reading that RUT. If the mirror is busy with that RUT or can’t be reached, the disconnect answers503withSII_UNAVAILABLE_ERROR, and the Integration and both Claves stay. Retry in a few minutes. - For a
stripeIntegration, Sintropix first uninstalls the Sintropix Stripe App from the account. If the account already uninstalled it, the disconnect still succeeds. If Stripe fails, the disconnect answers424withINTEGRATION_PROVIDER_FAILURE_ERRORand the Integration stays. Retry later. - For a
notionIntegration, Sintropix first revokes the grant at Notion. If Notion already removed it, the disconnect still succeeds. If Notion fails, the disconnect answers424withINTEGRATION_PROVIDER_FAILURE_ERRORand the Integration stays. Retry later. - A
mailboxIntegration is refused with409(MAILBOX_NOT_REMOVABLE_ERROR), because removing it would delete its email. See A Mailbox stays. - For every other kind, Sintropix removes the stored credentials or authorization only. The grant on the provider’s side is not revoked. For
google_sheets, the Sheet keeps the last General Ledger written to it.
SII
The SII Integration (sii_mirror) reads the company’s DTEs and boletas de honorarios from the SII through Sintropix’s SII mirror. Sintropix stores the company RUT as the Integration’s providerRef, and none of the Clave. The Clave is held by the SII mirror, which signs in to the SII with it.
Connect the SII
In the app, open Configuración → Integraciones, click Conectar integración, and pick SII. Type the company’s RUT and its Clave del SII, then click Conectar. While the SII checks the Clave, the form shows Verificando la Clave con el SII…. A refused Clave shows Clave incorrecta under the field. Through the API, sendkind: "sii_mirror" with rut and clave to POST /integrations. The SII checks the Clave before the Integration exists:
The legal representative’s Clave
The company Clave reads the RCV registers. The SII opens the PDF and XML of the DTEs only to the legal representative, so add the legal representative’s own RUT and Clave to receive those files. It’s optional: the company Clave alone connects the SII. In the app, open Conectar integración and pick Clave del representante legal, under the Impuestos tag. The option is dimmed until the company’s SII is connected. When the Organization has two or more SII Integrations, the dialog first asks which company, by RUT. The option shows a check once the SII mirror holds a Clave or a certificate of the legal representative of every connected company. Disconnecting the SII deletes the legal representative’s Clave together with the company Clave.PUT /integrations/:integrationId/sii-representative-clave
PUT /api/organizations/:organizationId/integrations/:integrationId/sii-representative-clave
Add the legal representative’s Clave to an SII Integration. The SII checks it at once, the same way as the company Clave. Sintropix stores neither the RUT nor the Clave. Sending it again replaces the Clave the SII mirror holds for that person.
Body
GET /integrations/:integrationId/sii-representative-clave
GET /api/organizations/:organizationId/integrations/:integrationId/sii-representative-clave
Read whether the SII mirror holds a Clave or a certificate of the company’s legal representative. Sintropix asks the SII mirror on every read.
Response
sii_mirror answers 422 with INTEGRATION_REPRESENTATIVE_CLAVE_NOT_SUPPORTED_ERROR. When the SII mirror refuses the read, it answers 424. When the SII mirror can’t be reached, it answers 503.
Gmail and Outlook
Agmail or outlook Integration connects one email account of the Organization. Sintropix keeps no copy of the account’s email. You search and read it on demand, and you can copy an attachment into an Entity, for example to attach a supplier’s PDF to its Invoice. Sintropix only reads: it never sends, changes, or deletes email.
Connect an email account
You connect an email account from the app, because Google and Microsoft ask for consent in a browser:- Open Configuración → Integraciones, click Conectar integración, and pick Gmail or Outlook, under the Correo tag.
- Continue on Composio, which holds the account’s access for Sintropix, and allow access on Google or Microsoft with the account you want to connect.
Mailbox
Amailbox Integration is an email address that Sintropix holds for the Organization, such as [email protected]. Your clients and suppliers send or forward invoices and other documents to it, and you read them in Sintropix. There’s no outside account to connect: Sintropix creates the address and receives its email. Sintropix doesn’t turn that email into documents.
- A Conversation is a chain of emails on one subject, like a thread in an email client.
- An email is one message in a Conversation, received by the Mailbox or sent from it.
facturas@ for supplier invoices and rendiciones@ for expense receipts. Give each one a purpose so a colleague or Erwin can tell them apart.
The email domain
Every Mailbox of an Organization takes its address at the Organization’s email domain: a subdomain ofsintropix.com that belongs to that Organization alone, such as acme.sintropix.com. Sintropix sets it for you. A Superadmin picks it for the Organization in the staff panel, with PATCH /organizations/:organizationId/email-domain. The Organization’s emailDomain is null until then, and the Organization can’t create a Mailbox. Ask Sintropix to set it.
Once a Mailbox lives at the domain, the domain can’t change.
Create a Mailbox
- Open Configuración → Integraciones, click Conectar integración, and pick Casilla de correo, under the Correo tag.
- Enter the Nombre de la casilla: the part of the address before
@. - Click Crear casilla.
POST /integrations/mailbox
POST /api/organizations/:organizationId/integrations/mailbox
Create a Mailbox at the Organization’s email domain. It needs the books write permission in the Organization, which a client or staff caller holds. An API key confined to one Entity gets 403 with PERMISSION_DENIED_ERROR.
Body. Unknown keys are refused with 400.
- An Organization with no email domain is refused with
409(MAILBOX_EMAIL_DOMAIN_NOT_SET_ERROR). - An address that already exists is refused with
409(MAILBOX_ALREADY_EXISTS_ERROR).params.addressnames it. Choose another name. - An email domain that no longer receives email is refused with
409(EMAIL_DOMAIN_NOT_OPEN_ERROR).params.emailDomainnames it. Ask Sintropix to check it. - When Sintropix already holds every Mailbox its email plan includes, the create is refused with
424(MAILBOX_LIMIT_REACHED_ERROR). Ask Sintropix to raise the limit.
201: the Integration object, with kind: "mailbox" and the new address as providerRef.
Read a Mailbox’s Conversations
In the app, click Abrir correo in the Mailbox’s panel. Its Conversations open newest first. Click one to read its emails and download the attachments of the emails it received. Through the API, list the Conversations and read each one with the two routes below. They answer each email’s HTML and a download link for each received attachment, as an email client shows them. To search a Mailbox, or to read its email as plain text, use the email routes instead. Reading Conversations follows the same rule as reading email:staff and client can, a viewer or an API key confined to one Entity can’t. An Integration of the Organization that isn’t a Mailbox answers 404 (MAILBOX_NOT_FOUND_ERROR).
GET /integrations/:integrationId/conversations
GET /api/organizations/:organizationId/integrations/:integrationId/conversations
List the Conversations in the Mailbox’s inbox, newest first, 50 per page.
Query
conversations:
GET /integrations/:integrationId/conversations/:conversationId
GET /api/organizations/:organizationId/integrations/:integrationId/conversations/:conversationId
Read one Conversation with every email in it, oldest first. conversationId must be a UUID. A Conversation that isn’t in the Mailbox answers 404 (CONVERSATION_NOT_FOUND_ERROR).
Response
emails:
A Mailbox stays
You can’t disconnect a Mailbox, because removing it would delete its email.DELETE /integrations/:integrationId on a Mailbox answers 409 (MAILBOX_NOT_REMOVABLE_ERROR), and the app shows no disconnect option in its panel. As a result, an Organization that holds a Mailbox can’t be deleted.
Mailbox errors
Read email
You read the email of agmail, outlook, or mailbox Integration with the same routes: search it, read an email or its whole Conversation as plain text, and copy an attachment into an Entity. Erwin can read all of them too, so you can ask him to find a supplier’s invoice in any of the Organization’s email accounts. He also searches them on his own as evidence when he reviews a record or leaves a Follow-up, and their purpose tells him which account to look in. See Erwin. A Mailbox reads with a few differences, listed in Read a Mailbox’s email.
Who can read email
Reading the email of the Organization’s accounts is more than reading its books, so it has its own rule:403 with PERMISSION_DENIED_ERROR.
Sintropix logs each email whose content it hands out and each attachment it copies, under the request’s Audit Envelope. A search isn’t logged, because it returns only headers and a short snippet. Reading an email with an API key needs x-audit-actor and x-audit-reason, as a write does.
The Email object
GET /integrations/:integrationId/emails
GET /api/organizations/:organizationId/integrations/:integrationId/emails
Search the email of a Gmail, Outlook, or Mailbox account, newest first. The search covers received and sent email. It leaves out drafts, spam, and deleted email.
Query parameters. Send at least one criterion. The criteria combine with AND, and each text criterion matches whole words, as the mailbox’s own search does. Sintropix keeps only the letters, digits, and @._- of each term, so a term can’t carry Gmail or Outlook search syntax.
after that isn’t before before, or an attachmentType with hasAttachment=false answers 400.
Response
GET /integrations/:integrationId/emails/:emailId
GET /api/organizations/:organizationId/integrations/:integrationId/emails/:emailId
Read one email as plain text, or its whole Conversation.
Query parameters
{ "emails": [...] }, Email objects with body and no snippet, oldest first. Without conversation, it holds the one email.
404 with INTEGRATION_EMAIL_NOT_FOUND_ERROR.
POST /api/entities/:entityId/email-attachments
Copy one attachment of an email into an Entity, then attach it to a record of that Entity. The copy lands where an upload lands before it is confirmed:
- Copy the attachment with this route. It answers an
attachmentId. - Attach it to an Invoice, a Bank Movement, or a Ledger Entry of the same Entity with that host’s confirm route, sending
attachmentIdandfilename.
books write permission as well as the right to read email. The Integration must belong to the Entity’s Organization.
Body
.pdf or .xml.
Response (201)
404 with INTEGRATION_EMAIL_ATTACHMENT_NOT_FOUND_ERROR.
Read a Mailbox’s email
The routes above read a Mailbox with the same contract, with these differences:- Ids. A Mailbox email’s
idjoins two UUIDs with+, such as4f1c2b7e-9a3d-4e5f-8b6a-0c1d2e3f4a5b+9b8a7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d. Use it as you receive it. ItsconversationIdis the id the Conversation routes take. - Page size. A search page holds at most 10 emails. A larger
limitstill reads 10. Each Conversation appears at most once on a page: the email of it that matched. - What a search covers. Received, archived, and sent email. Spam and deleted email are left out. A new email can take about a minute to show up in a search. When more than 10,000 Conversations match, the search covers the 10,000 with the newest match, so narrow the criteria.
- Recipients. The
toof a received email lists the addresses the email was delivered to, not its full To line. - Attachment types.
contentTypecomes from the file name’s extension. It’s empty when Sintropix doesn’t accept that type. - Copy. Only the attachments of a received email can be copied. An attachment of an email the Mailbox sent answers
404(INTEGRATION_EMAIL_ATTACHMENT_NOT_FOUND_ERROR). - Refusals. A Mailbox holds no access that can expire, so it never answers
INTEGRATION_GRANT_FAILED_ERROR. When the Mailbox can’t be read, the routes answer424(INTEGRATION_PROVIDER_FAILURE_ERROR) or503(INTEGRATION_PROVIDER_UNREACHABLE_ERRORorINTEGRATION_NOT_CONFIGURED_ERROR). Retry later.
Email errors
Google Sheets
A Google Sheets Integration keeps a copy of the Organization’s General Ledger in a Google Sheet you own, with every Entity of the Organization in the same tabs. Use it to work on the ledger with Sheets formulas, or to share it with someone who has no access to Sintropix. Sintropix only writes: nothing you change in the Sheet reaches the books. Each Integration exports to one Sheet, and each Sheet can be connected only once. One Google account can connect Sheets for several Organizations.client or staff caller can connect a Google Sheet and run an export. An API key confined to one Entity can’t run an export, because it writes every Entity of the Organization. See Access and roles.Connect a Google Sheet
You connect Google Sheets from the app, because Google asks for consent in a browser:- Open Configuración → Integraciones, click Conectar integración, and pick Google Sheets.
- Paste the address of the Sheet, as your browser shows it with the Sheet open. It starts with
https://docs.google.com/spreadsheets/d/. - If an Entity of the Organization keeps Books, pick the Libro the export reads for that Entity.
- Continue on Google with an account that can edit the Sheet, and keep the permission to edit your spreadsheets checked.
- The address isn’t the address of a Google Sheet.
- Google can’t find the Sheet with the account you authorized.
- The account can view the Sheet but can’t edit it. Share the Sheet with that account as an editor, then connect it again.
- Another Integration already exports to that Sheet.
What the Sheet holds
Each export rewrites three tabs whole: Libro mayor, Plan de cuentas, and Dimensiones. Sintropix finds each tab by its title, creates a missing one, and leaves the rest of the Sheet alone. If you rename or delete a tab, the next export creates a new one with that title. Every Entity of the Organization goes into the same tabs, one Entity after another, in name order. Each Entity’s rows are in that Entity’s own currency. The export reads the Book you picked for the Entity that keeps it. It reads every other Entity with no Book. If another Entity of the Organization keeps Books, the export fails with400 and BOOK_REQUIRED_ERROR, and params.entityId names that Entity. That export records no run.
Libro mayor
Libro mayor holds the General Ledger of each Entity’s current Fiscal Year, on the calendar of Santiago (Chile). It reads the live Ledger Entries (active and reversed), the same lines as the general ledger report. Each Entity’s rows have one row per line, sorted by account code, then by date:
1: 0 on an income or expense account, the result of the closed years on the retained earnings account, and the balance before the year on any other account. It has no entry, creation date, Partner, Dimension Value, debit, or credit. An account with no line this Fiscal Year shows that row alone when its balance isn’t zero, and doesn’t show at all when its balance is zero.
Plan de cuentas
Plan de cuentas holds one row per Ledger Account of each Entity, sorted by code:Dimensiones
Dimensiones holds one row per Dimension Value of the Organization, sorted by Dimension name, then by code. A Dimension with no value has no row.When the export runs
Sintropix exports every Google Sheets Integration every four hours. To export right away, click Sincronizar ahora on the Integration’s panel, or callPOST /integrations/:integrationId/general-ledger-exports. The panel shows when the last export ran and how many lines it wrote, or why it failed.
The General Ledger Export object
A General Ledger Export is one run that writes the General Ledger of every Entity of the Organization to the Sheet. It states either the lines it wrote or why it wrote nothing: exactly one oflineCount and failure is set.
POST /integrations/:integrationId/general-ledger-exports
POST /api/organizations/:organizationId/integrations/:integrationId/general-ledger-exports
Export the General Ledger of every Entity of the Organization to the Integration’s Sheet now. No request body.
The export answers 200 with the General Ledger Export it recorded, whether it succeeded or Google refused it. Check failure to tell them apart.
An Integration that isn’t google_sheets answers 422 with GENERAL_LEDGER_EXPORT_NOT_SUPPORTED_ERROR. While another export of the same Integration is still writing, including the scheduled one, the request answers 409 with GENERAL_LEDGER_EXPORT_RUNNING_ERROR. Retry when it finishes. When an Entity other than the one of the picked Book keeps Books, the request answers 400 with BOOK_REQUIRED_ERROR and records no run.
Xpendit
Anxpendit Integration connects one Xpendit enterprise with its API key. Sintropix reads Xpendit and never writes to it. An enterprise holds one or more Subsidiaries, Xpendit’s word for the accounts its expenses and funds belong to. Sintropix calls each one a Provider Account.
With an Xpendit Integration you can:
- Read what Xpendit holds: each Subsidiary’s recent expenses and its open funds.
- Route each Subsidiary to a Source of Expense Renditions of an Entity, with an expense Feed. Each sync lands the expenses Xpendit approved as approved Expense Claims, booked as Expense Renditions with their receipts attached.
Connect Xpendit
In the app, open Configuración → Integraciones, click Conectar integración, and pick Xpendit, under the Rendiciones tag. Paste the API key of your Xpendit enterprise. Through the API, send it toPOST /integrations with kind: "xpendit" and accessToken.
Sintropix checks the key with Xpendit before it stores it:
PUT /integrations/:integrationId/access-token
PUT /api/organizations/:organizationId/integrations/:integrationId/access-token
Replace the API key of an Xpendit, Buk, or Rho Integration, for example after you rotate the key. For Xpendit, the new key must open the same enterprise. For Buk, Sintropix checks the new key at the same tenant. For Rho, the new token must open the same business. The Integration keeps its id and its Feeds. In the app, open the Integration’s panel and click Reemplazar clave de API.
Body
- Response (
200): the Integration object.
Read what Xpendit holds
GET /integrations/:integrationId/xpendit-overview
GET /api/organizations/:organizationId/integrations/:integrationId/xpendit-overview
Read, for every Subsidiary of the enterprise, the expenses created in the last 30 days and the funds that still hold money. Sintropix reads Xpendit live on every request and stores nothing, so the answer can take several seconds for a large enterprise. In the app, open the Integration’s panel and click Ver gastos to open Gastos en Xpendit.
A staff or client caller can read it. A viewer and an API key confined to one Entity get 403 with PERMISSION_DENIED_ERROR.
Response
422 with INTEGRATION_PROVIDER_UNAUTHORIZED_ERROR: replace the key. An Integration that isn’t xpendit answers 422 with INTEGRATION_EXPENSES_NOT_SUPPORTED_ERROR, with params.integrationId and params.kind.
GET /integrations/:integrationId/provider-accounts
GET /api/organizations/:organizationId/integrations/:integrationId/provider-accounts
List the Provider Accounts of an Integration: for Xpendit, the Subsidiaries of the enterprise; for Buk, the Empresas the key reaches; for Notion, the databases the grant reaches. Sintropix reads them from the Provider on every request. Use an id as the providerAccountId of an expense Feed. Any member of the Organization can list them.
Response: an array of { id, name, taxId }, where id is the account’s id at the Provider, as a string. taxId is the RUT of a Buk Empresa, as Buk states it, and null for Xpendit and Notion.
An Integration that has no Provider Accounts to list answers 422 with INTEGRATION_EXPENSES_NOT_SUPPORTED_ERROR.
Disconnect Xpendit
DELETE /integrations/:integrationId removes the stored key and every expense Feed of the Integration. The Sources stay. Xpendit holds nothing of Sintropix to revoke.
Buk
Abuk Integration connects one Buk tenant, the payroll and HR system, with an API key. Sintropix only reads Buk. The Integration lists the Empresas the key reaches, each with its RUT, and feeds nothing yet.
Connect Buk
A Buk administrator creates the key in Buk, under Configuración → Accesos API. Give it read-only access, with the employee and accounting permissions and access to sensitive data, and pick the Empresas Sintropix keeps the books of. In the app, open Configuración → Integraciones, click Conectar integración, and pick Buk, under the Remuneraciones tag. Type the address of your Buk in Dirección de Buk, such astuempresa.buk.cl, paste the key in Clave de API, and connect. The Integration’s panel then lists the Empresas the key reaches under Empresas en Buk, each with its RUT. Through the API, send POST /integrations with kind: "buk", tenant, and accessToken.
When Buk has no tenant at that address, or the key reaches no Empresa, the app says Buk no tiene esa dirección, o la clave no llega a ninguna empresa. Check the address and the Empresas of the key in Buk.
To rotate the key, create a new one in Buk and replace it, then delete the old key in Buk.
Disconnect Buk
DELETE /integrations/:integrationId, or disconnecting from the Integration’s panel, removes the key Sintropix stores. Buk keeps the key working until you delete it there too, under Configuración → Accesos API.
Rho
Arho Integration connects one business on Rho, the US business banking platform, with a read-only API access token. Sintropix only reads Rho: it never moves money. You can preview every account of the business with its current balance, including Treasury and rewards accounts. The Integration feeds no Bank Account yet.
Create the token in Rho
Only an Owner or Admin of the Rho business can create an API access token, and Rho asks for a two-factor code to do it.- In Rho, open Settings → API → Access Tokens and click Create token.
- Name it for Sintropix, and use the token for Sintropix only.
- Pick these scopes, all read-only:
accounts:read,transactions:read,statements:read, andbusinesses:read. Don’t pick any:writescope: Sintropix only reads. - Pick when it expires. Rho allows one year at most, and also expires a token that goes unused for 45 days. Note the date: you replace the token before then.
- Leave the list of allowed IP addresses empty.
- Confirm with your two-factor code and copy the token. Rho shows it only once.
Connect Rho
In the app, open Configuración → Integraciones, click Conectar integración, and pick Rho, under the Banco tag. Paste the token in Clave de API and connect. Through the API, sendPOST /integrations with kind: "rho" and accessToken.
Sintropix checks the token with Rho before it stores it: it reads the business and every one of its accounts. The token is stored encrypted.
GET /integrations/:integrationId/rho-overview
GET /api/organizations/:organizationId/integrations/:integrationId/rho-overview
Read the Rho business’s name and every one of its accounts, each with its current balance. Sintropix reads Rho live on every request and stores nothing. In the app, the Integration’s panel shows the same accounts under Cuentas en Rho, each with its name, type, last 4 digits, currency, and balance.
Any member of the Organization can read it, a viewer included.
Response
Replace the Rho token
Before the token expires, or after you revoke it, create a new token in Rho with the same scopes. Then replace it: in the app, open the Integration’s panel and click Reemplazar clave de API. The new token must belong to the same business, or the replacement answers409 with INTEGRATION_GRANT_MISMATCH_ERROR and the stored token stays. Then revoke the old token in Rho.
Disconnect Rho
DELETE /integrations/:integrationId, or disconnecting from the Integration’s panel, removes the token Sintropix stores. Rho keeps the token working until you revoke it there too, under Settings → API → Access Tokens.
Stripe
Astripe Integration connects one Stripe account with read-only access. Sintropix only reads: it never charges, refunds, or withdraws money. It can feed a Bank Account with each currency of the account’s Stripe payments balance, through a bank feed.
Connect Stripe
You connect Stripe from the app, because Stripe asks for consent in a browser:- Open Configuración → Integraciones, click Conectar integración, and pick Stripe, under the Pagos tag.
- Continue on Stripe, pick the account to connect, and accept the read permissions of the Sintropix Stripe App. This installs the App in that account.
accountName, country, defaultCurrency, and mode.
If you cancel on Stripe, nothing is connected. Each Stripe account can be connected only once.
Disconnect Stripe
Disconnecting uninstalls the Sintropix Stripe App from the account, then removes the Integration. SeeDELETE /integrations/:integrationId.
Notion
Anotion Integration connects one Notion workspace with read-only access to the pages and databases you share with Sintropix. Sintropix never writes to Notion. It stores nothing of what a database holds and feeds nothing yet: you can list the databases and preview each one.
Connect Notion
You connect Notion from the app, because Notion asks for consent in a browser:- Open Configuración → Integraciones, click Conectar integración, and pick Notion.
- Continue on Notion, pick the workspace, and pick the pages or databases you share with Sintropix.
id is the data source id the preview takes.
GET /integrations/:integrationId/notion-data-sources/:dataSourceId/preview
GET /api/organizations/:organizationId/integrations/:integrationId/notion-data-sources/:dataSourceId/preview
Read one Notion database: its properties and its latest 20 pages, newest first. Sintropix reads it from Notion on every request and stores nothing. A viewer, or an API key confined to one Entity, receives 403 with PERMISSION_DENIED_ERROR.
Response
type is one of title, rich_text, number, select, multi_select, status, date, people, files, checkbox, url, email, phone_number, formula, relation, rollup, created_time, created_by, last_edited_time, last_edited_by, or unique_id. Notion adds property types over time, and a type Sintropix doesn’t read yet is null. Its values read as text with text: null.
Each value carries the propertyId it belongs to and a kind:
expiresAt. Read the preview again instead of storing the link. A link to a file hosted elsewhere has expiresAt: null.
Disconnect Notion
Disconnecting revokes Sintropix’s access at Notion, then removes the Integration. SeeDELETE /integrations/:integrationId. The connection stays in the workspace until you remove it in Notion too, under Configuración → Conexiones.
Portal Logins
A Portal Login is the login of a portal that no Provider reads. Unlike an Integration, a Portal Login belongs to one Entity, and its routes live under/api/entities/:entityId/portal-logins. Sintropix stores the login and the password encrypted and uses them only to read the portal. No read ever returns them, so not even you can see them again in Sintropix. A Portal Login has one of four kinds:
client or staff caller can store and delete Portal Logins. A viewer can only list them. See Access and roles.The Portal Login object
POST /portal-logins
Store a Portal Login for the Entity.
Body. The shape depends on kind. Every kind takes an id:
409 (CREDENTIAL_LABEL_ALREADY_USED_ERROR). A bank_login body takes no label. Sintropix names every Getnet Login Getnet, so an Entity holds at most one. A second Getnet Login is refused with the same error. To store another Getnet login, delete the first one. Sintropix names an SII Login by its holderType: SII Empresa for business and SII Persona for individual. An Entity holds at most one of each, and a second one of the same holderType is refused with the same error. A sii_login body takes no label. You name each Clay Login, so an Entity can hold as many as it needs. A Clay Login whose name the Entity already uses is refused with the same error.
- Response (
201): the Portal Login object.
"method": "password" with username and password in place of apiKey.
GET /portal-logins
List the Entity’s Portal Logins of every kind.
- Response: array of Portal Login objects.
GET /organizations/:organizationId/portal-logins
GET /api/organizations/:organizationId/portal-logins
List the Portal Logins of every Entity of the Organization. An API key confined to one Entity gets only its own Entity’s. To store or delete a Portal Login, use the routes of its Entity.
- Response: array of Portal Login objects, each with one more field,
entityName: the name of the Entity that holds it.
DELETE /portal-logins/:portalLoginId
Delete a Portal Login and its stored login and password. Sintropix stops reading the portal with it. Your login at the portal is unchanged.
An id that isn’t one of the Entity’s Portal Logins answers 404 (CREDENTIAL_NOT_FOUND_ERROR).
- Response: the deleted Portal Login object.

