Document families
Every Feed lands one Document Family:
An Entity holds at most one Feed of each family, and a Source holds at most one Feed. Two providers of one family describe the same documents, so a second Feed of a family would land them twice. An Integration lists the families its provider can feed in
feedableFamilies.
An Integration belongs to the Organization, and its Feeds route it to Entities. A Feed lands in the Entity of its route, /api/entities/:entityId/source-feeds, and reads through any Integration of that Entity’s Organization, even one that already feeds other Entities.
The Source Feed object
Every route on this page returns Feeds in this shape.
Sync run object
GET /source-feeds
List every Source Feed for the Entity, each annotated with its parent Source name.
- Response: array of Source Feed objects.
POST /source-feeds
Create a Source Feed. The body names the Source to fill, either an existing one by id or a new one by name, and the response carries both the Feed and that Source.
Body
Response:
{ feed, source }, where feed is the Source Feed object and source is the Source it fills: { id, entityId, name, holdsExpenseRenditions, invoiceCount, createdAt, updatedAt }.
Domain errors
POST /source-feeds/:sourceFeedId/sync
Trigger an on-demand sync of a Source Feed. The response reports how many documents were landed, updated, or skipped. For an expense Feed, see Sync an expense Feed.
Body
Response:
{ feed, run }, the Feed as the listing now shows it and the sync run object that just settled. The documents and Partners the sync landed are not included; read them back through their own endpoints.
- Status:
200.
PATCH /source-feeds/:sourceFeedId
Change the link date on a Source Feed (the earliest date the Feed will import from).
Body
- Response: the updated Source Feed object.
DELETE /source-feeds/:sourceFeedId
Delete a Source Feed. The parent Source and any already-imported documents are unaffected.
- Response: the deleted Source Feed object.
The sync window
A sync reads the documents dated from the Feed’s link date on. How far past the day it runs depends on the provider:
A document dated after the day the sync runs lands like any other. For example, a BHE issued on 28 October and dated 31 October lands on the next sync. A Bsale or Wasabil document dated more than a month ahead lands on the first sync within a month of its date. The run’s
sweptTo stays the day the sync ran.
A document dated before the link date doesn’t land. The run lists it in report.ignored with the reason issued_before_link_date. To land it, move the link date earlier.
Ignored documents
A sync ignores a document it reads but the Feed doesn’t land. Each ignored document counts inignored on its tie-out line and in the run’s ignoredCount, and the run lists it in report.ignored with its reason. A range the books don’t track (a tie-out line with tracked: false) counts its documents in ignored but doesn’t list them one by one.
Each entry in report.ignored[]:
Each sync reads its whole range again, so an ignored document lands on a later sync once its reason no longer holds, for example once Xpendit approves the expense.
report.ignored is absent on runs recorded before Sintropix listed ignored documents. Those runs state only ignoredCount and the tie-out line counts.
Standing and Tax Period
The SII decides two facts of a DTE: its Standing (where the SII holds the document) and its Tax Period (the F29 / IVA month it belongs to). Both can change after the document lands. A sync lands every document with its Standing and, on every pass, writes the Standing and the Tax Period the provider now states over each DTE it already landed, whether the Invoice is booked or not.
The Standing appears as
standing on the DTE. A DTE you enter by hand has standing: null. You can’t set or change the Standing yourself: only a sync writes it.
A sync never changes anything else on a landed document. Your booking, Allocations, and every other fact of the Invoice stay yours. A sync writes the Standing and Tax Period without touching the Invoice or the ledger, so it also updates a booked Invoice and a document dated before the Lock Date. Changes to any other field are reported as divergences and not written.
How a sync reads each provider:
A Tax Period the provider doesn’t state never clears the one the DTE holds. A document missing from a provider’s answer keeps its Standing.
Booking and the Standing
Apending document lands like an accepted one, and is booked from its vendor’s Booking Template when the template applies. You can then match it against the bank as soon as it’s paid.
A document that lands claimed, annulment_requested, or annulled is never booked automatically. A booked Invoice whose DTE later reaches one of those Standings stays booked: Sintropix doesn’t unbook it or block the change. Instead, it flags an Incompatible Standing.
A document that lands unbooked with one of those Standings, and that you’ll never book, stays pending work until you exclude it from the books.
Incompatible Standing
An Invoice has an Incompatible Standing when it’s booked and its DTE isclaimed, annulment_requested, or annulled: your books count a document the SII doesn’t. Sintropix derives it on read and never stores it. It clears as soon as you unbook the Invoice or the Standing changes back.
Find these Invoices in three places:
GET /invoices/pages?standing=incompatiblelists them. See Invoices.- The home dashboard counts them in
incompatibleStandingCount. See Home dashboard. - In the app, the Invoice panel shows a warning. If you’re
staffin the Entity’s Organization, Estados incompatibles lists every one, and Home counts them under Necesita acción. Other Roles see neither the view nor the Home row, and their Necesita acción total leaves these Invoices out. The two endpoints above work the same for every Role.
Audit and preview
Each write a sync makes to a Standing or a Tax Period appears in the Audit Trail, credited to the system with the declared actorsource-feed. The sync run lists each one in report.updates, with the value before and after:
preview: true lists the updates it would make in report.updates and writes none.
SII Mirror Feeds
A Feed that reads through asii_mirror Integration reads the SII registers of the RUT the Integration connected, month by month, from the link date to the day it runs. It reads that RUT whatever Entity the Feed lands in. Each document it lands names that RUT, with the Entity’s name, as the company’s side: the issuer of a sale and the receiver of a purchase.
SII Mirror boletas
The SII states boletas (types39 and 41) as one consolidated row per type and month, and lists each boleta later, as it itemizes them. A sync lands each boleta the SII has itemized as its own Invoice. The boletas of the row that are not itemized yet count in awaiting on the row’s tie-out line and in the run’s awaitingCount. A later sync lands them once the SII lists them, so the count moves from awaiting to landed.
A boleta that states the RUT 66666666-6, or that the Entity issued with no buyer RUT, lands on the final-consumer Partner, named Consumidor Final with taxId 66666666-6. A consolidated row that the SII never itemizes counts as ignored.
SII Mirror sales summaries
For the sales types the SII states only as a monthly total (35, 38, 47, 48, 105, 919, 920, 922, and 924), a sync writes a Sales Summary per type and month and lands it as receivable Invoices on the final-consumer Partner, in the Feed’s Source:
- The first Invoice lands the SII’s figures. Its
documentNumbernames the type and the month, such as48-2026-09, and its memo readsRCV tipo 48 · 2026-09. It is dated on the last day of the month. Its DTE carries the type, the Tax Period, and the Standingaccepted, and names the Sales Summary in place of a folio. - Before you book it, a later sync writes the SII’s new figures over the Invoice. This holds for any Invoice of the Sales Summary that is neither booked nor excluded.
- After you book it, a change the SII makes lands as an adjustment: a new Invoice for the difference, numbered
48-2026-09-2,48-2026-09-3, and so on, with the memoAjuste RCV tipo 48 · 2026-09. When the total drops, the adjustment is a credit note of the same type. Nothing you booked moves, so its Matches and the Lock Date stay as they are.
count is the SII’s document count. A sync that writes the Sales Summary counts it as landed, and a sync that finds the figures unchanged counts it as skipped.
Honorarium Feeds
A Feed withfamily: "honorarium" reads through a sii_mirror Integration and lands the Entity’s boletas de honorarios from two SII books:
- BHE recibidas: the boletas de honorarios electrónicas the Entity receives from the people it pays.
- BTE emitidas: the boletas de prestación de servicios de terceros the Entity issues for the people it pays.
payable Invoice whose total is the net amount the Entity pays, with the Tax Period of the month whose book lists it. Every document lands with its Standing, including annulled ones, and a later sync updates the Standing and the Tax Period.
A sync reads every month of both books from the link date to the day it runs, and states one tie-out line per book and month. It attaches the PDF of each document; honorarium documents have no XML.
The current month
The mirror may not have read the current month yet, for example in the first hours of a month. A sync then reads the current month, on the Chilean calendar, as empty: it states no tie-out line for it and does not fail. A past month the mirror holds no answer for still fails the sync with424, because that is a real gap.
Recent months
The SII can still change a month for a while after it closes, so the mirror reads its newest months again on every pass. A sync needs the current month, on the Chilean calendar, and the 2 months before it to hold an answer the mirror read in the last 24 hours. If one of them doesn’t, the sync fails with424.
An older month only needs an answer, of any age. A Feed with an early link date keeps syncing, and an older month lands as the mirror last read it. A past month with no answer at all still fails the sync, whatever its age.
File attachments
Some providers carry the source files of each document (the PDF and the XML). When a sync runs against such an Integration, after the documents land it also attaches those files to the Invoice of each landed or skipped document, as Attachments. The providers that carry files today:
Other Integration kinds (for example
mercadopago, mercadolibre) report no files and this section does not apply.
Gap rule. The sync attaches only the kinds the Invoice does not already have. Any PDF already on the Invoice satisfies the PDF slot, whether an earlier sync or a user attached it. Same for XML. If a user later deletes a file that a sync attached, the next sync attaches it again.
Cap. A sync you trigger with POST /source-feeds/:sourceFeedId/sync attaches at most 200 files, and a scheduled sync at most 1000, newest documents first. The rest are counted in deferred and picked up on the next sync.
Filename. Attached files are named DTE-<dteTypeCode>-<folio>-<issuerRut>.<pdf|xml>, for example DTE-46-10-78404916-7.xml.
Preview. A sync with preview: true reads no bytes. Its report.files.attached counts the files the sync would attach.
Failures never fail the sync. A file that could not be read or attached is listed in failed[] with a reason, and the next sync retries it.
File report shape
report.files on the sync run object:
Each entry in
failed[]:
Expense Feeds
Anexpense Feed routes one Provider Account of an expense tool to a Source of an Entity that holds Expense Renditions. A Provider Account is one account inside the external account of an Integration. Today only Xpendit feeds expenses, and its Provider Accounts are the Subsidiaries of the enterprise.
The routing rules:
- One Provider Account feeds one Entity. A Subsidiary that another Feed already reads answers
409withSOURCE_FEED_PROVIDER_ACCOUNT_ALREADY_FED_ERROR. - An Entity holds one
expenseFeed, like every other family. A second one answers409withSOURCE_FEED_FAMILY_ALREADY_FED_ERROR. - The Source holds Expense Renditions. An existing Source without the mark answers
422withSOURCE_FEED_SOURCE_NOT_EXPENSE_RENDITIONS_ERROR. A Source the Feed creates holds them. While the Feed lives, you can’t unmark its Source: Sintropix refuses with409andSOURCE_PINNED_ERROR. - The Provider lists the account. List the Provider Accounts with
GET /integrations/:integrationId/provider-accounts. An id the Provider doesn’t list answers422withSOURCE_FEED_PROVIDER_ACCOUNT_NOT_FOUND_ERROR.
Sync an expense Feed
A sync of anexpense Feed lands each expense the tool approved as an Expense Claim that the Feed approves in the same act. Approving books it as an Expense Rendition in the Feed’s Source. Sintropix syncs it every 4 hours with the other Feeds, and you can sync it on demand. In the app, click Sincronizar or Vista previa on the Subsidiary’s line in the Integration’s panel.
Before the first sync, set the Entity’s booking setting. The Feed books with its Rendición por pagar account and its supplier payable account. Without the setting, the sync fails with 409 and EXPENSE_CLAIM_SETTING_NOT_SET_ERROR and lands nothing. The Feed doesn’t need the Approver: Xpendit already approved the expense.
What a sync reads. It reads the expenses created in each month from the Link Date to today, one month at a time. Each month is a tie-out line with range.month set, and its count is the number of expenses Xpendit states for that month.
What lands. An expense lands when Xpendit’s state is approved, accounted, or paid, and its expenseType is reimbursement, one_time_fund, or recurrent_fund. Every other expense counts as ignored and is listed in report.ignored: a corporate_card or other expense with expense_kind_not_tracked, whether Xpendit approved it or not, and any other expense Xpendit hasn’t approved with expense_not_approved. See Ignored documents. An expense whose claim already exists counts as skipped.
Each landed claim gets these values:
The Expense Rendition is booked like any approved claim, but it lands in the Feed’s Source. It carries what Xpendit states of the expense as Additional Information: the expense number, the merchant and its RUT, the folio, the document type, the amount paid, the fund, the cost center, and the category.
What a sync refuses. An expense that can’t land counts as
rejected and is listed in report.rejected with one of these reasons:
A rejected expense isn’t stored, so a later sync tries it again.
Expense categories from Xpendit
The sync gives each Xpendit category an Expense Category of the Entity:- The category the Feed created for it on an earlier sync, even if you renamed it.
- Else the Entity’s own category with the same name. The Feed takes it over, so it still finds it once you rename it.
- Else a new category with that name and no expense account. Its
sourceFeedIdis the Feed, and itsproviderCategoryIdis Xpendit’s category id.
expense_category_unassigned. Assign the account in Configuración → Rendiciones or with PATCH /expense-categories/:expenseCategoryId. The next sync lands the expense.
Changed expenses
A sync never rewrites a claim it already landed. When theamount or the expenseDate of a landed expense changes in Xpendit, the expense counts as skipped and appears in report.expenseDivergences:
folio is the expense number. landed and provider are text: the amount in minor units of the Entity’s functional currency, or the date as YYYY-MM-DD. Review each change and correct the Expense Rendition yourself when it no longer matches the expense.
Expense files
An Xpendit expense carries a receipt and, at times, an additional file. A sync attaches each one to the Expense Rendition as an Attachment, once per slot:receipt and additional_receipt. It attaches them for the expenses it lands and for the ones it skips, so a file that failed on one sync is tried again on the next. The counts appear in report.files, and a failed file appears in failed[] with its kind.
Preview
A sync withpreview: true reads and lands every expense, then rolls everything back. It reports what a real sync would land, skip, ignore, and reject, and writes no claim, category, Partner, or file.
The run detail in the app lists the month ranges, the rejected expenses, the ignored expenses, the changed expenses, and the files that failed.
DTE references
A sync also links each DTE to the DTEs it references, for example a nota de crédito to the factura it credits. The links appear instatedDteReferences and receivedDteReferences on GET /sii/dte/:dteId, with the SII referenceCode (1 voids, 2 corrects text, 3 corrects amounts) when the document states one.
Sintropix reads the references from two places:
- The provider’s data.
sii_mirrorandwasabilstate the references of each document.bsalestates none. - The attached XML. When a sync attaches a DTE’s XML (see File attachments), Sintropix reads the
<Referencia>blocks of that XML, whatever the provider. An XML whose type and folio do not match the DTE is not read.
POST /sii/dte/:dteId/references. A stated code fills a reference that has no code, but never replaces a code the reference already has. A sync never removes a reference.

