Facturiadocs
Reception

The 8-day window

The legal deadline for claiming against a received document, why silence accepts, and how to design your integration around it.

Trap

8 calendar days. Silence accepts. It cannot be undone.

Chilean law gives the receiver 8 calendar days to reject a factura it has received, that is, a Chilean B2B invoice of type 33, 34 or 43. If you do nothing, on day 8 the document becomes irrevocably accepted and freely transferable — your supplier can assign it to a factoring house and you no longer have any way to dispute it.

Doing nothing is not "pending". It is accepting.

What that means in practice

A received document arrives carrying this:

"commercial_response": {
  "state": "pending",
  "state_reason": null,
  "deadline_at": "2026-08-20T23:59:59-04:00",
  "days_remaining": 6,
  "available_actions": ["accept", "reject_content", "reject_partial", "reject_total", "acknowledge_receipt"],
  "default_if_silent": "accepted",
  "history": []
}

default_if_silent is on every object for a reason: it is the answer to "and what if I do nothing?", which is the question an integrator has to answer before writing the first line.

deadline_at comes with a Chilean offset (-04:00 or -03:00, depending on daylight saving) because the deadline runs on the Chilean calendar, not as a 192-hour interval from a UTC instant.

Where the clock starts

A deadline is worth exactly what its zero point is worth, so here it is precisely:

AnchorThe SII's own reception stamp for that document, published as reception.sii_receipt_at
CountCalendar days. Weekends and public holidays count
GranularityWhole days on the America/Santiago civil calendar
ExpiryThe end of the eighth day after the anchor's Chilean date

Not the issuer's issue_date, which the issuer picks. Not the moment the mail reached your reception casilla — the mailbox the exchange delivers to — which depends on the sender's mail queue. And not our received_at, because then an outage of ours would shorten a legal deadline for you.

Day granularity has a practical consequence: a document received at 23:50 does not lose a day to the clock, and a daylight-saving change does not shift the expiry by an hour.

No anchor, no deadline — and we say so rather than invent one

Until the SII's reception stamp is known, deadline_at and days_remaining come back null and the write actions answer 422 commercial_response_anchor_pending.

Guessing a legal date is worse than refusing to name one. The database backs it up: a deadline stored without its anchor is rejected at the schema level.

But pending is not forever either: if the anchor does not arrive within two weeks we stop asking and the document settles at state: "expired_accepted" with state_reason: "anchor_never_registered". The deadline ran out all the same — silence accepts on day 8 without consulting us — we just never learned the exact date. The state_reason is there so you can tell that case apart from one where we did watch a deadline expire.

The three hard rules

We apply them before the SII applies them to you:

Types 33, 34 and 43 only. Anything else returns 422 commercial_response_not_applicable. A boleta (Chile's consumer receipt) or a guía de despacho (a dispatch note) carries no commercial response.

8 days, with the server in the way. Past the deadline you get 422 commercial_response_window_closed, with deadline_at inside the error so you can display it.

One shot. A second action on the same document returns 409 commercial_response_already_registered. And claims are irreversible: there is no un-claiming.

What to do with this in your integration

The defensible minimum

Listen for received_document.created and put it in front of a person. It is the default option and the one the law assumes.

The reminder

received_document.deadline_approaching fires at T−2 days while the state is still pending. Wired to an email or an internal notification, it is the difference between a decision and an accident.

// En tu handler de webhooks
if (evento.type === 'received_document.deadline_approaching') {
  const doc = evento.data.object;
  await avisar({
    para: '[email protected]',
    asunto: `Quedan ${doc.commercial_response.days_remaining} días para objetar ${doc.emisor.legal_name} folio ${doc.folio}`,
    cuerpo: `Total ${doc.totals.total}. Vence ${doc.commercial_response.deadline_at}.`,
  });
}

Sweeping what is still pending

curl -G https://api.facturia.cl/v1/received_documents \
  -H "Authorization: Bearer $FACTURIA_KEY" -H "Facturia-Empresa: $EMPRESA" \
  -d commercial_response_state=pending -d tipo_dte=33

A daily job that queries this and compares days_remaining against your own threshold is the simplest way to stop depending on someone reading an email.

Automatic explicit acceptance

auto_accept_received posts an ACD acceptance after N days. It ships off, because legal silence already accepts on day 8: the automation only matters if you want an explicit record.

curl -X PATCH https://api.facturia.cl/v1/empresas/emp_01K2R6.../automation_settings \
  -H "Authorization: Bearer $FACTURIA_KEY" -H "Content-Type: application/json" \
  -d '{"auto_accept_received": true, "auto_accept_received_after_days": 5}'

Automating acceptance does not buy you more time

auto_accept_received speeds acceptance up; it does not extend the deadline to claim. Set it to 5 days and you give up three days of window in exchange for an explicit record. Set it high, or do not set it.

How to test it without waiting a week

The sandbox has a clock you can advance per empresa.

# 1. Inyecta un documento recibido
curl -sS https://api.facturia.cl/v1/test_helpers/received_documents \
  -H "Authorization: Bearer $FACTURIA_KEY" -H "Facturia-Empresa: $EMPRESA" \
  -H "Content-Type: application/json" \
  -d '{
    "tipo_dte": 33,
    "folio": 8812,
    "emisor": { "rut": "96790240-3", "legal_name": "Proveedor Austral SpA" },
    "issue_date": "2026-08-12",
    "totals": { "net": 450000, "iva": 85500, "total": 535500 }
  }'

# 2. Adelanta nueve días
curl -sS https://api.facturia.cl/v1/test_helpers/clock \
  -H "Authorization: Bearer $FACTURIA_KEY" -H "Facturia-Empresa: $EMPRESA" \
  -H "Content-Type: application/json" \
  -d '{"advance_days":9}'

# 3. Intenta reclamar: 422 commercial_response_window_closed
curl -X POST https://api.facturia.cl/v1/received_documents/rdoc_01K2R9M3D8V5QW7N/reject \
  -H "Authorization: Bearer $FACTURIA_KEY" -H "Facturia-Empresa: $EMPRESA" \
  -H "Content-Type: application/json" \
  -d '{"reason":"content","note":"Fuera de plazo"}'

That test belongs in your suite. It is the only deadline in this API that can cost you money for doing nothing.

Tacit acceptance turns the factura into an enforceable, assignable instrument. That is why the deadline matters more than an internal approval flow: past day 8, the argument is no longer with your supplier but with whoever bought that factura.

The five actions you can take inside the deadline are in Commercial response.

On this page