Ir al contenido
Factuplan

API REST de facturación electrónica Ecuador

Descargar colección de Postman

El API HTTP REST de Factuplan te permite integrar facturación electrónica autorizada por el SRI del Ecuador desde cualquier lenguaje o plataforma: PHP, Python, Go, .NET, Ruby, Bash + cURL, etc.

  • Base URL: https://api-rest.factuplan.com.ec
  • Versionado por path: todos los endpoints viven bajo /v1/developer/*.
  • Respuestas siempre JSON con sobre { data, meta }.
  • Dos entornos: pruebas (ak_test_*) y producción (ak_live_*).
  • Compatible con Postman: descarga la colección oficial.

Importante: los comprobantes creados con una API key de pruebas se eliminan automáticamente cada hora. Usa pruebas solo para desarrollo.

No hay nada que instalar — el API se consume con cualquier cliente HTTP.

  1. Inicia sesión en app.factuplan.com.ec.
  2. Anda a Developer → Create API key.
  3. Copia la clave generada — solo se muestra una vez.
  4. Guárdala en una variable de entorno (FACTUPLAN_API_KEY), nunca la subas al repositorio.

Las API keys son por workspace. El prefijo indica el entorno:

PrefijoEntornoComportamiento
ak_test_*PruebasComprobantes ficticios, eliminados cada hora
ak_live_*ProducciónComprobantes reales firmados y enviados al SRI
Ventana de terminal
curl https://api-rest.factuplan.com.ec/v1/developer/usage \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "Accept: application/json"

Todas las peticiones requieren dos cabeceras:

CabeceraValorNotas
X-API-KeyTu API key (ak_test_* o ak_live_*)Identifica el workspace y el plan.
x-taxpayer-rucRUC del contribuyente emisor (13 dígitos)Requerida cuando la operación emite o consulta comprobantes.
Ventana de terminal
curl https://api-rest.factuplan.com.ec/v1/developer/invoices \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d @factura.json

Seguridad: nunca expongas tu API key en el frontend. Úsala solo desde tu servidor.

Todas las respuestas exitosas siguen la misma forma:

{
"data": { /* recurso o lista */ },
"meta": {
"requestId": "req_1a2b3c",
"timestamp": "2026-05-13T12:34:56.789Z"
}
}

Las listas paginadas añaden meta.pagination:

{
"data": [ /* ... */ ],
"meta": {
"requestId": "req_1a2b3c",
"timestamp": "2026-05-13T12:34:56.789Z",
"pagination": {
"total": 120,
"page": 1,
"limit": 20,
"totalPages": 6
}
}
}

Los errores devuelven el mismo formato en todos los endpoints:

{
"statusCode": 422,
"message": "Customer identification is invalid",
"code": "INVOICE_4002",
"details": [
"identification must be a 13-digit RUC"
]
}
Código HTTPSignificado
200 / 201Operación correcta.
400Error de validación o body mal formado.
401API key faltante, inválida o expirada.
403Permisos insuficientes o plan incompatible.
404Recurso no encontrado.
422Datos válidos sintácticamente pero rechazados por reglas del negocio o del SRI.
429Rate limit o cuota mensual excedidos.
500Error interno — reintenta con backoff.

Descarga la colección oficial e impórtala en Postman para probar el API en segundos. La colección incluye 52 endpoints organizados en 9 secciones (facturas, uso, certificado, clientes, productos, notas de crédito, notas de débito, retenciones y guías de remisión) con ejemplos de request y response.

1) Descarga: /factuplan-developer.postman_collection.json
2) Abre Postman → Import → arrastra el archivo.
3) En la colección "Factuplan API" → pestaña Variables, reemplaza:
apiKey = tu API key (ak_test_* o ak_live_*)
taxpayerRuc = tu RUC de 13 dígitos
baseUrl ya viene pre-configurada en https://api-rest.factuplan.com.ec.

Descargar colección

Emisión completa de facturas electrónicas. La API soporta tres modos:

  • Modo A — Factuplan crea el XML, lo firma, lo autoriza ante el SRI, genera el PDF (RIDE) y manda el correo. Es el camino recomendado.
  • Modo B — Tú generas el XML sin firmar; Factuplan lo firma, autoriza y notifica.
  • Modo C — Factuplan solo firma el XML; tú te encargas del envío al SRI.
POST /v1/developer/invoices

Flujo completo: crea el XML, lo firma con tu certificado P12, lo autoriza ante el SRI, genera el PDF (RIDE) y envía el correo al cliente automáticamente.

{
"customer": {
"customerId": "cust_id (opcional)",
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec",
"address": "Guayaquil, Ecuador",
"phone": "+593985691039",
"saveToContacts": true
},
"items": [
{
"quantity": 1,
"productId": "prod_id (opcional)",
"code": "SERV-001",
"auxiliaryCode": "AUX-001 (opcional)",
"description": "Servicio de consultoría",
"unitPrice": 150.0,
"discount": 0,
"taxType": "IVA_RATE",
"tax": 15,
"saveToProducts": false
}
],
"emissionPointId": "ep_id (opcional)",
"establishment": "001 (opcional)",
"emissionPoint": "001 (opcional)",
"additionalInfo": { "Vendedor": "Juan Pérez" },
"sendEmail": true,
"payments": [
{
"method": "20",
"amount": 172.5,
"term": 30,
"timeUnit": "dias"
}
]
}
CampoTipoRequeridoNotas
customerIdstringNoSi se envía, ignora los demás campos y usa el cliente del directorio.
identificationTypeenumRUC, CEDULA, PASSPORT, FINAL_CONSUMER
identificationstringRUC = 13 dígitos · CEDULA = 10 dígitos.
legalNamestringRazón social o nombre completo.
emailstringNoNecesario para envío automático del RIDE.
addressstringNoAparece en el RIDE.
phonestringNoFormato libre.
saveToContactsbooleanNoSi true, lo guarda en tu directorio.
CampoTipoRequeridoNotas
quantitynumberCantidad facturada.
productIdstringNoSi se envía, los demás campos pueden omitirse.
codestringIdentificador del ítem.
auxiliaryCodestringNoCódigo secundario (SKU, código de barras…).
descriptionstringAparece en el RIDE.
unitPricenumberHasta 4 decimales de precisión.
discountnumberNoDescuento por línea.
taxTypeenumIVA_0, IVA_RATE, NOT_TAXABLE, EXEMPT.
taxnumberSí cuando taxType=IVA_RATETarifa: 0, 5, 8, 12, 14, 15 (default 15).
saveToProductsbooleanNoSi true, lo guarda en tu catálogo.

Tres formas de resolverlo, en orden de prioridad:

  1. Por UUID — envía emissionPointId.
  2. Por códigos SRI — envía establishment + emissionPoint.
  3. Auto-detección — omite todo; si solo tienes un punto activo, lo usa.

Aplica cuando taxType es IVA_RATE. Default: 15.

taxCódigo SRIDescripción
00IVA 0%
55IVA 5%
88IVA 8%
122IVA 12%
143IVA 14%
154IVA 15% (default)

Cada entrada lleva el código SRI en method, el amount y, opcionalmente, term + timeUnit. Si omites payments, se aplica "01" (Sin utilización del sistema financiero).

La suma de los amount debe ser exactamente igual al total con impuestos. Si no, el SRI rechaza la factura con 400.

CódigoDescripción
01Sin utilización del sistema financiero
15Compensación de deudas
16Tarjeta de débito
17Dinero electrónico
18Tarjeta prepago
19Tarjeta de crédito
20Otros con utilización del sistema financiero
21Endoso de títulos
timeUnitDescripción
diasDías
mesesMeses
aniosAños
{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0104202601099337815000110010010000000011234567890",
"sequential": "000000001",
"status": "PROCESSING",
"total": 172.5,
"source": "API",
"apiKeyId": "ak_01H..."
},
"meta": {
"requestId": "req_1a2b3c",
"timestamp": "2026-05-13T12:34:56.789Z"
}
}

status empieza en PROCESSING y evoluciona a AUTHORIZEDCOMPLETED, o a ERROR / REJECTED. Consulta el progreso con GET /v1/developer/receipts/{id}/status.

Ventana de terminal
curl https://api-rest.factuplan.com.ec/v1/developer/invoices \
-X POST \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{
"customer": {
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec"
},
"items": [
{
"code": "SERV-001",
"description": "Servicio de consultoría",
"quantity": 1,
"unitPrice": 150.0,
"taxType": "IVA_RATE",
"tax": 15
}
],
"payments": [
{ "method": "20", "amount": 172.5 }
]
}'
GET /v1/developer/invoices

Lista las facturas emitidas con paginación. Puedes filtrar por RUC del cliente, estado y rango de fechas.

ParámetroTipoDefaultNotas
pagenumber1Página solicitada.
limitnumber20Elementos por página (máx. 100).
rucstringRUC o cédula del cliente (filtro opcional).
statusenumDRAFT, AUTHORIZED, REJECTED, VOIDED.
dateFromstringFecha de inicio ISO 8601 (ej: 2025-01-01).
dateTostringFecha de fin ISO 8601 (ej: 2025-12-31).
{
"data": [
{
"id": "rcpt_01HABC",
"accessKey": "0104202601099337815000110010010000000011234567890",
"sequential": "000000007",
"status": "AUTHORIZED",
"total": 172.5,
"createdAt": "2026-05-13T12:34:56.789Z"
}
],
"meta": {
"requestId": "req_1a2b3c",
"timestamp": "2026-05-13T12:34:56.789Z",
"pagination": { "total": 120, "page": 1, "limit": 20, "totalPages": 6 }
}
}
POST /v1/developer/invoices/import

Importa una factura ya autorizada por el SRI usando su clave de 49 dígitos. Útil para sincronizar comprobantes emitidos fuera de Factuplan.

Solo ak_live_*. No disponible con claves de pruebas.

{
"accessKey": "0104202601099337815000110010010000000011234567890"
}
{
"data": {
"id": "rcpt_01HXYZ",
"accessKey": "0104202601099337815000110010010000000011234567890",
"sequential": "000000007",
"status": "AUTHORIZED",
"total": 230.0,
"source": "IMPORT",
"apiKeyId": "ak_01H..."
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}

Si tu sistema ya genera el XML de factura sin firmar, puedes enviarlo directamente a Factuplan para que lo firme con tu certificado y lo autorice ante el SRI.

POST /v1/developer/sign-and-authorize

Headers

HeaderValor
X-API-Keyak_live_...
x-taxpayer-rucRUC del contribuyente emisor
Content-Typeapplication/json

Body

{
"xml": "<factura>...</factura>"
}
CampoTipoRequeridoDescripción
xmlstringXML de factura sin firmar, como string UTF-8

Respuesta 201 Created

{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0104202601099337815000110010010000000011234567890",
"status": "PROCESSING",
"type": "INVOICE"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
idstringID interno del comprobante en Factuplan
accessKeystringClave de acceso SRI de 49 dígitos
statusstringEstado inicial (PROCESSING)
typestringTipo de comprobante (INVOICE)

Ejemplo con cURL

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/sign-and-authorize \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "xml": "<factura>...</factura>" }'

Consulta el progreso con GET /v1/developer/receipts/{id}/status.

POST /v1/developer/sign

Firma el XML con tu certificado P12 de forma síncrona, sin enviarlo al SRI. Útil si necesitas controlar el envío al SRI por tu cuenta.

Body

{
"xml": "<factura>...</factura>"
}

Respuesta 200 OK

{
"data": {
"signedXml": "<factura>...</factura>"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
POST /v1/developer/validate-xml

Valida que el XML tenga la estructura correcta según el esquema del SRI, sin procesarlo ni enviarlo. Devuelve los errores de validación encontrados.

Body

{
"xml": "<factura>...</factura>"
}

Respuesta 200 OK

{
"data": {
"valid": false,
"errors": [
"El elemento 'infoTributaria' es requerido"
]
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}

Consultar comprobante externo por clave de acceso

Sección titulada «Consultar comprobante externo por clave de acceso»
POST /v1/developer/receipts/query

Consulta cualquier comprobante autorizado por el SRI (Facturas 01, Notas de Crédito 04, Guías de Remisión 06), sin importar qué sistema lo emitió. Si el contribuyente emisor no existe en tu workspace, se crea automáticamente con firma vacía.

Solo ak_live_*. No disponible con claves de pruebas.

Cómo se descuenta el contador: el crédito se descuenta cuando el comprobante está autorizado, sin importar el valor de save. Si no está autorizado, no se descuenta ningún crédito.

CampoTipoRequeridoNotas
accessKeystringClave de acceso SRI (49 dígitos).
savebooleanNo (default true)Si false, solo verifica sin guardar en BD ni generar PDF.
{
"accessKey": "0104202601019999999900110010010000000011234567813",
"save": true
}
GET /v1/developer/receipts/{id}

Devuelve todos los datos del comprobante: estado, clave de acceso, secuencial, totales y fechas.

{
"data": {
"id": "rcpt_01HABC",
"accessKey": "0104202601099337815000110010010000000011234567890",
"sequential": "000000001",
"status": "COMPLETED",
"total": 172.5,
"source": "API",
"apiKeyId": "ak_01H..."
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/receipts/{id}/status

Devuelve el estado actual: PROCESSING, AUTHORIZED, COMPLETED, ERROR o REJECTED.

{
"data": {
"status": "AUTHORIZED",
"authorizationNumber": "0104202601...",
"messages": []
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/receipts/{id}/xml

Devuelve una URL pre-firmada del XML autorizado por el SRI (expira en 5 minutos) y una URL permanente de visualización (previewUrl) que no expira.

{
"data": {
"url": "https://files.factuplan.com.ec/...?sig=...",
"previewUrl": "https://files.factuplan.com.ec/preview/rcpt_01HABC.xml"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/receipts/{id}/pdf

Devuelve una URL pre-firmada del PDF (RIDE) del comprobante (expira en 5 minutos) y una URL permanente de visualización (previewUrl).

{
"data": {
"url": "https://files.factuplan.com.ec/...?sig=...",
"previewUrl": "https://files.factuplan.com.ec/preview/rcpt_01HABC.pdf"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}

CRUD del directorio de clientes (receptores) que aparecerán en tus comprobantes.

POST /v1/developer/customers
{
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec",
"address": "Guayaquil, Ecuador",
"phone": "+593985691039",
"additionalEmail": "contabilidad@empresademo.ec"
}
CampoTipoRequeridoNotas
identificationTypeenumRUC, CEDULA, PASSPORT, FINAL_CONSUMER.
identificationstringValidamos longitud y dígito verificador.
legalNamestringRazón social o nombre completo.
emailstringNoPara envío automático del RIDE.
addressstringNoAparece en el RIDE.
phonestringNoFormato libre.
additionalEmailstringNoCopia opcional para el envío del RIDE.
{
"data": {
"id": "cust_01HABC",
"taxpayerId": "tax_01H...",
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec",
"isActive": true,
"createdAt": "2026-05-13T12:34:56.789Z",
"updatedAt": "2026-05-13T12:34:56.789Z"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/customers
ParámetroTipoDefaultNotas
pagenumber1Página solicitada.
limitnumber20Elementos por página.
searchstringBusca por nombre, identificación o email.
identificationTypeenumRUC, CEDULA, PASSPORT, FINAL_CONSUMER.
isActivebooleanFiltra por estado activo.
{
"data": [
{
"id": "cust_01HABC",
"taxpayerId": "tax_01H...",
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec",
"isActive": true,
"createdAt": "2026-05-13T12:34:56.789Z",
"updatedAt": "2026-05-13T12:34:56.789Z"
}
],
"meta": {
"requestId": "req_1a2b3c",
"timestamp": "2026-05-13T12:34:56.789Z",
"pagination": { "total": 120, "page": 1, "limit": 20, "totalPages": 6 }
}
}
GET /v1/developer/customers/{id}

Devuelve el detalle completo de un cliente específico por su ID.

PATCH /v1/developer/customers/{id}

Actualiza uno o más campos. Solo se modifican los enviados en el body.

{
"email": "nuevo@empresademo.ec",
"phone": "+593987654321",
"isActive": true
}
DELETE /v1/developer/customers/{id}

Elimina un cliente del directorio. No afecta los comprobantes ya emitidos a ese cliente.

{
"data": { "message": "Customer deleted successfully" },
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}

CRUD del catálogo de ítems facturables. Funciona igual para productos tangibles y servicios.

POST /v1/developer/products
{
"code": "SERV-001",
"type": "SERVICE",
"name": "Servicio de consultoría",
"unitPrice": 150.0,
"taxType": "IVA_RATE",
"auxiliaryCode": "AUX-001",
"description": "Hora de consultoría técnica",
"iceCode": "",
"iceRate": 0,
"irbpnr": false,
"unitOfMeasure": "hora"
}
CampoTipoRequeridoNotas
codestringIdentificador único en tu workspace.
typeenumPRODUCT, SERVICE.
namestringAparece en el RIDE.
unitPricenumberHasta 4 decimales de precisión.
taxTypeenumIVA_0, IVA_RATE, NOT_TAXABLE, EXEMPT.
auxiliaryCodestringNoCódigo secundario (SKU, código de barras…).
descriptionstringNoDescripción larga.
iceCodestringNoCódigo ICE del SRI.
iceRatenumberNoTarifa ICE aplicable.
irbpnrbooleanNotrue si el ítem aplica IRBPNR.
unitOfMeasurestringNoEj. unidad, kg, hora.
GET /v1/developer/products
ParámetroTipoDefaultNotas
pagenumber1Página solicitada.
limitnumber20Elementos por página.
searchstringBusca por nombre, código o descripción.
typeenumPRODUCT, SERVICE.
taxTypeenumIVA_0, IVA_RATE, NOT_TAXABLE, EXEMPT.
isActivebooleanFiltra por estado activo.
GET /v1/developer/products/{id}
PATCH /v1/developer/products/{id}
DELETE /v1/developer/products/{id}

PATCH acepta cualquier subconjunto de los campos de creación más isActive: boolean. DELETE no afecta comprobantes históricos que ya referencien el ítem.

GET /v1/developer/usage

Devuelve el consumo de documentos del mes actual, el límite de tu plan y el costo estimado.

{
"data": {
"currentMonth": "2026-05",
"plan": "growth",
"monthlyQuota": 1000,
"monthlyUsed": 273
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
currentMonthstringPeríodo actual (YYYY-MM).
planstringPlan vigente del workspace.
monthlyQuotanumberLímite mensual del plan.
monthlyUsednumberDocumentos consumidos en el período.
GET /v1/developer/certificate/status

Indica si el certificado P12 configurado en tu cuenta está vigente, su fecha de vencimiento y el RUC del titular. Si no está vigente, los comprobantes no podrán firmarse.

{
"data": {
"hasCertificate": true,
"isExpired": false,
"daysUntilExpiry": 87,
"ruc": "0950194407001",
"legalName": "Mi Empresa S.A.",
"issuedAt": "2025-05-13T00:00:00.000Z",
"expiresAt": "2026-08-08T00:00:00.000Z",
"issuer": "Banco Central del Ecuador"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
hasCertificatebooleanSi hay un certificado cargado.
isExpiredbooleantrue si el certificado expiró.
daysUntilExpirynumberDías restantes hasta el vencimiento.
rucstringRUC del titular del certificado.
legalNamestringNombre registrado en el certificado.
issuedAtstringFecha de emisión (ISO 8601).
expiresAtstringFecha de vencimiento (ISO 8601).
issuerstringEntidad certificadora emisora.

Si isExpired es true, renueva el certificado en Configuración → Certificado desde tu cuenta antes de seguir emitiendo.

POST /v1/developer/certificate
Content-Type: multipart/form-data

Sube un certificado P12. Si el RUC del certificado no existe aún como contribuyente en tu cuenta y tu plan lo permite, el contribuyente se crea automáticamente y se vincula a tu API key.

CampoTipoRequeridoDescripción
filearchivoArchivo P12 (.p12 o .pfx).
passwordstringContraseña del certificado.
Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/certificate \
-H "x-api-key: ak_live_TU_CLAVE" \
-F "file=@/ruta/firma.p12" \
-F "password=MiContraseña"
{
"data": {
"hasCertificate": true,
"isExpired": false,
"daysUntilExpiry": 87,
"ruc": "0950194407001",
"legalName": "Mi Empresa S.A.",
"expiresAt": "2026-08-08T00:00:00.000Z",
"created": true
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
hasCertificatebooleantrue si el certificado se subió correctamente.
isExpiredbooleanSi el certificado ya expiró.
daysUntilExpirynumberDías restantes hasta el vencimiento.
rucstringRUC extraído del certificado.
legalNamestringNombre legal extraído del certificado.
expiresAtstringFecha de vencimiento (ISO 8601).
createdbooleantrue si se creó automáticamente un nuevo contribuyente. Solo presente cuando se creó.

Una nota de crédito corrige total o parcialmente una factura ya autorizada. Se identifica la factura original por su clave de acceso de 49 dígitos. Si la factura no existe en el sistema, Factuplan la importa automáticamente desde el SRI (genera XML y PDF sin enviar correo).

POST /v1/developer/credit-notes

Headers

HeaderValor
X-API-Keyak_live_...
x-taxpayer-rucRUC del contribuyente emisor
Content-Typeapplication/json

Body

{
"invoiceAccessKey": "2312202301179214289100110010020000001231234567811",
"reason": "Error en datos del cliente",
"items": [
{
"code": "SERV-001",
"description": "Servicio de desarrollo web",
"quantity": 1,
"unitPrice": 100.00,
"taxType": "IVA_RATE"
}
]
}
CampoTipoRequeridoDescripción
invoiceAccessKeystringClave de acceso de 49 dígitos de la factura original
reasonstringMotivo de la nota de crédito
itemsarrayÍtems a acreditar (misma estructura que en facturas)
emissionPointIdstringNoUUID del punto de emisión (hereda el de la factura si se omite)
paymentsarrayNoMétodos de pago
additionalInfoobjectNoCampos adicionales clave-valor

Respuesta 201

{
"data": {
"id": "clx1234...",
"accessKey": "0412202404179214289100110010040000001231234567814",
"sequential": "000000001",
"status": "PROCESSING",
"total": 115.00
},
"meta": {}
}
GET /v1/developer/credit-notes

Lista las notas de crédito emitidas con paginación. Acepta los mismos filtros que el listado de facturas (page, limit, ruc, status, dateFrom, dateTo).

Una vez emitida, usa los endpoints genéricos de comprobantes:

GET /v1/developer/receipts/:id # Detalle
GET /v1/developer/receipts/:id/status # Estado
GET /v1/developer/receipts/:id/xml # XML autorizado
GET /v1/developer/receipts/:id/pdf # PDF RIDE
POST /v1/developer/receipts/:id/void # Anular (solo a nivel sistema)

Importante: La anulación es solo a nivel del sistema Factuplan. La notificación de anulación ante el SRI es responsabilidad del desarrollador.

PATCH /v1/developer/credit-notes/sequential

Establece el próximo número secuencial para notas de crédito en el punto de emisión indicado. El nuevo valor entra en efecto en el siguiente comprobante emitido.

{
"branchCode": "001",
"emissionCode": "001",
"creditNoteSequential": 100
}
CampoTipoRequeridoDescripción
branchCodestringCódigo del establecimiento (3 dígitos, ej: "001")
emissionCodestringCódigo del punto de emisión (3 dígitos, ej: "001")
creditNoteSequentialintegerNuevo valor del secuencial (≥ 0)

Si tu sistema ya genera el XML de nota de crédito sin firmar, puedes enviarlo a Factuplan para que lo firme con tu certificado y lo autorice ante el SRI. La nota de crédito referencia una factura original por clave de acceso — si esa factura no existe en Factuplan, impórtala primero.

Paso 1 — Importar la factura vinculada (si no existe en Factuplan)

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/invoices/import \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "accessKey": "0102202401179213650600120010010000000011234567813" }'

Paso 2 — Firmar y autorizar el XML de la nota de crédito

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/sign-and-authorize \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "xml": "<notaCredito>...</notaCredito>" }'

Respuesta 201 Created

{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0412202404179214289100110010040000001231234567814",
"status": "PROCESSING",
"type": "CREDIT_NOTE"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
idstringID interno del comprobante en Factuplan
accessKeystringClave de acceso SRI de 49 dígitos
statusstringEstado inicial (PROCESSING)
typestringTipo de comprobante (CREDIT_NOTE)

Consulta el progreso con GET /v1/developer/receipts/{id}/status.

Una nota de débito registra cargos adicionales sobre una factura ya autorizada: ajustes de precio, mora, flete no facturado, etc. Se identifica la factura original por su clave de acceso de 49 dígitos.

POST /v1/developer/debit-notes

Emite una nota de débito a partir de una factura ya autorizada. Si la factura no existe en el sistema, impórtala primero con POST /v1/developer/invoices/import.

{
"invoiceAccessKey": "2312202301179214289100110010020000001231234567811",
"reasons": [
{
"description": "Ajuste de precio",
"amount": 10.00,
"taxType": "IVA"
}
],
"additionalInfo": {}
}
CampoTipoRequeridoDescripción
invoiceAccessKeystringClave de acceso de 49 dígitos de la factura original
reasonsarrayMotivos del cargo: description, amount y taxType
additionalInfoobjectNoCampos adicionales clave-valor

Cada entrada de reasons lleva:

CampoTipoRequeridoDescripción
descriptionstringConcepto del cargo (ej: “Ajuste de precio”)
amountnumberMonto del cargo
taxTypestringImpuesto aplicable al cargo (ej: IVA)
{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0512202404179214289100110010050000001231234567815",
"sequential": "000000001",
"status": "PROCESSING",
"total": 11.50
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/debit-notes

Lista las notas de débito emitidas con paginación. Acepta los mismos filtros que el listado de facturas (page, limit, ruc, status, dateFrom, dateTo).

Una vez emitida, usa los endpoints genéricos de comprobantes:

GET /v1/developer/receipts/:id # Detalle
GET /v1/developer/receipts/:id/status # Estado
GET /v1/developer/receipts/:id/xml # XML autorizado
GET /v1/developer/receipts/:id/pdf # PDF RIDE
POST /v1/developer/receipts/:id/void # Anular (solo a nivel sistema)
PATCH /v1/developer/debit-notes/sequential

Mismo contrato que el secuencial de facturas, con el campo debitNoteSequential:

{
"branchCode": "001",
"emissionCode": "001",
"debitNoteSequential": 100
}

Si tu sistema ya genera el XML de nota de débito sin firmar, puedes enviarlo a Factuplan para que lo firme con tu certificado y lo autorice ante el SRI.

Paso 1 — Importar la factura vinculada (si no existe en Factuplan)

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/invoices/import \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "accessKey": "0102202401179213650600120010010000000011234567813" }'

Paso 2 — Firmar y autorizar el XML de la nota de débito

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/sign-and-authorize \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "xml": "<notaDebito>...</notaDebito>" }'

Respuesta 201 Created

{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0512202404179214289100110010050000001231234567815",
"status": "PROCESSING",
"type": "DEBIT_NOTE"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
idstringID interno del comprobante en Factuplan
accessKeystringClave de acceso SRI de 49 dígitos
statusstringEstado inicial (PROCESSING)
typestringTipo de comprobante (DEBIT_NOTE)

Consulta el progreso con GET /v1/developer/receipts/{id}/status.

Emisión de comprobantes de retención electrónica (codDoc 07) autorizados por el SRI.

POST /v1/developer/withholdings

Emite un comprobante de retención vinculado a una factura ya autorizada, identificada por su clave de acceso de 49 dígitos.

{
"invoiceAccessKey": "2312202301179214289100110010020000001231234567811",
"taxes": [
{
"taxType": "RENTA",
"taxRateCode": "303",
"taxRate": 10,
"taxBase": 1000.00
},
{
"taxType": "IVA",
"taxRateCode": "725",
"taxRate": 30,
"taxBase": 150.00
}
],
"additionalInfo": {}
}
CampoTipoRequeridoDescripción
invoiceAccessKeystringClave de acceso de 49 dígitos de la factura sustento
taxesarrayImpuestos a retener
additionalInfoobjectNoCampos adicionales clave-valor

Cada entrada de taxes lleva:

CampoTipoRequeridoDescripción
taxTypeenumRENTA o IVA
taxRateCodestringCódigo SRI de la retención (ej: 303 renta, 725 IVA 30%)
taxRatenumberPorcentaje de retención
taxBasenumberBase imponible sobre la que se calcula
{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0712202404179214289100110010070000001231234567817",
"sequential": "000000001",
"status": "PROCESSING"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/withholdings

Lista las retenciones emitidas con paginación. Filtros: page, limit, ruc (RUC o cédula del proveedor), status, dateFrom, dateTo.

Una vez emitida, usa los endpoints genéricos de comprobantes:

GET /v1/developer/receipts/:id # Detalle
GET /v1/developer/receipts/:id/status # Estado
GET /v1/developer/receipts/:id/xml # XML autorizado
GET /v1/developer/receipts/:id/pdf # PDF RIDE
POST /v1/developer/receipts/:id/void # Anular (solo a nivel sistema)

Si tu sistema ya genera el XML de retención sin firmar, puedes enviarlo a Factuplan para que lo firme con tu certificado y lo autorice ante el SRI.

Paso 1 — Importar la factura vinculada (si no existe en Factuplan)

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/invoices/import \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "accessKey": "0102202401179213650600120010010000000011234567813" }'

Paso 2 — Firmar y autorizar el XML de la retención

Ventana de terminal
curl -X POST https://api-rest.factuplan.com.ec/v1/developer/sign-and-authorize \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001" \
-H "Content-Type: application/json" \
-d '{ "xml": "<comprobanteRetencion>...</comprobanteRetencion>" }'

Respuesta 201 Created

{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0712202404179214289100110010070000001231234567817",
"status": "PROCESSING",
"type": "WITHHOLDING"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
CampoTipoDescripción
idstringID interno del comprobante en Factuplan
accessKeystringClave de acceso SRI de 49 dígitos
statusstringEstado inicial (PROCESSING)
typestringTipo de comprobante (WITHHOLDING)

Consulta el progreso con GET /v1/developer/receipts/{id}/status.

Emisión de guías de remisión electrónicas (codDoc 06) autorizadas por el SRI. El sistema genera el XML, lo firma con tu certificado P12 y lo autoriza ante el SRI de forma asíncrona.

POST /v1/developer/waybills
{
"emissionPointId": "ep_id (opcional)",
"customer": {
"identificationType": "RUC",
"identification": "0993378150001",
"legalName": "Empresa Demo S.A.",
"email": "facturas@empresademo.ec"
},
"transporterRuc": "0950194407001",
"transporterName": "Transportes Demo S.A.",
"vehiclePlate": "ABC-1234",
"departureAddress": "Av. de las Américas, Guayaquil",
"transportStartDate": "2026-06-10",
"transportEndDate": "2026-06-11",
"items": [
{
"code": "PROD-001",
"description": "Descripción de la mercadería",
"quantity": 10
}
],
"destinations": [
{
"receiverIdentification": "0993378150001",
"receiverName": "Empresa Receptora S.A.",
"address": "Av. Amazonas, Quito",
"transferReason": "Venta de mercadería",
"codDocSustento": "01",
"numDocSustento": "001-001-000000001"
}
],
"additionalInfo": {}
}
CampoTipoRequeridoDescripción
emissionPointIdstringNoUUID del punto de emisión (auto-detección si se omite)
customerobjectDestinatario principal: misma estructura que en facturas
transporterRucstringRUC del transportista
transporterNamestringNombre o razón social del transportista
vehiclePlatestringPlaca del vehículo (ej: ABC-1234)
departureAddressstringDirección del punto de partida
transportStartDatestringFecha de inicio del transporte (ISO 8601)
transportEndDatestringFecha de fin del transporte (ISO 8601)
itemsarrayMercadería transportada: code, description, quantity
destinationsarrayPuntos de entrega (ver tabla siguiente)
additionalInfoobjectNoCampos adicionales clave-valor

Cada entrada de destinations lleva:

CampoTipoRequeridoDescripción
receiverIdentificationstringRUC o cédula del destinatario
receiverNamestringNombre del destinatario
addressstringDirección de destino
transferReasonstringMotivo del traslado (ej: “Venta de mercadería”)
codDocSustentostringNoCódigo del documento sustento (ej: 01 factura)
numDocSustentostringNoNúmero del documento sustento (ej: 001-001-000000001)
{
"data": {
"id": "rcpt_01HABCDEF",
"accessKey": "0612202404179214289100110010060000001231234567816",
"sequential": "000000001",
"status": "PROCESSING"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}
GET /v1/developer/waybills
ParámetroTipoDefaultNotas
pagenumber1Página solicitada.
limitnumber20Elementos por página (máx. 100).
searchstringBúsqueda general (secuencial, clave de acceso, destinatario).
statusenumPROCESSING, AUTHORIZED, REJECTED, VOIDED, ERROR.
dateFromstringFecha de inicio ISO 8601 (ej: 2026-01-01).
dateTostringFecha de fin ISO 8601 (ej: 2026-12-31).

Una vez emitida, usa los endpoints genéricos de comprobantes:

GET /v1/developer/receipts/:id # Detalle
GET /v1/developer/receipts/:id/status # Estado
GET /v1/developer/receipts/:id/xml # XML autorizado
GET /v1/developer/receipts/:id/pdf # PDF RIDE
POST /v1/developer/receipts/:id/void # Anular (solo a nivel sistema)

Importante: la anulación marca la guía como VOIDED solo en Factuplan. La anulación ante el SRI es responsabilidad del emisor.

POST /v1/developer/receipts/{id}/void
x-taxpayer-ruc: 0950194407001

Anula un comprobante a nivel del sistema. El estado pasa a VOIDED. Solo se pueden anular comprobantes en estado AUTHORIZED o COMPLETED.

Importante: la anulación ante el SRI la debe gestionar el desarrollador de forma independiente. Este endpoint únicamente cambia el estado en Factuplan.

ParámetroDescripción
idID del comprobante a anular.
{
"reason": "Error en los datos del cliente"
}
CampoTipoRequeridoDescripción
reasonstringMotivo de la anulación. Obligatorio.
{
"data": {
"id": "01964ac3-7b2e-7e45-a9f2-2c3f4d5e6f7a",
"status": "VOIDED",
"accessKey": "2405202501179261786900110010010000000011234567816",
"voidReason": "Error en los datos del cliente",
"message": "Comprobante anulado correctamente"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-13T12:34:56.789Z" }
}

Establece el próximo número secuencial para facturas en un punto de emisión específico. El nuevo valor entra en efecto en el siguiente comprobante emitido.

PATCH /v1/developer/invoices/sequential
X-API-Key: ak_live_tu_api_key
x-taxpayer-ruc: 0950194407001
Content-Type: application/json
CampoTipoRequeridoDescripción
branchCodestringCódigo del establecimiento (3 dígitos, ej: "001")
emissionCodestringCódigo del punto de emisión (3 dígitos, ej: "001")
invoiceSequentialintegerNuevo valor del secuencial (≥ 0)
{
"branchCode": "001",
"emissionCode": "001",
"invoiceSequential": 100
}
{
"data": {
"branchCode": "001",
"emissionCode": "001",
"invoiceSequential": 100,
"updatedAt": "2026-05-26T15:00:00.000Z"
},
"meta": { "requestId": "req_1a2b3c", "timestamp": "2026-05-26T15:00:00.000Z" }
}

Nota: Este endpoint afecta únicamente el secuencial de facturas. Para notas de crédito y notas de débito usa PATCH /v1/developer/credit-notes/sequential y PATCH /v1/developer/debit-notes/sequential (mismo contrato, con creditNoteSequential / debitNoteSequential).

Todos los endpoints devuelven el mismo formato de error:

{
"statusCode": 422,
"message": "Customer identification is invalid",
"code": "INVOICE_4002",
"details": [
"identification must be a 13-digit RUC"
]
}
CódigoHTTPDescripción
AUTH_ERROR401API key inválida o expirada.
RATE_LIMIT429Límite de solicitudes excedido.
API_10001403Plan no compatible con la operación.
API_10002429Cuota mensual excedida.
INVOICE_4002422Datos del cliente inválidos.
INVOICE_4003422Detalle de factura vacío.
CERT_3008422Certificado expirado.
CUSTOMER_7004409Cliente duplicado.
PRODUCT_6002409Código de producto duplicado.
GENERAL_0003429Rate limit por velocidad.

Cada API key tiene dos límites:

  • Velocidad: 100 peticiones por segundo por API key.
  • Cuota mensual: depende del plan contratado (consulta /precios).

Si superas cualquiera de los dos, recibes HTTP 429.

Respuesta al superar el límite de velocidad

Sección titulada «Respuesta al superar el límite de velocidad»
{
"statusCode": 429,
"code": "GENERAL_0003",
"message": "Has superado el límite de peticiones. Intenta de nuevo en unos segundos."
}
{
"statusCode": 429,
"code": "API_10002",
"message": "Has alcanzado el límite mensual de 500 documentos.",
"details": { "used": 500, "quota": 500 }
}

Implementa espera exponencial (500ms → 1s → 2s → 4s…) y un máximo de reintentos por petición. Ejemplo en Python con requests:

import os, time, requests
API = "https://api-rest.factuplan.com.ec/v1/developer"
HEADERS = {
"X-API-Key": os.environ["FACTUPLAN_API_KEY"],
"x-taxpayer-ruc": "0950194407001",
"Content-Type": "application/json",
}
def emit_invoice(body, intentos=3):
for i in range(intentos):
r = requests.post(f"{API}/invoices", json=body, headers=HEADERS, timeout=30)
if r.status_code != 429:
r.raise_for_status()
return r.json()
time.sleep(0.5 * (2 ** i))
r.raise_for_status()

Antes de procesar un evento webhook, verifica que el comprobante exista y consulta su estado actual con GET /v1/developer/receipts/{id}. Esto evita que actualices tu base de datos con eventos manipulados o duplicados.

Ventana de terminal
curl https://api-rest.factuplan.com.ec/v1/developer/receipts/$RECEIPT_ID \
-H "X-API-Key: $FACTUPLAN_API_KEY" \
-H "x-taxpayer-ruc: 0950194407001"

Tip: llama a este endpoint apenas recibes un evento webhook. Confirma que el comprobante existe antes de actualizar tu BD o disparar notificaciones a tus usuarios.


¿Necesitas ayuda integrando el API? Escríbenos a info@factuplan.com.ec o desde el Centro de ayuda. Si prefieres Node.js o TypeScript, te ahorra trabajo el SDK oficial.