Ir al contenido

Emitir factura

POST
/v1/invoices
curl --request POST \
--url https://api.chaski.ec/v1/invoices \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: example' \
--data '{ "issuer": "example", "emission_point": "example", "external_ref": "example", "buyer": { "id_type": "ruc", "id": "example", "name": "example", "email": "[email protected]", "address": "example" }, "items": [ { "code": "example", "auxiliary_code": "example", "description": "example", "unit_of_measure": "example", "quantity": "example", "unit_price": "example", "discount": "example", "taxes": [ { "type": "iva", "rate": "0", "percent": "example" } ], "details": { "additionalProperty": "example" } } ], "payments": [ { "method": "no_financial_system", "amount": "example", "term": "example", "time_unit": "example" } ], "tip": "example", "additional_info": { "additionalProperty": "example" }, "metadata": { "additionalProperty": "example" }, "send_email": true }'

Responde 202 con status: "pending"; el envío y la autorización del SRI ocurren en segundo plano y se notifican por webhook. En producción valida la cuota del plan y los paquetes: si no queda, 402 quota_exceeded (con limit, current, period_end y addon_offer). Los comprobantes de pruebas no consumen cuota. Cada ítem lleva su IVA en taxes y, si aplica, ice (código de la tabla 18 y tarifa; el ICE específico o mixto se manda con amount) e irbpnr (0,02 por botella). El ICE entra en la base del IVA; el IRBPNR no. IVA diferenciado: rate: "differentiated" con el percent del decreto.

Idempotency-Key
required
string
<= 255 characters

Una clave única por petición (por ejemplo un UUID). Vale 24 h: reintentar con la misma clave y el mismo body devuelve la misma respuesta.

Media typeapplication/json
object
issuer
required
string
emission_point
required
string
/^\d{3}-\d{3}$/
external_ref
string
>= 1 characters <= 255 characters
buyer
required
object
id_type
required
string
Allowed values: ruc cedula passport final_consumer foreign
id
required
string
>= 1 characters <= 20 characters
name
required
string
>= 1 characters <= 300 characters
email
string format: email
/^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$/
address
string
>= 1 characters <= 300 characters
items
required
Array<object>
>= 1 items <= 500 items
object
code
string
>= 1 characters <= 25 characters
auxiliary_code
string
>= 1 characters <= 25 characters
description
required
string
>= 1 characters <= 300 characters
unit_of_measure
string
>= 1 characters <= 50 characters
quantity
required
string
/^\d+(\.\d+)?$/
unit_price
required
string
/^\d+(\.\d+)?$/
discount
string
/^\d+(\.\d+)?$/
taxes
required
Array
>= 1 items <= 3 items
One of:
object
type
required
string
Allowed value: iva
rate
required
string
Allowed values: 0 5 15 exempt not_subject differentiated
percent
string
/^\d+(\.\d+)?$/
details
object
key
additional properties
string
<= 300 characters
payments
required
Array<object>
>= 1 items <= 20 items
object
method
required
string
Allowed values: no_financial_system debt_compensation debit_card electronic_money prepaid_card credit_card other_financial_system endorsement
amount
string
/^\d+(\.\d+)?$/
term
string
/^\d+(\.\d+)?$/
time_unit
string
>= 1 characters <= 10 characters
tip
string
/^\d+(\.\d+)?$/
additional_info
object
key
additional properties
string
<= 300 characters
metadata
object
key
additional properties
string
<= 500 characters
send_email
boolean

OK

Media typeapplication/json
object
id
required
string
status
required
string
Allowed values: pending received authorized rejected failed voided
environment
required
string
Allowed values: test live
issuer
required
string
emission_point
required
string
number
required
string
access_key
required

Clave de acceso de 49 dígitos

string
issue_date
required
string format: date
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))$/
buyer
required
object
id
required
string
name
required
string
email
required
string | null
totals
required
object
subtotal
required
string
discount
required
string
taxes
required
Array<object>
object
type
required
string
Allowed values: iva ice irbpnr
rate
required
string
base
required
string
amount
required
string
tip
required
string
total
required
string
external_ref
required
string | null
metadata
required
object
key
additional properties
string
sri_messages
required
Array<object>
object
code
required
string
type
required
string
message
required
string
additional_info
string
authorized_at
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
voided_at
required
Any of:
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/
void_reason
required
string | null
created_at
required
string format: date-time
/^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z|([+-](?:[01]\d|2[0-3]):[0-5]\d)))$/

Example

{
"id": "inv_01jbx3k9q2f8m4tn6vwz0yh5ce",
"status": "pending",
"environment": "test",
"emission_point": "001-001",
"number": "001-001-000000123",
"totals": {
"taxes": [
{
"type": "iva"
}
]
}
}

Petición inválida

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}

Falta la API key o no es válida

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}

Cuota de comprobantes agotada (quota_exceeded)

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}

Sin permiso (cuenta suspendida, emisor no habilitado en producción, límite del plan…)

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}

Conflicto (recurso repetido, Idempotency-Key en curso…)

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}

No se puede procesar (certificado vencido, Idempotency-Key reutilizada…)

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}

Demasiadas peticiones

Media typeapplication/json
object
error
required
object
code
required
string
message
required
string
field
string
key
additional properties

Example

{
"error": {
"code": "invalid_request"
}
}