Ir al contenido

Facturas

pending → received → authorized
↘ rejected
↘ failed (no se pudo enviar después de varios intentos)
authorized → voided (registraste la anulación)

POST /v1/invoices responde 202 con la factura en pending. Chaski la firma y la envía al SRI en segundo plano. Cada cambio de estado genera un evento y un webhook.

{
"issuer": "iss_01jbx3k9q2f8m4tn6vwz0yh5ce",
"emission_point": "001-001",
"external_ref": "pedido-1042",
"buyer": {
"id_type": "ruc",
"id": "0993413686001",
"name": "FLOW SOLUTIONS TECHNOLOGY FLOWST S.A.S.",
"email": "[email protected]",
"address": "Samborondón"
},
"items": [
{
"code": "PRO-M",
"description": "Plan Pro mensual",
"quantity": "1",
"unit_price": "20.00",
"discount": "0.00",
"taxes": [{ "type": "iva", "rate": "15" }]
}
],
"payments": [{ "method": "credit_card", "amount": "23.00" }],
"additional_info": { "Pedido": "1042" },
"metadata": { "order_id": "1042" }
}
  • Montos como texto ("20.00"), para no perder precisión. Los totales los calcula Chaski.
  • buyer.id_type: ruc, cedula, passport, final_consumer (con id = 9999999999999, solo hasta $50) o foreign. Validamos el dígito verificador de cédulas y RUC.
  • taxes[].rate: 15 (tarifa general), 5, 0, exempt, not_subject o differentiated (ver abajo).
  • payments[].method: no_financial_system (efectivo), credit_card, debit_card, electronic_money, prepaid_card, other_financial_system, debt_compensation o endorsement. Si no pones amount, se usa el total.
  • additional_info va en el XML y en el RIDE (hasta 14 campos). metadata es solo para ti: no va al SRI.
  • send_email: por defecto, el comprador recibe el RIDE y el XML en producción y no en pruebas.

Cada ítem lleva exactamente un IVA y, si aplica, un ICE y un IRBPNR en el mismo taxes:

"taxes": [
{ "type": "iva", "rate": "15" },
{ "type": "ice", "code": "3610", "rate": "20" },
{ "type": "irbpnr" }
]
  • ICE (type: "ice"): code es el código de la tabla 18 del SRI. Con rate (porcentaje ad valorem), Chaski calcula el valor sobre el subtotal de la línea. Para el ICE específico o mixto (cigarrillos, alcohol, bebidas azucaradas), manda también amount con el valor calculado según la normativa vigente y, si la base es otra, base. El ICE entra en la base del IVA.
  • IRBPNR (type: "irbpnr"): $0,02 por botella plástica no retornable. Por defecto, una botella por unidad; si no, manda bottles. No entra en la base del IVA.
  • IVA diferenciado (rate: "differentiated"): para tarifas temporales por decreto (feriados, turismo). Manda el porcentaje vigente en percent, por ejemplo { "type": "iva", "rate": "differentiated", "percent": "8" }. Todos los ítems con IVA diferenciado de una factura deben tener el mismo porcentaje.

En la respuesta, totals.taxes trae una fila por impuesto: el IVA con su tarifa, el ICE con su código en rate y el IRBPNR con rate: "5001" y el número de botellas en base. Las notas de crédito aceptan los mismos impuestos; las liquidaciones de compra solo IVA (400 unsupported_tax).

Ventana de terminal
curl https://api.chaski.ec/v1/invoices/inv_… -H "Authorization: Bearer $CHASKI_API_KEY"
curl "https://api.chaski.ec/v1/invoices?status=authorized&limit=50" -H "Authorization: Bearer $CHASKI_API_KEY"
curl "https://api.chaski.ec/v1/invoices?external_ref=pedido-1042" -H "Authorization: Bearer $CHASKI_API_KEY"

Los listados se paginan con limit y starting_after (el id del último de la página anterior) y responden { "data": [...], "has_more": true }.

  • GET /v1/invoices/{id}/xml: el XML autorizado por el SRI, el que tiene validez.
  • GET /v1/invoices/{id}/pdf: el RIDE, con el logo y el color del perfil de marca del punto de emisión.
  • POST /v1/invoices/{id}/resend: vuelve a enviar el correo (opcional { "to": "[email protected]" }).
  • GET /v1/invoices/{id}/emails: los envíos y si llegaron, rebotaron o fueron marcados como spam.