Skip to main content
A Source Feed is a recurring pull configured against a Source. It carries the link date (the start of the window Sintropix imports), the Integration it fetches through, and the Document Family it lands. Syncing a Feed lands new documents into its Source and keeps the Standing and Tax Period of the documents it already landed up to date with the SII. Sintropix syncs every Feed on its own every 4 hours, and you can also sync a Feed on demand. An expense Feed lands the expenses its tool approved as approved Expense Claims.
Open in the app. This resource has a page in the Sintropix web app at https://app.sintropix.com/{entityId}/settings/sources, where each id in braces is the same UUID as in the API route or response. Feeds are managed inside their Source's settings. When you mention a record to a user, include that link. See Link to the App for the full URL grammar.

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 in ignored 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.
In the app, the run detail shows Documentos ignorados. It lists each ignored document with its type, folio, issue date, counterparty, and the reason in words, and you can copy the RUT. For an expense Feed, it shows the expense’s date and person instead. A run recorded before the list existed shows no such section.

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

A pending 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 is claimed, 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=incompatible lists 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 staff in 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.
Review each one and unbook the Invoice’s entry if it no longer belongs in your books.

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 actor source-feed. The sync run lists each one in report.updates, with the value before and after:
A sync with preview: true lists the updates it would make in report.updates and writes none.

SII Mirror Feeds

A Feed that reads through a sii_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 (types 39 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 documentNumber names the type and the month, such as 48-2026-09, and its memo reads RCV tipo 48 · 2026-09. It is dated on the last day of the month. Its DTE carries the type, the Tax Period, and the Standing accepted, 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 memo Ajuste 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.
Book, match, and pay these Invoices like any other receivable. Their DTE can’t be written or removed by hand; see Sales Summary errors. In the app, each of these Invoices says whether it is the original or an adjustment, states the SII’s figure, and lists every Invoice of the month with its booking state. The tie-out line of a total-only type is tracked. Its 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 with family: "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.
Both are payables. Each lands as a 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 with 424, 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 with 424. 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

An expense 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 409 with SOURCE_FEED_PROVIDER_ACCOUNT_ALREADY_FED_ERROR.
  • An Entity holds one expense Feed, like every other family. A second one answers 409 with SOURCE_FEED_FAMILY_ALREADY_FED_ERROR.
  • The Source holds Expense Renditions. An existing Source without the mark answers 422 with SOURCE_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 with 409 and SOURCE_PINNED_ERROR.
  • The Provider lists the account. List the Provider Accounts with GET /integrations/:integrationId/provider-accounts. An id the Provider doesn’t list answers 422 with SOURCE_FEED_PROVIDER_ACCOUNT_NOT_FOUND_ERROR.
In the app, open the Xpendit Integration’s panel. Its feed step shows one row per Subsidiary that no Feed reads yet. For each one, pick a Source that holds Expense Renditions, or create one, and its Link Date. A routed Subsidiary shows Rendiciones, the Cuenta del proveedor, the Source, and the Link Date, with Sincronizar and Vista previa.

Sync an expense Feed

A sync of an expense 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:
  1. The category the Feed created for it on an earlier sync, even if you renamed it.
  2. Else the Entity’s own category with the same name. The Feed takes it over, so it still finds it once you rename it.
  3. Else a new category with that name and no expense account. Its sourceFeedId is the Feed, and its providerCategoryId is Xpendit’s category id.
If you delete a category the Feed brought, the next sync that reads an expense of it creates the category again, with no expense account. An expense whose category has no expense account is rejected with 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 the amount 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 with preview: 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 in statedDteReferences 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_mirror and wasabil state the references of each document. bsale states 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.
A reference is linked only when its target is already in the Entity’s books: a DTE of the same issuer, with the stated type and folio. A target that is not there yet is not linked. For a reference the provider states, a sync that runs after the target lands links it, because every sync reads its whole window again. A reference stated only in the XML is read once, when the sync attaches the XML; to link it later, add it with 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.

Status codes