# Wasabil API > API REST de Wasabil — facturación electrónica chilena (SII). Este archivo es la documentación completa concatenada en un solo volcado. La misma doc dividida por sección, con el peso de cada archivo, está en https://app.wasabil.com/llms.txt URL base: `https://api.wasabil.com/api` · App: `https://app.wasabil.com` · Tokens: `https://app.wasabil.com/api-tokens` # Empezar ## Empezar Bienvenido a la API de Wasabil. Acá tenés todo lo que necesitas para conectar tu sistema a Wasabil. ### Introducción La API de Wasabil te permite emitir documentos tributarios electrónicos (DTE) chilenos, gestionar clientes y proveedores, conciliar pagos, gestionar integraciones y mucho más. Es la misma API que usa la aplicación web. Todas las llamadas se hacen sobre HTTPS contra la URL base: ```text https://api.wasabil.com/api ``` > **¿Y la URL /v1?** > La API antigua bajo `https://api.wasabil.com/v1` sigue funcionando para no romper integraciones existentes, pero **no recibirá nuevos endpoints**. Todo lo de `/v1` también está disponible en `/api`. Si vas a integrar Wasabil hoy, usá `/api`. ### Enseñale a tu IA Generamos una versión en markdown plano de toda esta doc, pensada para que asistentes de código (Claude, ChatGPT, Cursor, Copilot, etc.) la consuman como contexto y puedan generar código que use el API correctamente. El punto de entrada es [`/llms.txt`](https://app.wasabil.com/llms.txt) — un índice liviano con lo mínimo para autenticarse y toda la doc dividida por sección: un archivo por tema, y uno por cada tipo de DTE. Así el asistente lee la sección que corresponde a la tarea (emitir una boleta son ~13 KB) en lugar de toda la doc junta. Pegale este mensaje a tu asistente para que conozca el API antes de pedirle código: ```text Vas a generar código contra la API de Wasabil (facturación electrónica chilena). Su documentación en markdown plano está en https://app.wasabil.com/llms.txt: ahí encontrás lo mínimo para autenticarse y toda la doc dividida por sección, con un archivo por cada tipo de documento tributario. ``` Los archivos siguen el estándar [llmstxt.org](https://llmstxt.org) y son markdown plano servido por HTTPS, así que cualquier IA con capacidad de fetch web los puede leer directamente. Cada uno es autocontenido: incluye la URL base, el header de auth y ejemplos completos de request y response. > **Siempre actualizada** > Los archivos se regeneran automáticamente con cada deploy, así que la IA siempre tiene la versión más reciente del API. ### Sandbox Para probar la integración sin afectar producción, usá el modo sandbox: entrá a [app.wasabil.com](https://app.wasabil.com), iniciá sesión o registrate, y creá una empresa con RUT `99999999-K`. No hay una URL distinta para sandbox — se distingue por el RUT de la empresa. Después entrá a [app.wasabil.com/api-tokens](https://app.wasabil.com/api-tokens) y creá un token. Con ese token podés crear documentos y emitirlos por API o manualmente desde la plataforma. Al enviar a emitir un documento en sandbox quedará en estado **Procesando**. Para simular un **Emitido** (como cuando en producción el SII acepta el documento), entrá a la pantalla de documentos y elegí *Acciones → Marcar como Emitido*. También podés marcarlo como *Fallido*. Estas opciones sólo aparecen en sandbox. Un documento emitido en sandbox simula todo lo de un documento real: folio, XML y PDF. ### Autenticación Cada empresa se identifica con su propio token, enviado en el header `Authorization`: ```http Authorization: Bearer {{token}} ``` El token se obtiene en [app.wasabil.com/api-tokens](https://app.wasabil.com/api-tokens). Cada token está vinculado a una sola empresa. > **OAuth 2.0** > Para integraciones que no son de una sola empresa (ej. MCP/Claude), Wasabil expone un authorization server OAuth 2.0. Ver la página **OAuth (MCP)**. ### Headers Para requests con body (POST / PUT) agregá el header de tipo de contenido: ```http Content-Type: application/json ``` ### Estructura de la respuesta Todos los endpoints responden con la misma estructura: ```json { "success": boolean, // indica que el request fue exitoso y no hubo errores ni validaciones "status": int, // idéntico al http status code "error": string, // mensaje de error, ej: "El documento es inexistente" "errorCode": string, // código del error, ej: "record_not_found" "validation": object, // errores puntuales por campo en casos de create/update // siempre acompañado de success false // ej: { "currency_id": "La moneda es inexistente", "details.0.price": "Debe ser mayor a cero" } "data": object | array // contenido de la respuesta cuando success es true } ``` ### Probar tu token — `GET` `/api/whoami` Endpoint liviano para validar tu token y conocer la identidad de la empresa asociada. Si el token es inválido, devuelve 401. Pegá tu token abajo y probalo directo desde acá para confirmar que la integración funciona. > *En la página web hay un bloque interactivo para probar este endpoint con tu token.* --- # Documentos ## Crear documento Cómo crear un documento tributario electrónico y emitirlo al SII. Cada tipo de DTE soportado tiene su propia sección con el body completo. ### Flujo de creación y emisión Hay tres formas de emitir un documento desde la API: - **Crear + emitir en un solo paso**: enviar `issue: true` en el body de `POST /api/documents`. El documento queda directamente en **Procesando**. - **Crear pendiente, emitir después**: `POST /api/documents` sin `issue`; el documento queda en **Pendiente**. Después lo emitís con `POST /api/documents/{uuid}/issue` (ver [Emitir un documento existente](https://app.wasabil.com/api-docs/documents-create#section-issue)). - **Crear en masa**: `POST /api/documents/bulk` con un array de hasta 100 documentos (ver [Crear documentos en masa](https://app.wasabil.com/api-docs/documents-create#section-bulk)). > **Emisión asíncrona** > La emisión es asíncrona — el documento queda en **Procesando** hasta que el SII responda. El estado final es **Emitido**, **Fallido** o vuelve a **Pendiente** según el caso. Lo recomendado es configurar un **webhook** con `notification_url` al crear el documento (ver [Webhooks](https://app.wasabil.com/api-docs/webhooks)). Como alternativa, polling sobre `GET /api/documents/{uuid}/status`. > **Antes de reintentar una creación** > Emitir consume un folio y no se puede deshacer. Si tu sistema reintenta llamadas (timeouts, colas, webhooks), mandá una `idempotency_key` para que un reintento no termine en dos DTE — ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). ### Idempotencia (evitar documentos duplicados) Crear un documento **no se puede deshacer**: se emite al SII y consume un folio. Si tu llamada se corta por timeout, o tu sistema reintenta, corrés riesgo de emitir el mismo DTE dos veces. Para evitarlo, mandá una `idempotency_key` en el body. La regla es simple: **una clave = un documento, para siempre**. La primera llamada crea el documento y queda atada a esa clave; cualquier repetición posterior con la misma clave devuelve **ese mismo documento** en vez de crear uno nuevo. La clave se mira junto con el **tipo de documento**, así que la misma clave en tipos distintos no se pisa: podés usar `orden-4821` para la factura y también para su nota de crédito, y cada una queda con su documento. ```json { "sii_document_type_id": 39, "issue": true, "idempotency_key": "orden-4821", "currency_symbol": "CLP", "receiver_input": "none", "details": [ { "name": "Producto", "price": 5000, "quantity": 2 } ] } // 1ra llamada → 200, crea la boleta y la emite // 2da llamada → 200, devuelve la MISMA boleta (mismo uuid, mismo folio) // no crea un documento nuevo ni vuelve a emitir ``` #### Cómo elegir la clave - Tiene que ser un identificador **estable** de la operación en tu sistema — el id de la orden, del pago, de la invoice — y el reintento tiene que mandar **exactamente el mismo valor**. - No sirve un UUID generado en cada intento: si cada llamada lleva una clave distinta, no hay nada que comparar y se crean dos documentos. - Si de una misma orden salen **dos documentos del mismo tipo** (por ejemplo dos notas de crédito parciales), cada uno necesita su propia clave: `orden-4821:nc-1`, `orden-4821:nc-2`. Entre tipos distintos no hace falta: eso ya lo separa Wasabil. - El alcance es tu empresa: dos empresas distintas pueden usar la misma clave sin pisarse. Máximo **191 caracteres**; más largo devuelve **400** con `invalid_idempotency_key`. - No puede empezar con `#wasabil:` — ese prefijo está reservado para los documentos que genera Wasabil por su cuenta (programados, integraciones de proveedores, cargas masivas). Si lo usás recibís **400** con `invalid_idempotency_key`. #### Qué pasa en cada caso | Situación | Respuesta | | --- | --- | | Clave nueva | Se crea el documento normalmente. | | Clave ya usada | 200 con el documento de la primera llamada, en el estado en que esté hoy. | | Dos llamadas simultáneas con la misma clave | Una crea el documento; la otra recibe 409 duplicate_request_in_progress. | | La creación falla (validación, etc.) | La clave queda libre: el reintento con la misma clave sí crea. | | Sin idempotency_key | Cada llamada crea un documento nuevo (comportamiento de siempre). | > **Una repetición no vuelve a emitir** > La respuesta de una repetición es el resultado de la primera llamada, **tal cual quedó**: aunque mandes `issue: true`, el documento no se vuelve a enviar a emisión. Si aquella primera llamada dejó el documento en **Pendiente** o **Fallido** y querés emitirlo, usá `POST /api/documents/{uuid}/issue` (ver [Emitir un documento existente](https://app.wasabil.com/api-docs/documents-create#section-issue)). > **La clave manda sobre el contenido** > No comparamos el body: si reusás una clave con datos distintos, igual te devolvemos el documento original y los datos nuevos se ignoran. Para un documento distinto, clave distinta. #### Errores y cómo manejarlos La regla que resuelve casi todos los casos: ante cualquier resultado que no puedas interpretar, **reintentá con la misma clave**. Nunca busques el documento por otra vía ni lo crees de nuevo sin clave — eso es exactamente lo que produce el duplicado que estás tratando de evitar. | Qué recibiste | Qué significa | Qué hacer | | --- | --- | --- | | Timeout / error de red / 5xx | No sabés si el documento llegó a crearse. | Reintentá con la misma clave. Si se había creado te lo devuelve; si no, lo crea. Es el caso para el que existe la clave. | | 409 duplicate_request_in_progress | Otra llamada tuya con esa misma clave está creando el documento en este momento. | Esperá y reintentá con la misma clave. No es un fallo definitivo y no cuenta como intento perdido. | | 400 invalid_idempotency_key | La clave no es válida: pasa los 191 caracteres, no es texto, o empieza con #wasabil:. | Error de tu lado. Corregí cómo la generás; reintentar igual va a fallar siempre. | | 400 con validation | El documento no pasó validación. No se creó nada y la clave quedó libre. | Corregí el body y reintentá con la misma clave. | | 200 | Tenés el documento. Puede ser el que se creó ahora o el de una llamada anterior con esa clave. | Nada especial: en los dos casos es el documento de esa operación. | > **El error más caro es el timeout mal manejado** > Si tu llamada corta por timeout, el documento **puede haberse creado igual** — el corte fue en la conexión, no necesariamente en Wasabil. Sin clave no tenés forma de saberlo y cualquier reintento arriesga un segundo DTE. Con clave, el reintento es seguro y es la respuesta correcta: no consultes primero para “ver si existe”, sólo reintentá. ```json { "success": false, "status": 409, "error": "Ya hay una request creando este mismo documento. Reintentá en unos minutos.", "errorCode": "duplicate_request_in_progress" } ``` ```json { "success": false, "status": 400, "error": "La clave de idempotencia no puede superar los 191 caracteres.", "errorCode": "invalid_idempotency_key" } ``` Para el 409 alcanza con reintentar espaciando los intentos (por ejemplo 5s, 30s, 2min): la otra llamada normalmente termina en segundos, y a partir de ahí recibís **200** con el documento. Una reserva que quede colgada porque el proceso que la tomó murió se libera sola a los **15 minutos**, así que ningún documento queda bloqueado para siempre. > `idempotency_key` aplica sólo a la **creación**. Actualizar un documento con `PUT` ya es repetible sin consecuencias, así que ahí el campo se ignora. ### Crear Factura de Venta — `POST` `/api/documents` Factura de Venta afecta. Para Factura Exenta usar `34` con el mismo body. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 33 para Factura de Venta. - `currency_symbol` *(string)* — CLP | USD | UF (default CLP). - `payment_method` *(string)* **(requerido)** — contado | credito - `price_includes_iva` *(boolean)* — Default false para facturas. - `client_id` *(int)* — Id del cliente (alternativa a receiver_*). - `receiver_rut` *(string)* — RUT del cliente. - `receiver_name` *(string)* — Razón social. - `receiver_address` *(string)* — Dirección. - `receiver_comuna` *(string)* — Comuna. - `receiver_city` *(string)* — Ciudad. - `receiver_giro` *(string)* — Giro tributario. - `receiver_contact` *(string (max 80))* — Contacto del receptor (teléfono, nombre, etc.). Se envía como Contacto en el DTE. - `receiver_email` *(string)* — Varios emails separados por ";". - `details` *(array)* **(requerido)** — Líneas del documento. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 33, "issue": true, "currency_symbol": "CLP", "payment_method": "contado", "client_id": 482, // o todos los campos del receiver: "receiver_rut": "12345678-9", "receiver_name": "Cliente SpA", "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_email": "facturacion@cliente.cl", "details": [ { "name": "Consultoría", "price": 10000, "description": "Horas mes de abril", "quantity": 8, "discount": 0 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ### Crear Factura Exenta — `POST` `/api/documents` Factura de Venta exenta de IVA. Body idéntico a Factura de Venta (33), cambiando `sii_document_type_id`. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 34 para Factura Exenta. - `currency_symbol` *(string)* — CLP | USD | UF. - `payment_method` *(string)* **(requerido)** — contado | credito - `client_id` *(int)* — Id del cliente. - `receiver_rut` *(string)* - `receiver_name` *(string)* - `receiver_address` *(string)* - `receiver_comuna` *(string)* - `receiver_city` *(string)* - `receiver_giro` *(string)* - `receiver_email` *(string)* — Separados por ";". - `details` *(array)* **(requerido)** — Líneas del documento. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 34, "issue": true, "currency_symbol": "CLP", "payment_method": "contado", "client_id": 482, "details": [ { "name": "Servicio exento", "price": 50000, "quantity": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 34, "sii_type": { "id": 34, "name": "Factura Exenta", "codigo_sii": "34" }, "current_nsubtotal": 50000, "current_nexempt": 50000, // ← se agrega el monto exento "current_niva": 0, // ← no aplica IVA "current_ntotal": 50000, // = nsubtotal (sin IVA) "sent_nsubtotal": 50000, "sent_nexempt": 50000, "sent_niva": 0, "sent_ntotal": 50000, "details": [ { "name": "Servicio exento", "price": 50000, "is_exempt": true, // ← todos los detalles "subtotal": 50000, "iva": 0, "total": 50000 } ] ``` ### Crear Boleta de Venta — `POST` `/api/documents` > La fecha siempre es hoy — no enviar `document_date`. Para Boleta Exenta usar `41` con el mismo body. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 39 para Boleta de Venta. - `currency_symbol` *(string)* — CLP | USD | UF. - `price_includes_iva` *(boolean)* — Default true para boletas. - `receiver_input` *(string)* **(requerido)** — client | rut | none — determina qué campos del receiver se aceptan. - `client_id` *(int)* — Requerido cuando receiver_input es "client". - `receiver_rut` *(string)* — Requerido cuando receiver_input es "rut". - `receiver_name` *(string)* — Requerido cuando receiver_input es "rut", opcional cuando es "none". - `receiver_email` *(string)* — Varios emails separados por ";". - `details` *(array)* **(requerido)** — Líneas del documento. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 39, "issue": true, "currency_symbol": "CLP", "receiver_input": "rut", "receiver_rut": "12345678-9", "receiver_name": "Cliente SpA", "receiver_email": "cliente@correo.cl", "details": [ { "name": "Producto", "price": 11900, "quantity": 1 } // price ya incluye IVA por default en boletas ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 39, "trx_subtype": 110, "sii_type": { "id": 39, "name": "Boleta", "codigo_sii": "39" }, // Cuando receiver_input es "rut": receiver_address/comuna/city/giro // quedan null porque la boleta sólo guarda rut + name. "client_id": null, "client_address_id": null, "client_giro_id": null, "client": null, "client_address": null, "client_giro": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_address": null, "receiver_comuna": null, "receiver_city": null, "receiver_giro": null, "payment_method": null, "invoice_reference": null ``` ### Crear Boleta Exenta — `POST` `/api/documents` Boleta de venta exenta de IVA. Body idéntico a Boleta (39). #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 41 para Boleta Exenta. - `currency_symbol` *(string)* — CLP | USD | UF. - `receiver_input` *(string)* **(requerido)** — client | rut | none - `client_id` *(int)* - `receiver_rut` *(string)* - `receiver_name` *(string)* - `receiver_email` *(string)* - `details` *(array)* **(requerido)** — Líneas del documento. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 41, "issue": true, "receiver_input": "none", "details": [ { "name": "Servicio exento", "price": 5000, "quantity": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 39, "trx_subtype": 110, "sii_type": { "id": 39, "name": "Boleta", "codigo_sii": "39" }, // Cuando receiver_input es "rut": receiver_address/comuna/city/giro // quedan null porque la boleta sólo guarda rut + name. "client_id": null, "client_address_id": null, "client_giro_id": null, "client": null, "client_address": null, "client_giro": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_address": null, "receiver_comuna": null, "receiver_city": null, "receiver_giro": null, "payment_method": null, "invoice_reference": null ``` ### Crear Factura de Exportación — `POST` `/api/documents` Sólo aplica para servicios, no venta de productos. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 110 para Factura de Exportación. - `currency_symbol` *(string)* — Ver listado de monedas. Las más comunes: USD, EUR, etc. - `exchange_rate` *(number)* — Opcional cuando la moneda es USD: si no se envía, Wasabil toma el TC según fecha del documento. - `client_id` *(int)* — Cliente extranjero existente; o todos los campos de receiver. - `receiver_rut` *(string)* - `receiver_name` *(string)* - `receiver_address` *(string)* - `receiver_comuna` *(string)* - `receiver_city` *(string)* - `receiver_giro` *(string)* - `receiver_email` *(string)* - `details` *(array)* **(requerido)** — Líneas del documento. Precio expresado en la moneda del documento (USD/EUR). Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `export_sale` *(object)* **(requerido)** — Datos de exportación. Describe los siguientes campos: - `service_type` *(int)* **(requerido)** — Tipo de servicio según SII. Por ahora sólo 3. - `country_iso` *(string (2))* **(requerido)** — Código ISO-2. Si se envía client_id, se toma del cliente. - `receiver_foreign_id_number` *(string)* — Identificador del receptor en su país. - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 110, "issue": true, "currency_symbol": "USD", "exchange_rate": 950.50, "client_id": 99, // o todos los campos de receiver: "receiver_rut": "55555555-5", "receiver_name": "Foreign Co.", "receiver_address": "1 Foreign St", "receiver_comuna": "Berlin", "receiver_city": "Berlin", "receiver_giro": "Tech services", "receiver_email": "ar@foreign.co", "details": [ { "name": "Servicio digital", "price": 100, "quantity": 1 } ], "export_sale": { "service_type": 3, // único indicador de servicio soportado "country_iso": "DE", "receiver_foreign_id_number": "DE123456789" } } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 110, "trx_subtype": 130, "currency_id": 2, // USD "sent_currency_id": 1, // siempre se envía al SII en CLP "exchange_rate": "950.50", "current_nsubtotal": 100, // en USD "current_nexempt": 100, // ← todo exento en exportación "current_niva": 0, "current_ntotal": 100, "sent_nsubtotal": 95050, // convertido a CLP "sent_nexempt": 95050, "sent_ntotal": 95050, "sii_type": { "id": 110, "name": "Factura de Exportación", "codigo_sii": "110" }, "currency": { "id": 2, "name": "Dólar Estadounidense", "symbol": "USD", "sii_id": "13", "xml_name": "DOLAR USA" }, "client": { "id": 111482, "rut": "55.555.555-5", "name": "Foreign Co.", "entity_type": "CF", // ← Cliente Foreign "country_iso": "17" // id interno del país }, "details": [ { "is_exempt": true, "iva": 0, "price": 100, // en moneda del documento "sent_price": 95050 // convertido a CLP } ], "export_sale": { "document": 90000000005959, "service_type": 3, "country_iso": "DE", "receiver_foreign_id_number": "DE123456789", "country": { "iso": "DE", "name": "Alemania", "sii_id": "563" } } ``` ### Crear Factura de Compra — `POST` `/api/documents` Factura recibida de un proveedor. Sólo permite 1 elemento en `details`. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 46 para Factura de Compra. - `currency_symbol` *(string)* — CLP | USD (default CLP). - `price_includes_iva` *(boolean)* — Si el price ya incluye IVA. Default false para facturas. - `supplier_id` *(int)* — Id del proveedor (alternativa a enviar todos los campos receiver_*). - `receiver_rut` *(string)* — RUT del proveedor. - `receiver_name` *(string)* — Razón social. - `receiver_address` *(string)* — Dirección. - `receiver_comuna` *(string)* — Comuna. - `receiver_city` *(string)* — Ciudad. - `receiver_giro` *(string)* — Giro tributario (default "Servicios digitales"). - `details` *(array)* **(requerido)** — Exactamente 1 línea. Cada item describe los siguientes campos: - `price` *(number)* **(requerido)** — Monto bruto de honorarios. - `description` *(string)* **(requerido)** — Glosa del servicio prestado. - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 46, "issue": true, "currency_symbol": "CLP", "price_includes_iva": false, "supplier_id": 277, // o todos los campos del receiver: "receiver_rut": "12345678-9", "receiver_name": "Proveedor SpA", "receiver_address": "Av Siempre Viva 123", "receiver_comuna": "Providencia", "receiver_city": "Santiago", "receiver_giro": "Servicios digitales", "details": [ { "price": 100000, "description": "Servicio de hosting abril 2025" } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 46, "trx_type": 2, // expense "trx_subtype": 200, "has_iva_retenido": true, // ← clave: IVA retenido, no se suma al total "current_nsubtotal": 100000, "current_niva": 19000, "current_ntotal": 100000, // = nsubtotal (IVA retenido) "sent_nsubtotal": 100000, "sent_niva": 19000, "sent_ntotal": 100000, "client_id": null, "supplier_id": 35713, "supplier": { "id": 35713, "uid": "1a7a9349-...", "rut": "76.086.428-5", "name": "Proveedor Sandbox SpA", "alias": null, "preload": false, "giro": "Servicios digitales", "address": "Av. Vitacura 4321", "comuna": "Vitacura", "city": "Santiago", "entity_type": "CL", "company_id": 2337, "keyname": null, "external_reference": null, "email": null }, "client": null, "client_address": null, "client_giro": null, "sii_type": { "id": 46, "name": "Factura de Compra", "codigo_sii": "46" }, "details": [ { "line_number": 1, "name": "Retención total genérica", // ← reemplazado por Wasabil "description": "Servicio de hosting abril 2025", "quantity": 1, "price": 100000, "subtotal": 100000, "iva": 19000, "total": 100000 // total = subtotal } ] ``` ### Crear Guía de Despacho — `POST` `/api/documents` Guía de despacho electrónica. Requiere un objeto `dispatch_guide` con el tipo de despacho y, opcionalmente, los datos de transporte. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 52 para Guía de Despacho. - `currency_symbol` *(string)* — CLP | USD | UF. - `client_id` *(int)* — Id del cliente. - `receiver_rut` *(string)* - `receiver_name` *(string)* - `receiver_address` *(string)* - `receiver_comuna` *(string)* - `receiver_city` *(string)* - `receiver_giro` *(string)* - `details` *(array)* **(requerido)** — Líneas del documento. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `dispatch_guide` *(object)* **(requerido)** — Datos del despacho y transporte. Ver DispatchTypes al final para los valores de dispatch_type_code. Describe los siguientes campos: - `dispatch_type_code` *(int (1-9))* **(requerido)** — Ver tabla DispatchTypes abajo. - `transport_id` *(int)* — Id de un transporte previamente creado (ver [Transportes](https://app.wasabil.com/api-docs/transports)). Autocompleta los demás `transport_*`. - `transport_rut` *(rut)* — RUT del transportista. - `transport_car_plate` *(string (max 30))* — Patente del vehículo. En el DTE va con un máximo de 8 caracteres. - `transport_driver_rut` *(rut)* — RUT del chofer. Sin él, el DTE sale sin los datos del chofer. - `transport_driver_name` *(string (max 30))* — Nombre del chofer. - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 52, "issue": true, "currency_symbol": "CLP", "client_id": 482, "details": [ { "name": "Producto", "price": 10000, "quantity": 1 } ], "dispatch_guide": { "dispatch_type_code": 1, // ver tabla DispatchTypes abajo (1-9) "transport_id": 12, // opcional. Id de un transporte existente — completa rut/patente/chofer // alternativamente, datos sueltos: "transport_rut": "76543210-K", "transport_car_plate": "ABCD12", "transport_driver_rut": "12345678-9", "transport_driver_name": "Juan Pérez" } } ``` #### DispatchTypes (dispatch_type_code) ```js { 1: 'Operación constituye venta', 2: 'Ventas por efectuar', 3: 'Consignaciones', 4: 'Entrega Gratuita', 5: 'Traslados internos', 6: 'Otros traslados no venta', 7: 'Guía de devolución', 8: 'Traslado para exportación (no venta)', 9: 'Venta para exportación' } ``` > **No es programable** > Las guías de despacho no soportan emisión programada — sólo emisión inmediata. #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 52, "trx_type": 3, // dispatch "trx_subtype": 300, "payment_method": null, "sii_type": { "id": 52, "name": "Guía de Despacho", "codigo_sii": "52" }, "dispatch_guide": { "document": "90000000005956", "dispatch_type_code": "1", "dispatch_type_name": "Operación constituye venta", "transport_id": null, "transport_rut": "76543210-K", "transport_car_plate": "ABCD12", "transport_driver_rut": "12345678-5", "transport_driver_name": "Juan Pérez", "transport": null // Si se pasó transport_id, "transport" trae el objeto completo del transporte } ``` ### Crear Nota de Crédito (anulación total) — `POST` `/api/documents` Anulación total del documento referenciado. La `code: 1` en la referencia es la que la convierte en anulación total. No requiere `details`. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 61 para Nota de Crédito (anulación total). - `references` *(array)* **(requerido)** — Exactamente 1 referencia al documento a anular, con code: 1. - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `code` *(int)* — 1 = anulación total · 3 = corrección de montos. - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 61, "issue": true, "references": [ { "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Devolución total de la operación", "code": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 61, "trx_subtype": 102, "trx_sign": -1, // ← clave: signo negativo "sii_type": { "id": 61, "name": "Nota de Crédito", "codigo_sii": "61" }, "references": [ { "document": "90000000005957", "line_number": 1, "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Devolución total", "code": 1 // ← 1 = anulación total } ] ``` ### Crear Nota de Crédito (anulación parcial / corrección de montos) — `POST` `/api/documents` Corrección de montos sobre el documento referenciado. La `code: 3` indica corrección de montos. Requiere `details` con los montos a acreditar. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 61 para Nota de Crédito (anulación parcial / corrección de montos). - `references` *(array)* **(requerido)** — Referencia con code: 3. - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `code` *(int)* — 1 = anulación total · 3 = corrección de montos. - `details` *(array)* **(requerido)** — Montos a acreditar. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 61, "issue": true, "references": [ { "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Ajuste por descuento posterior", "code": 3 } ], "details": [ { "name": "Descuento aplicado", "price": 5000, "quantity": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs anulación total: "trx_sign": 1, "references": [ { "document_type": "33", "folio": "1234", "code": 3 // ← 3 = corrección de montos } ] ``` ### Crear Nota de Crédito de Exportación — `POST` `/api/documents` Mismo formato que la nota de crédito (61). Si el documento referenciado NO fue emitido en Wasabil, hay que enviar también todos los datos que requiere una Factura de Exportación (receiver_*, export_sale, etc). #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 112 para Nota de Crédito de Exportación. - `references` *(array)* **(requerido)** — Referencia al documento de exportación a anular o corregir. - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `code` *(int)* — 1 = anulación total · 3 = corrección de montos. - `details` *(array)* — Requerido en anulación parcial (code: 3). Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 112, "issue": true, "references": [ { "document_type": "110", "folio": "55", "date": "2025-04-01", "reason": "Anulación total", "code": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 61, "trx_subtype": 102, "trx_sign": -1, // ← clave: signo negativo "sii_type": { "id": 61, "name": "Nota de Crédito", "codigo_sii": "61" }, "references": [ { "document": "90000000005957", "line_number": 1, "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Devolución total", "code": 1 // ← 1 = anulación total } ] ``` ### Crear Nota de Débito (anular nota de crédito) — `POST` `/api/documents` Reverso de una nota de crédito emitida por error. La referencia apunta a la NC con `code: 1`. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 56 para Nota de Débito (anular nota de crédito). - `references` *(array)* **(requerido)** — Referencia a la NC a anular (document_type 61 o 111). Enviar code: 1 en la referencia. - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `code` *(int)* — 1 = anulación total · 3 = corrección de montos. - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 56, "issue": true, "references": [ { "document_type": "61", "folio": "10", "date": "2025-04-05", "reason": "Reverso de nota de crédito emitida por error", "code": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 56, "trx_subtype": 101, "sii_type": { "id": 56, "name": "Nota de Débito", "codigo_sii": "56" }, "references": [ { "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Cobro adicional por servicios extra", "code": null // ← null = extender factura } ] ``` ### Crear Nota de Débito (extender factura) — `POST` `/api/documents` Aumenta el saldo de una factura ya emitida. Requiere details con los montos extra. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 56 para Nota de Débito (extender factura). - `references` *(array)* **(requerido)** — Referencia a la factura a extender (33, 34, 110). Sin código de anulación. - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `details` *(array)* **(requerido)** — Montos extra a agregar. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 56, "issue": true, "references": [ { "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Cobro adicional por servicios extra" } ], "details": [ { "name": "Servicio adicional", "price": 3000, "quantity": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 56, "trx_subtype": 101, "sii_type": { "id": 56, "name": "Nota de Débito", "codigo_sii": "56" }, "references": [ { "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Cobro adicional por servicios extra", "code": null // ← null = extender factura } ] ``` ### Crear Nota de Débito de Exportación — `POST` `/api/documents` Mismo formato que la nota de débito (56) pero para documentos de exportación. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 111 para Nota de Débito de Exportación. - `references` *(array)* **(requerido)** — Referencia a la factura de exportación a extender (110). - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `details` *(array)* — Requerido cuando extiende una factura. Cada item describe los siguientes campos: - `name` *(string (max 80))* **(requerido)** — Nombre / glosa de la línea. - `price` *(number)* **(requerido)** — Precio unitario en la moneda del documento. - `quantity` *(number)* **(requerido)** — Cantidad. Soporta decimales. - `description` *(string)* — Descripción larga (opcional). - `discount` *(number)* — Descuento por línea (porcentaje 0-100). Default 0. - `exempt` *(boolean)* — true para marcar la línea como exenta de IVA (sólo Factura Electrónica 33). - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 111, "issue": true, "references": [ { "document_type": "110", "folio": "55", "date": "2025-04-01", "reason": "Cobro adicional" } ], "details": [ { "name": "Servicio extra", "price": 50, "quantity": 1 } ] } ``` #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 56, "trx_subtype": 101, "sii_type": { "id": 56, "name": "Nota de Débito", "codigo_sii": "56" }, "references": [ { "document_type": "33", "folio": "1234", "date": "2025-04-01", "reason": "Cobro adicional por servicios extra", "code": null // ← null = extender factura } ] ``` ### Crear Boleta de Honorarios de Terceros — `POST` `/api/documents` Requiere configurar la password del SII de la empresa en [app.wasabil.com/third-honorarium-receipt/issue](https://app.wasabil.com/third-honorarium-receipt/issue). La emisión se hace contra el portal SII de honorarios — la retención (14.5%) se descuenta del precio bruto. #### Campos del request - `sii_document_type_id` *(int)* **(requerido)** — Siempre 200 para Boleta de Honorarios de Terceros. - `supplier_id` *(int)* — Proveedor local (no extranjero). O todos los campos receiver_*. - `receiver_rut` *(string)* - `receiver_name` *(string)* - `receiver_address` *(string)* - `receiver_comuna` *(string)* — Nombre de comuna específico según el formulario SII de BTE. - `receiver_city` *(string)* - `details` *(array)* **(requerido)** — Precio total bruto (con retención incluida) — Wasabil descuenta el 14.5%. Cada item describe los siguientes campos: - `price` *(number)* **(requerido)** — Monto bruto de honorarios. - `description` *(string)* **(requerido)** — Glosa del servicio prestado. - `invoice_reference` *(string)* — Identificador externo o referencial (nro de orden, código de invoice recibida, etc). - `issue` *(boolean)* — Si true, envía el documento a emisión inmediatamente después de crearlo (default false). - `idempotency_key` *(string (max 191))* — Identificador de **esta operación** en tu sistema. Si repetís la llamada con la misma clave no se crea un segundo documento: te devolvemos el que se creó la primera vez. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). - `document_date` *(string (YYYY-MM-DD))* — Fecha del documento (default: hoy). - `origin` *(string)* — Identifica el origen de la venta (URL/nombre de tienda online, sucursal, etc). - `references` *(array)* — Documentos o códigos referenciados (orden de compra, HES, etc). Cada item describe los siguientes campos: - `document_type` *(string (max 3))* **(requerido)** — Tipo SII (33, 61, etc) o código (801 OC, HES, etc). - `folio` *(string (max 18))* **(requerido)** — Folio del documento referenciado o código. - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha de la referencia. - `reason` *(string)* — Glosa o razón. - `notification_url` *(string)* — URL webhook para recibir notificaciones de cambios de estado. Ver [Webhooks](https://app.wasabil.com/api-docs/webhooks). Si tu empresa tiene un secreto generado, firmamos cada notificación y podés verificar que la enviamos nosotros — ver [Verificar la firma](https://app.wasabil.com/api-docs/webhooks#section-firma). - `notify_all` *(boolean)* — Por defecto sólo notifica documentos emitidos exitosamente. Enviá true para recibir todos los cambios. #### Ejemplo de body ```json { "sii_document_type_id": 200, "issue": true, "supplier_id": 14, // o todos los campos del receiver: "receiver_rut": "12345678-9", "receiver_name": "Proveedor", "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "details": [ { "price": 1000, // total bruto — Wasabil descuenta el 14.5% de retención "description": "Asesoría legal", "quantity": 1 } ] } ``` > **Control de duplicados** > Wasabil chequea contra las BTE recibidas (RUT + mes + monto total). Si hay coincidencia, el documento queda **Pendiente** con error code `document_duplicated`. Reintentando la emisión se procede igual — asumiendo evaluación manual. > **Anular una BTE de tercero** > Para anular una BTE emitida usá `POST /api/documents/{uuid}/annulate-third-honorarium-receipt` (ver [Anular boleta de honorarios de tercero](https://app.wasabil.com/api-docs/documents#section-annulate-bte)). #### Response 200 Devuelve el documento recién creado en estado **Pendiente (6)**. Si se envió `issue: true` pasa a **Procesando (2)** y eventualmente a **Emitido (3)** con folio y URLs de PDF/XML. ```json { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } ``` ```json // status Procesando (apenas se envía a emisión) "status_id": 2, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "display_error": "Esperando respuesta del SII", "issuer_id": 20, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, // status Emitido (SII aceptó / set-issued en sandbox) "status_id": 3, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "folio": "1", "display_error": null, "issuer_reference": "841782", // trackID del SII "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/{uuid}/document-pdf/{filename}", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-xml/{filename}", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/{uuid}/document-orig-xml/{filename}" ``` ```json // Diferencias vs Factura de Venta 33: "sii_document_type_id": 200, "trx_type": 2, // expense "trx_subtype": 220, "sii_type": { "id": 200, "name": "Boleta de honorarios de terceros", "codigo_sii": "200" }, // Cálculo: total bruto = 1.000.000 → retención 14,5% = 152.500 → neto 847.500 "current_nsubtotal": 847500, // neto (con retención ya descontada) "current_niva": 0, // no aplica IVA "current_hr_tax": 152500, // ← retención del 14,5% "current_ntotal": 1000000, // bruto (lo que firma el SII) "sent_nsubtotal": 847500, "sent_hr_tax": 152500, "sent_ntotal": 1000000, "client": null, "supplier": { "id": 35713, "uid": "9c1b8a40-...", "rut": "76.086.428-5", "name": "Proveedor BTE SpA", "alias": null, "preload": false, "giro": "Servicios", "address": "Av. Vitacura 4321", "comuna": "Vitacura", "city": "Santiago", "entity_type": "CL", "company_id": 2337, "keyname": null, "external_reference": null, "email": null }, "details": [ { "name": "Prestación de servicios", // ← reemplazado por Wasabil "price": 1000000, // ← total bruto que se envía "subtotal": 847500, "hr_tax": 152500, "total": 1000000 } ] ``` ### Emitir un documento existente — `POST` `/api/documents/{document|uuid}/issue` Envía a emisión un documento ya creado. Devuelve el documento con estado **Procesando**. > Sólo se puede emitir un documento en estado **Pendiente** o **Fallido**. Devuelve el documento **completo** (mismo shape que crear con `issue: true`) ya en estado **Procesando (2)**. Una vez que el SII responde, el documento pasa a **Emitido (3)** con folio, URLs de PDF y XML — ver "Campos que cambian al emitir" arriba. ```json { "success": true, "data": { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 2, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": 20, "error_code": null, "display_error": "Esperando respuesta del SII", "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 2, "name": { "es": "Procesando", "en": "Processing" }, "color": "info" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } } ``` ### Crear documentos en masa — `POST` `/api/documents/bulk` Crea hasta **100 documentos** en una sola llamada. Cada elemento del array `documents` tiene el mismo formato que el body individual. ```json { "documents": [ { "sii_document_type_id": 33, "issue": true, "currency_symbol": "CLP", "payment_method": "contado", "client_id": 482, "details": [ { "name": "Consultoría", "price": 10000, "quantity": 8 } ] }, { "sii_document_type_id": 39, "issue": true, "currency_symbol": "CLP", "receiver_input": "rut", "receiver_rut": "12345678-9", "receiver_name": "Cliente Boleta", "details": [ { "name": "Producto", "price": 5000, "quantity": 2 } ] } ] } ``` ```json { "success": true, "data": { "documents": { // por cada documento creado exitosamente, indexado por la posición en el array "0": { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } }, "1": { "success": true, "status": 200, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 39, "type_id": 1, "status_id": 6, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": null, "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor (el cliente se crea automáticamente si no existía) "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_contact": "+56 9 1234 5678", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // montos enviados al SII (siempre en CLP) "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión (todos null mientras está en Pendiente) "issuer_id": null, "error_code": null, "display_error": null, "issuer_reference": null, "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, // archivos (vacíos hasta que el documento queda Emitido) "has_document_pdf": false, "document_pdf_filename": null, "document_pdf_url": null, "has_document_xml": false, "document_xml_filename": null, "document_xml_url": null, "document_orig_xml_filename": null, "document_orig_xml_url": null, "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_status": null, "exchange_email": null, "exchange_email_sent": false, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "status_updated_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z", // ── relaciones ─────────────────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 6, "name": { "es": "Pendiente", "en": "Pending" }, "color": "warning" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": null, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], // sólo presente en guías de despacho (tipo 52) "dispatch_guide": null, // sólo presente en documentos de exportación (110, 111, 112) "export_sale": null, // notas de crédito/débito que afectan a este documento "notes_documents": [] } } }, "errors": { // por cada documento que falló, el mensaje "2": "El detalle es requerido" } } } ``` > Los índices de `documents` y `errors` son **strings** que corresponden a la posición del documento en el array de entrada. Esto permite saber cuál falló sin tener que matchear por contenido. > **Idempotencia en el bulk** > Cada elemento del array lleva su propia `idempotency_key` — no hay una clave para el lote entero. Así, si reenviás el lote completo porque algunos documentos fallaron, los que sí se crearon vuelven en `documents` sin duplicarse y sólo se crean los que faltaban. Ver [Idempotencia](https://app.wasabil.com/api-docs/documents-create#section-idempotencia). --- ## Documentos Listar, consultar, actualizar, eliminar y operar sobre documentos ya creados. Para crear y emitir nuevos documentos ver [Crear documento](https://app.wasabil.com/api-docs/documents-create). ### Listar documentos — `POST` `/api/documents/query` Lista paginada de documentos con filtros. Todos los filtros son opcionales y se pueden combinar. #### Paginación y orden - `page` *(int)* — Página (default 1). - `perPage` *(int)* — Items por página (default 10, máximo 250). - `sortBy` *(string)* — recentStatus | lastCreated | documentDate | folio (default recentStatus). Siempre descendente. #### Búsqueda libre El campo `search` hace búsqueda inteligente sobre nombre, RUT y emails del receptor, alias, `invoice_reference`, folio y document id. También acepta operadores con prefijo separados por espacios (máximo 10 tokens): - `search` *(string)* — Texto libre + operadores con prefijo. Ver lista de prefijos abajo. ```text folio:1234 → busca por folio exacto tipo:33 → filtra por sii_document_type_id ref:OC-9876 → match exacto contra invoice_reference id:202504000001 → busca por document id interno receptor:"Razón S" → match parcial en receiver_name (o rut si parece RUT) receptor:12345678-9 → match exacto en receiver_rut cot:55 → filtra por quote_id Las palabras sueltas (sin prefijo) se buscan en receiver_name, receiver_alias, receiver_email, extra_email e invoice_reference (parcial). Si parecen RUT se buscan en receiver_rut; si son numéricos en folio o document id. ``` #### Filtros por documento - `document` *(string)* — Document id interno. - `folio` *(int)* — Folio del documento emitido. - `siiDocumentTypeCode` *(string)* — Código SII (33, 34, 39, 41, 46, 52, 56, 61, 110, 111, 112, 200). - `siiDocumentTypeCodes` *(array)* — Varios códigos SII. - `trxType` *(int)* — 1 venta · 2 gasto · 3 guía de despacho. - `trxTypes` *(array)* — Varios trx types (ej. [1, 2]). - `received` *(boolean)* — true sólo documentos recibidos, false sólo emitidos. - `paymentMethod` *(string)* — contado | credito - `origin` *(string)* — Valor exacto del campo origin asignado al crear. #### Filtros por estado - `statusId` *(int)* — 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido. - `statusIds` *(array)* — Varios estados. - `exchangeStatus` *(string)* — PENDING | ERM | RFT. Estado de acuse de recibo (sólo para documentos recibidos). - `hasXml` *(boolean)* — true para documentos con XML disponible. - `hasPdf` *(boolean)* — true para documentos con PDF disponible. #### Filtros por fecha - `fromDocumentDate` *(string (YYYY-MM-DD))* — Desde esta fecha (inclusive). - `toDocumentDate` *(string (YYYY-MM-DD))* — Hasta esta fecha (inclusive). #### Filtros por contraparte - `clientId` *(int)* — Id del cliente. - `clientRut` *(string)* — RUT exacto. - `clientName` *(string)* — Match parcial por nombre. - `supplierId` *(int)* — Id del proveedor. - `supplierRut` *(string)* — RUT exacto. - `supplierName` *(string)* — Match parcial por nombre. - `hasSupplier` *(boolean)* — true si el documento tiene un supplier_id asociado. #### Filtros por metafields - `metafields` *(array<{ key, value? }>)* — Filtra por presencia o valor de metafields. Cada item con { key, value? } — si se omite value filtra sólo por presencia. #### Response 200 ```json { "success": true, "data": { "list": { "items": [ { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 3, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": "1", "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original del documento "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // los campos sent_* son los montos enviados al SII en CLP "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión "issuer_id": 20, "error_code": null, "display_error": null, "issuer_reference": "841782", // trackID del SII "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, "status_updated_at": "2026-05-12T22:59:26.000000Z", // archivos "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-pdf/OC-9876_1_33_90000000005953.pdf", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-xml/OC-9876_1_33_90000000005953.xml", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-orig-xml/OC-9876_1_33_90000000005953.orig.xml", "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_email": null, "exchange_email_sent": false, "exchange_status": null, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "updated_at": "2026-05-12T22:59:26.000000Z", // ── relaciones (basic scope) ──────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [] } ], "total": 1247, // total de documentos que matchean (para paginar) "lastPage": 50 // cantidad de páginas } } } ``` > **Cambiar el set de campos devuelto** > Por defecto se devuelve un set compacto (`basic`) de cada documento. Para traer relaciones extra (`client`, `supplier`, `currency`, `status`, `sii_type`, etc.) agregá la query string `?with=client,supplier,currency,status,sii_type`. ### Obtener un documento — `GET` `/api/documents/{document|uuid}` Devuelve el documento por UUID o por su `document` id interno (formato `20250400001335`). Devuelve el documento expandido (incluye details, references, client/supplier, status, sii_type, currency). > **Alternativa por folio** > `GET /api/documents/by-folio/{siiDocumentTypeId}/{folio}` — notar que el parámetro es `siiDocumentTypeId` (id interno) no el código SII. **404** si no existe o no pertenece a la empresa del token. ```json { "success": true, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 3, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": "1", "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original del documento "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // los campos sent_* son los montos enviados al SII en CLP "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión "issuer_id": 20, "error_code": null, "display_error": null, "issuer_reference": "841782", // trackID del SII "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, "status_updated_at": "2026-05-12T22:59:26.000000Z", // archivos "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-pdf/OC-9876_1_33_90000000005953.pdf", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-xml/OC-9876_1_33_90000000005953.xml", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-orig-xml/OC-9876_1_33_90000000005953.orig.xml", "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_email": null, "exchange_email_sent": false, "exchange_status": null, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "updated_at": "2026-05-12T22:59:26.000000Z", // ── relaciones (basic scope) ──────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], // ── scope expanded (sólo en GET por uuid y respuestas de create/update) ── "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], "dispatch_guide": null, // sólo presente en guías de despacho (tipo 52) "export_sale": null, // sólo presente en documentos de exportación (110, 111, 112) "notes_documents": [] // notas de crédito / débito que afectan a este documento (si las hay) } } ``` ### Saldo del documento por folio — `GET` `/api/documents/by-folio/{siiDocumentTypeId}/{folio}/balance` Saldo del documento = monto original menos las notas de crédito emitidas, más las notas de débito emitidas. Sólo aplica a documentos emitidos (`status_id 3`) y no recibidos. ```json { "success": true, "data": { "balance": { "subtotal": 80000, "iva": 15200, "total": 95200 // null si el documento no es elegible (recibido, no emitido, sin folio, etc.) }, "document": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 3, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": "1", "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original del documento "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // los campos sent_* son los montos enviados al SII en CLP "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión "issuer_id": 20, "error_code": null, "display_error": null, "issuer_reference": "841782", // trackID del SII "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, "status_updated_at": "2026-05-12T22:59:26.000000Z", // archivos "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-pdf/OC-9876_1_33_90000000005953.pdf", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-xml/OC-9876_1_33_90000000005953.xml", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-orig-xml/OC-9876_1_33_90000000005953.orig.xml", "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_email": null, "exchange_email_sent": false, "exchange_status": null, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "updated_at": "2026-05-12T22:59:26.000000Z", // ── relaciones (basic scope) ──────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [], // ── scope expanded (sólo en GET por uuid y respuestas de create/update) ── "details": [ { "document": 90000000005953, "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "code": null, "external_id": null, "quantity": 8, "price": 10000, "discount": 0, "is_exempt": false, "subtotal": 80000, "iva": 15200, "hr_tax": 0, "total": 95200, "sent_price": 10000, "sent_subtotal": 80000, "sent_iva": 15200, "sent_hr_tax": 0, "sent_total": 95200, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" } ], "global_details": [], "dispatch_guide": null, // sólo presente en guías de despacho (tipo 52) "export_sale": null, // sólo presente en documentos de exportación (110, 111, 112) "notes_documents": [] // notas de crédito / débito que afectan a este documento (si las hay) } } } ``` ### Obtener estado — `GET` `/api/documents/{document|uuid}/status` Estado actual del documento. Endpoint liviano — devuelve sólo los campos relevantes para hacer polling. Sin embargo, lo recomendado es **configurar un webhook** al crear el documento (`notification_url`) y evitar polling. ```json { "success": true, "data": { "uuid": "2b266ebc-cf3e-4446-b6b8-68887ddd88b8", "document": "20250400001335", "status_id": int, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "status_name": "Pendiente", "error_code": string, // ver lista de error codes en Referencia "display_error": string, // texto adicional del error, si lo hay "issuer_reference": string, // trackID del SII cuando se usó la API de facturador de mercado "invoice_reference": string, "folio": int, // sólo presente cuando status_id es 3 (Emitido) "pdf_url": string, // URL autenticada para descargar el PDF (requiere el mismo Bearer) "xml_url": string, "orig_xml_url": string, "public_pdf_url": string, // URL pública sin auth (si la empresa habilitó URLs públicas) "public_xml_url": string, "public_orig_xml_url": string } } ``` ### Obtener PDF — `GET` `/api/documents/{document|uuid}/pdf` Devuelve el PDF del documento directamente como `application/pdf`. Disponible cuando `status_id` es **Emitido (3)**. **404** si el archivo no existe (documento aún no emitido). ### Obtener XML original — `GET` `/api/documents/{document|uuid}/orig-xml` XML **firmado y enviado al SII**. Es la versión canónica del DTE — la que usaría el SII en caso de fiscalización. Devuelto como texto (`application/xml`). ### Obtener XML (para el receptor) — `GET` `/api/documents/{document|uuid}/xml` Mismo XML firmado, pero con el **RUT del receptor real** en la carátula del intercambio en lugar del que se envió al SII. Es la versión que se le entrega al receptor del documento (cuando se envía por intercambio o cuando el receptor lo descarga). Devuelto como texto (`application/xml`). > En la mayoría de los casos coinciden. La diferencia aparece típicamente en boletas, recibos a consumidor final o documentos con RUT genérico, donde lo enviado al SII (`orig-xml`) lleva un RUT distinto al del receptor declarado en el documento. ### Generar PDF de cotización — `GET` `/api/documents/{document|uuid}/quote-pdf` Genera un PDF de cotización para un documento — sirve para enviar un presupuesto antes de emitir. No es un DTE, no se envía al SII. Asigna un `quote_id` al documento si no lo tenía. Aplica también a documentos en estado **Pendiente**. ```json { "success": true, "data": { "pdf_base64": string // PDF codificado en base64 (decodificar para guardarlo en disco) } } ``` ### Actualizar documento — `PUT` `/api/documents/{document|uuid}` Acepta el mismo body que la creación. Pasar `issue: true` dispara la emisión inmediatamente después de actualizar. > Sólo se puede actualizar en estado **Pendiente** o **Fallido**. ```json { "success": true, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 3, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": "1", "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original del documento "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // los campos sent_* son los montos enviados al SII en CLP "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión "issuer_id": 20, "error_code": null, "display_error": null, "issuer_reference": "841782", // trackID del SII "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, "status_updated_at": "2026-05-12T22:59:26.000000Z", // archivos "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-pdf/OC-9876_1_33_90000000005953.pdf", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-xml/OC-9876_1_33_90000000005953.xml", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-orig-xml/OC-9876_1_33_90000000005953.orig.xml", "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_email": null, "exchange_email_sent": false, "exchange_status": null, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "updated_at": "2026-05-12T22:59:26.000000Z", // ── relaciones (basic scope) ──────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [] } // mismo formato que "Obtener un documento" } ``` ### Eliminar documento — `DELETE` `/api/documents/{document|uuid}` > Sólo se puede eliminar en estado **Pendiente** o **Fallido**. Una vez emitido no se elimina — para anular ver [Anular totalmente](https://app.wasabil.com/api-docs/documents#section-full-annulment). ```json { "success": true } ``` ### Anular totalmente (genera nota de crédito) — `POST` `/api/documents/{document|uuid}/full-annulment` Crea una nota de crédito de anulación total contra el documento objetivo y opcionalmente la emite. #### Body - `reason` *(string)* — Glosa para la nota de crédito. - `useTargetDate` *(boolean)* — Si true, usa la misma fecha que el documento original. Sino se usa documentDate o la fecha de hoy. - `documentDate` *(string (YYYY-MM-DD))* — Fecha de la nota de crédito (default hoy si no se pasa useTargetDate). - `issue` *(boolean)* — Si true, emite la nota de crédito inmediatamente. ```json { "success": true, "data": { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "type_id": 1, "status_id": 3, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "trx_type": 1, // 1 sale · 2 expense · 3 dispatch "trx_subtype": 100, "trx_sign": 1, // -1 para NC de anulación total "sandbox": true, "received": false, "collected": false, "has_iva_retenido": false, "document_date": "2026-05-12", "folio": "1", "payment_method": "contado", "send_email": false, // empresa emisora "company_id": 2337, "company_address_id": 2354, "company_giro_id": 2714, // receptor "client_id": 111481, "client_address_id": 111628, "client_giro_id": 120019, "supplier_id": null, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente Sandbox SpA", "receiver_alias": null, "receiver_address": "Av. Apoquindo 1234", "receiver_comuna": "Las Condes", "receiver_city": "Santiago", "receiver_giro": "Comercio al por menor", "receiver_email": "cliente@sandbox.local", "extra_email": null, // montos en la moneda original del documento "currency_id": 1, "exchange_rate": "1.00", "current_nsubtotal": 80000, "current_nexempt": 0, "current_niva": 15200, "current_hr_tax": 0, "current_ntotal": 95200, // los campos sent_* son los montos enviados al SII en CLP "sent_currency_id": 1, "sent_nsubtotal": 80000, "sent_nexempt": 0, "sent_niva": 15200, "sent_hr_tax": 0, "sent_ntotal": 95200, // emisión "issuer_id": 20, "error_code": null, "display_error": null, "issuer_reference": "841782", // trackID del SII "invoice_reference": "OC-9876", "auto_issue": 0, "user_can_retry": false, "status_updated_at": "2026-05-12T22:59:26.000000Z", // archivos "has_document_pdf": true, "document_pdf_filename": "OC-9876_1_33_90000000005953.pdf", "document_pdf_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-pdf/OC-9876_1_33_90000000005953.pdf", "has_document_xml": true, "document_xml_filename": "OC-9876_1_33_90000000005953.xml", "document_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-xml/OC-9876_1_33_90000000005953.xml", "document_orig_xml_filename": "OC-9876_1_33_90000000005953.orig.xml", "document_orig_xml_url": "https://api.wasabil.com/api/documents/36cdebc2-79b7-402f-ac91-1534d003a91b/document-orig-xml/OC-9876_1_33_90000000005953.orig.xml", "has_invoice_file": false, "invoice_filename": null, "invoice_file_url": null, // intercambio (sólo aplica a documentos recibidos) "exchange_email": null, "exchange_email_sent": false, "exchange_status": null, // otros "origin": null, "origin_platform": null, "channel": null, "scheduled_ended": false, "quote_id": null, "updated_at": "2026-05-12T22:59:26.000000Z", // ── relaciones (basic scope) ──────────────────────────────── "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP", "sii_id": "200", "xml_name": "PESO CL" }, "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "type": { "id": 1, "name": "Manual", "color": "primary" }, "situation": { "id": 1, "name": { "es": "Activo", "en": "Active" }, "color": "primary" }, "issuer": { "id": 20, "keyname": "Sandbox", "name": "Sandbox", "manager_name": "Sandbox" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "client": { "id": 111481, "uid": "32463d57-b935-47a7-9a28-913bf123238c", "company_id": 2337, "rut": "76.086.428-5", "name": "Cliente Sandbox SpA", "alias": null, "email": "cliente@sandbox.local", "entity_type": "CL", "country_iso": null, "foreign_id_number": null, "external_reference": null, "favorite": false, "exchange_email": null, "exchange_email_checked_at": null, "created_at": "2026-05-12T22:57:23.000000Z", "updated_at": "2026-05-12T22:57:23.000000Z" }, "client_address": { "id": 111628, "client_id": 111481, "address": "Av. Apoquindo 1234", "default": true, "comuna": "Las Condes", "city": "Santiago" }, "client_giro": { "id": 120019, "client_id": 111481, "name": "Comercio al por menor", "default": true }, "supplier": null, "company_address": { "id": 2354, "company_id": 2337, "name": "Domicilio principal", "default": true, "address": "Av. Providencia 2222", "comuna": "Providencia", "city": "Santiago" }, "company_giro": { "id": 2714, "company_id": 2337, "name": "Servicios profesionales", "default": true }, "references": [ { "document": "90000000005953", "line_number": 1, "document_type": "801", "folio": "OC-9876", "date": "2025-04-08", "reason": "Orden de compra", "code": null } ], "metafields": [] } // la nota de crédito creada — mismo formato que "Obtener un documento". // Si no se pasó issue:true, queda en status Pendiente (status_id: 6) y sin folio. } ``` ### Anular boleta de honorarios de tercero — `POST` `/api/documents/{document|uuid}/annulate-third-honorarium-receipt` Acción específica para anular una BTE (código SII `200`) ya emitida. No usa nota de crédito — se llama directamente al flujo de anulación de honorarios del SII (vía portal). Requiere la password SII de la empresa configurada. > Sólo aplica al documento tipo 200 ya emitido. ```json { "success": true } ``` ### Acuse de recibo / Rechazo de documento recibido — `POST` `/api/documents/{document|uuid}/exchange-status/{exchangeStatus}` Marca un documento **recibido** como **aceptado** (`ERM`) o **rechazado** (`RFT`). El estado se envía al SII y queda registrado en el intercambio. > **Alternativa por folio** > `PUT /api/documents/{senderRut}/{siiDocumentTypeCode}/{folio}/exchange-status/{exchangeStatus}` ```json { "success": true, "data": { "exchange_status": "ERM" // devuelve el estado que quedó aplicado: // - si ya tenía uno previo, devuelve el previo // - si el SII ya cerró el plazo de 8 días para rechazar, devuelve ERM } } ``` ### Listar metafields del documento — `GET` `/api/documents/{document|uuid}/metafields` Devuelve los metafields asignados al documento. ```json { "success": true, "data": [ { "document": "20250400001335", "key": "external_id", "value": "ORD-9876" } ] } ``` ### Asignar / actualizar metafield — `PUT` `/api/documents/{document|uuid}/metafields/{key}` Setea (o actualiza) el valor de un metafield. La `key` debe existir como definición (ver [Metafields](https://app.wasabil.com/api-docs/metafields)). - `value` *(string | number | boolean)* **(requerido)** — Valor del metafield. El tipo debe matchear la definición. ```json { "success": true, "data": [ // misma lista que devuelve "Listar metafields del documento" { "document": "20250400001335", "key": "external_id", "value": "ORD-9876" }, { "document": "20250400001335", "key": "centro_de_costos", "value": "ventas-online" } ] } ``` ### Quitar metafield — `DELETE` `/api/documents/{document|uuid}/metafields/{key}` Elimina el metafield del documento. ```json { "success": true } ``` ### Marcar como Emitido (sandbox) — `POST` `/api/sandbox-documents/{document|uuid}/set-issued` Sólo disponible en sandbox (empresa con RUT 99999999-K). Simula la aceptación del SII para un documento que estaba en Procesando. - `folio` *(int)* — Folio simulado (si no se envía, Wasabil asigna uno). - `documentPdf` *(string)* — PDF en base64 a usar como simulación (opcional). Devuelve el documento ya en estado Emitido. ### Marcar como Fallido (sandbox) — `POST` `/api/sandbox-documents/{document|uuid}/set-failed` Sólo en sandbox. Simula que el SII rechazó el documento — queda en estado Fallido. --- ## Webhooks Cómo recibir notificaciones desde Wasabil cuando un documento cambia de estado. Podés configurarlos por documento (notification_url) o de forma global por empresa. ### Cómo funcionan Wasabil envía un POST a tu URL cada vez que un documento cambia de estado. Hay dos formas de configurarlo: - **Por documento:** enviando el campo `notification_url` al crear un documento. Aplica sólo a ese documento. - **Globales por empresa:** webhooks definidos una sola vez a nivel empresa (desde el panel o vía API) que aplican a *todos* los documentos, sin tener que setear `notification_url` en cada uno. Permiten headers personalizados y filtrar por tipo de documento. En ambos casos el body es el mismo: el documento **completo** (el mismo objeto que devuelve `GET /api/documents/{uuid}`) con todas sus relaciones. Los campos más relevantes a chequear son `status_id` (3=Emitido, 4=Fallido), `folio`, `document_pdf_url` y los de error. ```http POST {{webhook_url}} Content-Type: application/json { "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "document": 90000000005953, "sii_document_type_id": 33, "status_id": 3, // 6 Pendiente · 2 Procesando · 3 Emitido · 4 Fallido "folio": "1234", "document_date": "2025-04-09", "company_id": 2337, "client_id": 111481, "receiver_rut": "76.086.428-5", "receiver_name": "Cliente SpA", "currency_id": 1, "current_nsubtotal": 80000, "current_niva": 15200, "current_ntotal": 95200, "sent_nsubtotal": 80000, "sent_niva": 15200, "sent_ntotal": 95200, "error_code": null, "display_error": null, "issuer_reference": "...", "invoice_reference": "OC-9876", "has_document_pdf": true, "document_pdf_url": "https://.../documento.pdf", "document_xml_url": "https://.../documento.xml", "document_orig_xml_url": "https://.../documento_orig.xml", "status_updated_at": "2025-04-09T10:31:15.000000Z", "updated_at": "2025-04-09T10:31:15.000000Z", "status": { "id": 3, "name": { "es": "Emitido", "en": "Issued" }, "color": "success" }, "sii_type": { "id": 33, "name": "Factura de Venta", "codigo_sii": "33" }, "currency": { "id": 1, "name": "Peso Chileno", "symbol": "CLP" }, "client": { "id": 111481, "rut": "76.086.428-5", "name": "Cliente SpA" }, "details": [ { "line_number": 1, "name": "Consultoría", "description": "Horas mes de abril", "quantity": 8, "price": 10000, "subtotal": 80000, "iva": 15200, "total": 95200 } ], "references": [] } ``` ### Webhooks globales por empresa Los webhooks globales se configuran una sola vez por empresa y reciben las notificaciones de todos tus documentos. Podés gestionarlos desde [app.wasabil.com/webhooks](https://app.wasabil.com/webhooks) o vía API con los endpoints de abajo. - `url` *(string)* **(requerido)** — URL a la que se enviará el POST con el documento. - `headers` *(object)* — Headers HTTP a incluir en cada POST, como pares clave-valor. Útil para autenticar tu endpoint (ej: { "Authorization": "Bearer mi-token" }). - `notify_all` *(boolean)* — Si es true, notifica todos los cambios de estado y de error. Si es false (default), sólo cuando el documento se emite. - `document_categories` *(string[])* — Filtro por tipo de documento. Si se omite o va vacío, se notifican TODOS los documentos. Ver las claves válidas más abajo. - `refname` *(string)* — Nombre opcional para identificar el webhook en el panel. - `enabled` *(boolean)* — Indica si el webhook está activo. Se crea siempre en true; se activa/desactiva con el endpoint dedicado. Mientras esté en false no se envían notificaciones. > **Mismo motor de envío** > Los webhooks globales usan el mismo body, política de reintentos y semántica de `notify_all` que los webhooks por documento (ver las secciones de abajo). #### Categorías disponibles para document_categories Si no especificás ninguna, el webhook recibe todos los documentos. Cada categoría incluye el documento base y sus notas de crédito/débito relacionadas. | Grupo | Clave | Incluye | | --- | --- | --- | | Ventas | sale_invoice | Facturas de Venta emitidas | | Ventas | sale_receipt | Boletas de Venta emitidas | | Ventas | export_invoice | Facturas de Exportación emitidas | | Gastos | purchase_invoice | Facturas de compra emitidas | | Gastos | received_sale | Facturas de venta recibidas | | Gastos | third_honorarium | Boletas de honorarios de tercero emitidas | | Gastos | received_honorarium | Boletas de honorarios recibidas | | Guías de despacho | dispatch_guide | Guías de despacho emitidas | ### Listar webhooks — `GET` `/api/webhooks` Devuelve los webhooks globales de la empresa. ```json [ { "id": 12, "company_id": 2337, "refname": "Notificaciones ERP", "url": "https://mi-erp.com/webhooks/wasabil", "headers": { "Authorization": "Bearer mi-token" }, "notify_all": false, "document_categories": ["sale_invoice", "sale_receipt"], "enabled": true, "created_at": "2026-06-04T12:00:00.000000Z" } ] ``` ### Crear webhook — `POST` `/api/webhooks` #### Body - `url` *(string)* **(requerido)** — URL del webhook (https). - `headers` *(object)* — Pares clave-valor a enviar como headers HTTP. - `notify_all` *(boolean)* — Notificar todos los estados (true) o sólo emitido (false, default). - `document_categories` *(string[])* — Claves de tipos de documento a notificar. Vacío = todos. - `refname` *(string)* — Nombre opcional. ```json POST /api/webhooks Content-Type: application/json { "refname": "Notificaciones ERP", "url": "https://mi-erp.com/webhooks/wasabil", "headers": { "Authorization": "Bearer mi-token" }, "notify_all": false, "document_categories": ["sale_invoice", "sale_receipt"] } ``` ### Activar / desactivar webhook — `PUT` `/api/webhooks/{id}/enabled` Activa o desactiva el webhook. Mientras esté desactivado (`enabled: false`) no se le envían notificaciones, pero se conserva su configuración. Los webhooks se crean siempre activos. #### Body - `enabled` *(boolean)* **(requerido)** — true para activar, false para desactivar. ```json PUT /api/webhooks/12/enabled Content-Type: application/json { "enabled": false } ``` ### Eliminar webhook — `DELETE` `/api/webhooks/{id}` Elimina el webhook. Dejamos de enviar notificaciones a esa URL. No hay endpoint de actualización: para cambiar un webhook, eliminalo y creá uno nuevo. ### Verificar la firma (HMAC) Tu endpoint es una URL pública: cualquiera que la conozca puede hacerle un POST haciéndose pasar por Wasabil. Para que puedas descartar eso, firmamos cada notificación con un **secreto de tu empresa** y mandamos el resultado en el header `X-Wasabil-Signature`. El secreto **nunca viaja** — esa es la diferencia con poner un token en un header. Un token viaja en cada request y sirve para siempre si alguien lo obtiene; una firma sólo sirve para el cuerpo exacto que la acompaña. Es **uno solo por empresa** y vale tanto para los webhooks de documentos como para los de catálogo. > **Dónde generarlo** > En [app.wasabil.com/webhooks](https://app.wasabil.com/webhooks), debajo de la lista de webhooks. Ahí lo generás, lo consultás cuando lo necesites y lo regenerás si hace falta. Se pide permiso de administrador de la empresa. ```http X-Wasabil-Signature: t=1786142050,v1=5f8e...c31a // t = momento del envío (unix timestamp, en segundos) // v1 = HMAC-SHA256 en hexadecimal de ".", con tu secreto como clave ``` #### Cómo verificarla - Tomá el **cuerpo crudo** del request, tal como llegó, *antes* de parsearlo. - Calculá `HMAC-SHA256(secreto, "{t}.{cuerpo}")` y compará con `v1`, usando una comparación en **tiempo constante**. - Rechazá lo que tenga un `t` viejo (5 minutos es un buen límite): sin ese chequeo, alguien que haya capturado una notificación puede reenviarla más tarde y la firma seguiría siendo válida. ```js const crypto = require('crypto') // NOTE: the RAW body. With express.json() it arrives already parsed as an object, // and re-serializing it changes the key order, so the signature never matches. app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => { const header = req.get('X-Wasabil-Signature') || '' const parts = Object.fromEntries(header.split(',').map((p) => p.split('='))) const rawBody = req.body.toString('utf8') const expected = crypto .createHmac('sha256', process.env.WASABIL_WEBHOOK_SECRET) .update(parts.t + '.' + rawBody) .digest('hex') const validSignature = parts.v1 && parts.v1.length === expected.length && crypto.timingSafeEqual(Buffer.from(parts.v1), Buffer.from(expected)) const recent = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300 if (!validSignature || !recent) return res.sendStatus(401) const document = JSON.parse(rawBody) // ... your logic res.sendStatus(200) }) ``` ```php // The raw body, not $_POST. $raw = file_get_contents('php://input'); parse_str(str_replace(',', '&', $_SERVER['HTTP_X_WASABIL_SIGNATURE'] ?? ''), $parts); $expected = hash_hmac('sha256', $parts['t'] . '.' . $raw, getenv('WASABIL_WEBHOOK_SECRET')); $validSignature = isset($parts['v1']) && hash_equals($expected, $parts['v1']); $recent = abs(time() - (int) ($parts['t'] ?? 0)) < 300; if (!$validSignature || !$recent) { http_response_code(401); exit; } $document = json_decode($raw, true); // ... your logic http_response_code(200); ``` ```python import hmac, hashlib, time, json, os from flask import request, abort @app.post('/webhook') def webhook(): # The raw bytes, NOT request.json raw = request.get_data() header = request.headers.get('X-Wasabil-Signature', '') parts = dict(p.split('=') for p in header.split(',') if '=' in p) expected = hmac.new( os.environ['WASABIL_WEBHOOK_SECRET'].encode(), parts.get('t', '').encode() + b'.' + raw, hashlib.sha256, ).hexdigest() valid_signature = hmac.compare_digest(expected, parts.get('v1', '')) recent = abs(time.time() - int(parts.get('t', 0))) < 300 if not (valid_signature and recent): abort(401) document = json.loads(raw) # ... your logic return '', 200 ``` > **Si la firma no valida, respondé con error** > No devuelvas **200** descartando la notificación en silencio: para nosotros un 200 significa entregada y no la reintentamos. Respondé **401** y entra en la política de reintentos, que te da unos días de margen — justo lo que necesitás si la firma falla porque acabás de regenerar el secreto y todavía no lo actualizaste. > **Compatibilidad** > Si tu empresa no tiene secreto generado, las notificaciones salen **exactamente como antes**, sin el header. Generarlo no cambia nada de lo que ya tenés configurado — sólo agrega `X-Wasabil-Signature`, y verificarlo o no es decisión tuya. Los headers personalizados del webhook global siguen funcionando en paralelo. ### Reintentos > **Política de reintentos** > Si tu webhook devuelve status 200, la notificación se da por finalizada. Si no, se reintenta: > - 3 veces, una vez cada hora. > - Luego 7 veces, una vez cada 12 horas. > Después de 10 intentos fallidos, se abandona. ### ¿Qué notifica por defecto? > Por defecto sólo se notifican documentos emitidos exitosamente. Para recibir *todos* los cambios de estado y cambios en `error_code` / `display_error`, enviá `notify_all: true` (al crear el documento o en el webhook global). --- # Receptores y emisores ## Empresa Datos de la empresa asociada al token, direcciones, giros tributarios y lookups auxiliares (datos públicos SII, monedas, países, tipo de cambio). ### Datos de la empresa actual — `GET` `/api/my-company` Devuelve los datos completos de la empresa asociada al token, incluyendo direcciones y giros. ```json { "success": true, "data": { "id": 316, "uid": "a1b2c3d4-...", "name": "Mi Empresa SpA", "rut": "76.123.456-7", "alias": null, "giro": "Servicios de consultoría", "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "email": "facturacion@empresa.cl", "created_at": "...", "addresses": [ { "id": 12, "name": "Casa Matriz", "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true } ], "giros": [ { "id": 5, "name": "Servicios de consultoría", "default": true } ] } } ``` ### Crear dirección — `POST` `/api/my-company/addresses` Crea una dirección para tu empresa. Útil para empresas con múltiples sucursales. - `name` *(string (max 255))* **(requerido)** — Nombre interno (ej. "Sucursal Centro"). Único por empresa. - `address` *(string (max 255))* **(requerido)** — Dirección. - `comuna` *(string (max 255))* **(requerido)** — Comuna. - `city` *(string (max 255))* **(requerido)** — Ciudad. > La primera dirección creada queda como default automáticamente. ```json { "success": true, "data": { "id": 13, "company_id": 316, "name": "Sucursal Centro", "address": "Estado 100", "comuna": "Santiago", "city": "Santiago", "default": false } } ``` ### Actualizar dirección — `PUT` `/api/my-company/addresses/{id}` - `name` *(string)* — Único por empresa. - `address` *(string)* - `comuna` *(string)* - `city` *(string)* ```json { "success": true, "data": { "id": 13, "company_id": 316, "name": "Sucursal Centro", "address": "Estado 100", "comuna": "Santiago", "city": "Santiago", "default": false } } ``` ### Marcar dirección como default — `PUT` `/api/my-company/addresses/{id}/default` Marca esta dirección como predeterminada de la empresa. Es la que se usa al emitir documentos cuando no se envía una específica. ```json { "success": true, "data": { "id": 13, "company_id": 316, "name": "Sucursal Centro", "address": "Estado 100", "comuna": "Santiago", "city": "Santiago", "default": true } } ``` ### Eliminar dirección — `DELETE` `/api/my-company/addresses/{id}` Quita la dirección. ```json { "success": true } ``` ### Crear giro — `POST` `/api/my-company/giros` - `name` *(string (max 255))* **(requerido)** — Nombre del giro tributario. Único por empresa. > El primer giro creado queda como default automáticamente. ```json { "success": true, "data": { "id": 6, "company_id": 316, "name": "Comercio al por mayor", "default": false } } ``` ### Actualizar giro — `PUT` `/api/my-company/giros/{id}` - `name` *(string)* **(requerido)** — Único por empresa. ```json { "success": true, "data": { "id": 5, "company_id": 316, "name": "Servicios de consultoría", "default": true } } ``` ### Marcar giro como default — `PUT` `/api/my-company/giros/{id}/default` Marca este giro como predeterminado de la empresa. Se usa al emitir documentos cuando no se especifica. ```json { "success": true, "data": { "id": 5, "company_id": 316, "name": "Servicios de consultoría", "default": true } } ``` ### Eliminar giro — `DELETE` `/api/my-company/giros/{id}` > No se puede eliminar el último giro de la empresa. ```json { "success": true } ``` ### Datos públicos del SII por RUT — `POST` `/api/sii-pub` Consulta el SII público y devuelve los datos asociados a un RUT (razón social, dirección, comuna, ciudad, giro principal, código actividad económica). Útil para autocompletar al crear clientes/proveedores. - `rut` *(string)* **(requerido)** — RUT (formato libre). - `allowSandboxRut` *(boolean)* — Si true y el RUT es sandbox (99999999-K), devuelve datos mock — útil en testing. ```json { "success": true, "data": { "name": "EMPRESA SPA", "address": "AV. EJEMPLO 1234", "comuna": "LAS CONDES", "city": "SANTIAGO", "giro": "VENTA AL POR MAYOR DE COMPUTADORAS", "acteco": "464150" } } ``` ### Tipo de cambio — `GET` `/api/exchange-rate/{currencySymbol}` Devuelve el tipo de cambio (a CLP) para la moneda dada en una fecha puntual. Las monedas soportadas son las del endpoint `/api/currencies` (UF, USD, EUR, etc). #### Query string - `date` *(string (YYYY-MM-DD))* — Fecha de consulta. Default: hoy. ```json { "success": true, "data": { "rate": 950.50 // CLP por unidad de la moneda consultada } } ``` ### Lista de monedas — `GET` `/api/currencies` Catálogo de monedas soportadas por Wasabil. Útil para validar currency_symbol antes de crear un documento. ```json { "success": true, "data": [ { "id": 1, "symbol": "CLP", "name": "Peso Chileno" }, { "id": 2, "symbol": "USD", "name": "Dólar Estadounidense" }, { "id": 3, "symbol": "UF", "name": "Unidad de Fomento" }, { "id": 4, "symbol": "BOB", "name": "Boliviano" }, { "id": 5, "symbol": "VES", "name": "Bolívar Soberano" }, { "id": 6, "symbol": "DKK", "name": "Corona Danesa" }, { "id": 7, "symbol": "NOK", "name": "Corona Noruega" }, { "id": 8, "symbol": "SEK", "name": "Corona Sueca" }, { "id": 9, "symbol": "AED", "name": "Dirham De Los Emiratos Árabes Unidos" }, { "id": 10, "symbol": "AUD", "name": "Dólar Australiano" }, { "id": 11, "symbol": "CAD", "name": "Dólar Canadiense" }, { "id": 12, "symbol": "SGD", "name": "Dólar De Singapur" }, { "id": 13, "symbol": "TWD", "name": "Dólar De Taiwán" }, { "id": 14, "symbol": "NZD", "name": "Dólar De Nueva Zelanda" }, { "id": 15, "symbol": "HKD", "name": "Dólar De Hong Kong" }, { "id": 16, "symbol": "EUR", "name": "Euro" }, { "id": 17, "symbol": "CHF", "name": "Franco Suizo" }, { "id": 18, "symbol": "PYG", "name": "Guaraní" }, { "id": 19, "symbol": "GBP", "name": "Libra Esterlina" }, { "id": 20, "symbol": "PEN", "name": "Sol" }, { "id": 21, "symbol": "ARS", "name": "Peso Argentino" }, { "id": 22, "symbol": "COP", "name": "Peso Colombiano" }, { "id": 23, "symbol": "MXN", "name": "Peso Mexicano" }, { "id": 24, "symbol": "UYU", "name": "Peso Uruguayo" }, { "id": 25, "symbol": "ZAR", "name": "Rand Sudafricano" }, { "id": 26, "symbol": "CNY", "name": "Renminbi (Yuan Chino)" }, { "id": 27, "symbol": "INR", "name": "Rupia India" }, { "id": 28, "symbol": "JPY", "name": "Yen Japonés" }, { "id": 29, "symbol": "$$$", "name": "Otras No Especificadas" }, { "id": 30, "symbol": "BRL", "name": "Real" } ] } ``` ### Lista de países — `GET` `/api/countries` Catálogo de países (código ISO-2 y nombre). Útil para validar `country_iso` al crear clientes/proveedores extranjeros o documentos de exportación. Devuelve **243 países** en total — el response de abajo muestra los más usados para integración chilena. Incluye también códigos especiales del SII para Zonas Francas (Arica, Iquique, Punta Arenas). ```json { "success": true, "data": [ { "iso": "AR", "name": "Argentina" }, { "iso": "BO", "name": "Bolivia" }, { "iso": "BR", "name": "Brasil" }, { "iso": "CA", "name": "Canadá" }, { "iso": "CN", "name": "China" }, { "iso": "CO", "name": "Colombia" }, { "iso": "DE", "name": "Alemania" }, { "iso": "ES", "name": "España" }, { "iso": "FR", "name": "Francia" }, { "iso": "GB", "name": "Reino Unido" }, { "iso": "IT", "name": "Italia" }, { "iso": "JP", "name": "Japón" }, { "iso": "KR", "name": "Corea Del Sur" }, { "iso": "MX", "name": "México" }, { "iso": "NL", "name": "Países Bajos" }, { "iso": "PE", "name": "Perú" }, { "iso": "PY", "name": "Paraguay" }, { "iso": "US", "name": "Estados Unidos" }, { "iso": "UY", "name": "Uruguay" }, { "iso": "VE", "name": "Venezuela" }, { "iso": "20", "name": "Zona Franca de Arica, Zona Industrial" }, { "iso": "21", "name": "Zona Franca de Iquique" }, { "iso": "22", "name": "Zona Franca de Punta Arenas" } ] } ``` --- ## Clientes Gestión de clientes (receptores de documentos de venta). Cada cliente puede tener múltiples direcciones y giros tributarios. ### Listar todos los clientes — `GET` `/api/clients` Endpoint corto que devuelve una lista paginada sin body. Equivalente a POST /query con defaults — útil cuando no se necesitan filtros. ```json { "success": true, "data": { "items": [ { "id": 482, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "entity_type": "CL", "rut": "12.345.678-9", "name": "Cliente SpA", "alias": "ABC", "email": "facturacion@cliente.cl", "contact": "+56 9 1234 5678", "external_reference": "CRM-123", "country_iso": null, "foreign_id_number": null, "favorite": false, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "addresses": [ { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } ], "giros": [ { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } ], "country": null, "metafields": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } ], "total": 1247, "lastPage": 50 } } ``` ### Listar con filtros — `POST` `/api/clients/query` Lista paginada con filtros. #### Body - `page` *(int)* — Página (default 1). - `perPage` *(int)* — Items por página (default 25, máximo 250). - `search` *(string)* — Texto libre. Cada palabra (max 10) busca en name, alias, email, foreign_id_number y external_reference (parcial). Si una palabra es un RUT válido, busca por rut exacto. - `rut` *(string)* — RUT completo exacto. - `favorites` *(boolean)* — Sólo favoritos. - `favoritesFirst` *(boolean)* — Ordena favoritos primero. - `entityType` *(string)* — PL Persona Local · PF Persona Extranjera · CL Empresa Local · CF Empresa Extranjera. - `entityTypes` *(array)* — Filtra por varios entity types. - `externalReference` *(string)* — Match exacto contra external_reference. - `countryIso` *(string)* — Para clientes extranjeros — código ISO-2 del país. - `foreignIdNumber` *(string)* — Para clientes extranjeros — identificador en su país. - `metafields` *(array<{ key, value? }>)* — Filtra por metafields. ```json { "success": true, "data": { "items": [ { "id": 482, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "entity_type": "CL", "rut": "12.345.678-9", "name": "Cliente SpA", "alias": "ABC", "email": "facturacion@cliente.cl", "contact": "+56 9 1234 5678", "external_reference": "CRM-123", "country_iso": null, "foreign_id_number": null, "favorite": false, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "addresses": [ { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } ], "giros": [ { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } ], "country": null, "metafields": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } ], "total": 1247, "lastPage": 50 } } ``` ### Obtener cliente — `GET` `/api/clients/{uid}` Devuelve el cliente expandido (incluye addresses, giros, country y metafields). 404 si no existe. ```json { "success": true, "data": { "id": 482, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "entity_type": "CL", "rut": "12.345.678-9", "name": "Cliente SpA", "alias": "ABC", "email": "facturacion@cliente.cl", "contact": "+56 9 1234 5678", "external_reference": "CRM-123", "country_iso": null, "foreign_id_number": null, "favorite": false, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "addresses": [ { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } ], "giros": [ { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } ], "country": null, "metafields": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } } ``` ### Obtener cliente por RUT — `GET` `/api/clients/rut/{rut}` Atajo para buscar por RUT exacto. 404 si no existe. > El RUT puede ir en cualquier formato (`12345678-9`, `12.345.678-9`, etc.) — Wasabil lo normaliza. ```json { "success": true, "data": { "id": 482, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "entity_type": "CL", "rut": "12.345.678-9", "name": "Cliente SpA", "alias": "ABC", "email": "facturacion@cliente.cl", "contact": "+56 9 1234 5678", "external_reference": "CRM-123", "country_iso": null, "foreign_id_number": null, "favorite": false, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "addresses": [ { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } ], "giros": [ { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } ], "country": null, "metafields": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } } ``` ### Crear cliente — `POST` `/api/clients` Crea un cliente con su primera dirección y giro. El cliente queda como **local** por defecto (PL o CL según el RUT) o se puede crear como **extranjero** pasando `entity_type`. #### Body - `rut` *(string)* **(requerido)** — RUT chileno (formato libre — se normaliza). Para extranjeros se acepta el RUT genérico 55555555-5. - `name` *(string (max 255))* **(requerido)** — Razón social o nombre. - `entity_type` *(string)* — PL | PF | CL | CF. Por default se detecta del RUT (Local). - `alias` *(string (max 80))* — Nombre corto interno. - `giro` *(string (max 255))* **(requerido)** — Giro tributario inicial. - `address` *(string (max 70))* **(requerido)** — Dirección de la primera entrada del cliente (queda como default). - `comuna` *(string (max 255))* **(requerido)** — Comuna. - `city` *(string (max 255))* **(requerido)** — Ciudad. - `email` *(string (max 800))* — Uno o varios emails separados por ";". - `contact` *(string (max 80))* — Contacto libre: teléfono, nombre de una persona, etc. - `external_reference` *(string (max 255))* — Identificador externo (id de tu CRM, etc). - `country_iso` *(string (2))* — Requerido si entity_type es PF o CF. - `foreign_id_number` *(string (max 255))* — Identificador del cliente en su país (extranjeros). > **RUT único** > No se puede crear dos clientes con el mismo RUT en la misma empresa + entity_type (salvo RUTs genéricos / extranjeros). ```json { "success": true, "data": { "id": 482, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "entity_type": "CL", "rut": "12.345.678-9", "name": "Cliente SpA", "alias": "ABC", "email": "facturacion@cliente.cl", "contact": "+56 9 1234 5678", "external_reference": "CRM-123", "country_iso": null, "foreign_id_number": null, "favorite": false, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "addresses": [ { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } ], "giros": [ { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } ], "country": null, "metafields": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } } ``` ### Actualizar cliente — `PUT` `/api/clients/{uid}` Sólo permite modificar campos puntuales del cliente. La dirección y el giro se gestionan con sus propios endpoints. **No** se puede cambiar el RUT ni el entity_type. - `name` *(string (max 255))* - `alias` *(string (max 80))* — null para borrar. - `email` *(string (max 800))* — null para borrar. - `contact` *(string (max 80))* — Contacto libre (teléfono, nombre, etc.). null para borrar. - `external_reference` *(string (max 255))* — null para borrar. - `country_iso` *(string (2))* — Sólo para clientes extranjeros. - `foreign_id_number` *(string (max 255))* — Sólo para clientes extranjeros. ```json { "success": true, "data": { "id": 482, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "entity_type": "CL", "rut": "12.345.678-9", "name": "Cliente SpA", "alias": "ABC", "email": "facturacion@cliente.cl", "contact": "+56 9 1234 5678", "external_reference": "CRM-123", "country_iso": null, "foreign_id_number": null, "favorite": false, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "addresses": [ { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } ], "giros": [ { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } ], "country": null, "metafields": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } } ``` ### Eliminar cliente — `DELETE` `/api/clients/{uid}` > No se puede eliminar un cliente que tenga documentos asociados. ```json { "success": true } ``` ### Listar metafields del cliente — `GET` `/api/clients/{uid}/metafields` ```json { "success": true, "data": [ { "client_id": 482, "key": "Categoría", "value": "Premium" }, { "client_id": 482, "key": "Centro de Costos", "value": "Ventas" } ] } ``` ### Asignar / actualizar metafield — `PUT` `/api/clients/{uid}/metafields/{key}` - `value` *(string | number | boolean)* **(requerido)** — Valor (tipo según definición). Ver [Metafields](https://app.wasabil.com/api-docs/metafields). ```json { "success": true, "data": [ { "client_id": 482, "key": "Categoría", "value": "Premium" } ] } ``` ### Quitar metafield — `DELETE` `/api/clients/{uid}/metafields/{key}` Elimina el metafield del cliente. ```json { "success": true } ``` ### Obtener dirección — `GET` `/api/clients/{clientUid}/addresses/{id}` Devuelve la dirección. 404 si no existe. ```json { "success": true, "data": { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "...", "updated_at": "..." } } ``` ### Crear dirección — `POST` `/api/clients/{clientUid}/addresses` - `address` *(string (max 70))* **(requerido)** — Dirección. - `comuna` *(string (max 255))* **(requerido)** - `city` *(string (max 255))* **(requerido)** > La primera dirección creada queda como default automáticamente. ```json { "success": true, "data": { "id": 56, "client_id": 482, "address": "Av. Providencia 999", "comuna": "Providencia", "city": "Santiago", "default": false } } ``` ### Actualizar dirección — `PUT` `/api/clients/{clientUid}/addresses/{id}` - `address` *(string (max 70))* - `comuna` *(string (max 255))* - `city` *(string (max 255))* ```json { "success": true, "data": { "id": 55, "client_id": 482, "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "default": true, "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } } ``` ### Eliminar dirección — `DELETE` `/api/clients/{clientUid}/addresses/{id}` Elimina la dirección. ```json { "success": true } ``` ### Marcar dirección como default — `PUT` `/api/clients/{clientUid}/addresses/{id}/default` Marca esta dirección como default. Al emitir un documento, se usa la default si no se envía otra. ```json { "success": true } ``` ### Obtener giro — `GET` `/api/clients/{clientUid}/giros/{id}` Devuelve el giro. 404 si no existe. ```json { "success": true, "data": { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } } ``` ### Crear giro — `POST` `/api/clients/{clientUid}/giros` - `name` *(string (max 255))* **(requerido)** — Nombre del giro tributario. Único por cliente. > El primer giro creado queda como default automáticamente. ```json { "success": true, "data": { "id": 23, "client_id": 482, "name": "Servicios de consultoría", "default": false } } ``` ### Actualizar giro — `PUT` `/api/clients/{clientUid}/giros/{id}` - `name` *(string (max 255))* **(requerido)** ```json { "success": true, "data": { "id": 22, "client_id": 482, "name": "Comercio al por menor", "default": true } } ``` ### Eliminar giro — `DELETE` `/api/clients/{clientUid}/giros/{id}` Elimina el giro. ```json { "success": true } ``` ### Marcar giro como default — `PUT` `/api/clients/{clientUid}/giros/{id}/default` Marca este giro como default del cliente. ```json { "success": true } ``` --- ## Proveedores Gestión de proveedores (emisores de documentos recibidos) y sus cuentas bancarias para pagos. ### Listar proveedores — `POST` `/api/suppliers/query` Lista paginada de proveedores de la empresa. Wasabil mantiene además un catálogo de proveedores *preloaded* (Shopify, Google Ads, etc.) — al usar la API se devuelven los preloaded relevantes **y** los propios de tu empresa. #### Body - `page` *(int)* — Página (default 1). - `perPage` *(int)* — Items por página (default 25, máximo 250). - `search` *(string)* — Texto libre. Cada palabra (max 10) busca en name y alias (parcial). Si una palabra es un RUT válido, busca por rut exacto. - `rut` *(string)* — RUT completo exacto. - `favorites` *(boolean)* — Sólo favoritos del usuario actual. - `favoritesFirst` *(boolean)* — Favoritos primero. - `entityType` *(string)* — PL Persona Local · PF Persona Extranjera · CL Empresa Local · CF Empresa Extranjera. - `entityTypes` *(array)* — Varios entity types. - `metafields` *(array<{ key, value? }>)* — Filtra por metafields. ```json { "success": true, "data": { "items": [ { "id": 277, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "preload": false, "entity_type": "CL", "rut": "12.345.678-9", "name": "Proveedor SpA", "alias": null, "giro": "Servicios digitales", "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "email": "billing@proveedor.cl", "external_reference": null, "keyname": null, "metafields": [ { "supplier_id": 277, "company_id": 316, "key": "Categoría", "value": "Servicios" } ], "bank_account": { "supplier_id": 277, "company_id": 316, "bank_code": 37, "account_number": "00012345678", "account_type": 1, "currency": "CLP" } // bank_account es null si el proveedor no tiene cuenta cargada } ], "total": 315, "lastPage": 13 } } ``` ### Obtener proveedor — `GET` `/api/suppliers/{uid}` Devuelve el proveedor. 404 si no existe. ```json { "success": true, "data": { "id": 277, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "preload": false, "entity_type": "CL", "rut": "12.345.678-9", "name": "Proveedor SpA", "alias": null, "giro": "Servicios digitales", "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "email": "billing@proveedor.cl", "external_reference": null, "keyname": null, "metafields": [ { "supplier_id": 277, "company_id": 316, "key": "Categoría", "value": "Servicios" } ], "bank_account": { "supplier_id": 277, "company_id": 316, "bank_code": 37, "account_number": "00012345678", "account_type": 1, "currency": "CLP" } // bank_account es null si el proveedor no tiene cuenta cargada } } ``` ### Crear proveedor — `POST` `/api/suppliers` Crea un proveedor en tu empresa. Para extranjeros pasar `entity_type: 'CF'` o `'PF'`. #### Body - `rut` *(string)* **(requerido)** — RUT (formato libre). Extranjeros aceptan RUT genérico 55555555-5. - `name` *(string)* **(requerido)** — Razón social. - `entity_type` *(string)* — PL | PF | CL | CF. Por default se detecta del RUT. - `alias` *(string (max 255))* — Nombre corto interno. - `giro` *(string (max 255))* **(requerido)** — Giro tributario. - `address` *(string (max 70))* **(requerido)** — Dirección. - `comuna` *(string (max 255))* **(requerido)** — Para Persona Local (PL) debe existir en la tabla de comunas. - `city` *(string (max 255))* **(requerido)** — Ciudad. - `email` *(string (max 800))* — Uno o varios emails separados por ";". - `external_reference` *(string (max 255))* — Identificador externo. > **RUT único** > No se puede crear dos proveedores con el mismo RUT + entity_type en la misma empresa (salvo RUTs genéricos). ```json { "success": true, "data": { "id": 277, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "preload": false, "entity_type": "CL", "rut": "12.345.678-9", "name": "Proveedor SpA", "alias": null, "giro": "Servicios digitales", "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "email": "billing@proveedor.cl", "external_reference": null, "keyname": null, "metafields": [ { "supplier_id": 277, "company_id": 316, "key": "Categoría", "value": "Servicios" } ], "bank_account": { "supplier_id": 277, "company_id": 316, "bank_code": 37, "account_number": "00012345678", "account_type": 1, "currency": "CLP" } // bank_account es null si el proveedor no tiene cuenta cargada } } ``` ### Actualizar proveedor — `PUT` `/api/suppliers/{uid}` Permite modificar name, alias, giro, comuna, address, city, email, external_reference. **No** se puede cambiar el RUT ni el entity_type. Los proveedores *preloaded* no se pueden editar. - `name` *(string)* - `alias` *(string)* — null para borrar. - `giro` *(string)* - `comuna` *(string)* - `address` *(string)* - `city` *(string)* - `email` *(string)* - `external_reference` *(string)* ```json { "success": true, "data": { "id": 277, "uid": "0b81d32a-428f-11ee-8930-023495e59a6b", "company_id": 316, "preload": false, "entity_type": "CL", "rut": "12.345.678-9", "name": "Proveedor SpA", "alias": null, "giro": "Servicios digitales", "address": "Av. Apoquindo 1234", "comuna": "Las Condes", "city": "Santiago", "email": "billing@proveedor.cl", "external_reference": null, "keyname": null, "metafields": [ { "supplier_id": 277, "company_id": 316, "key": "Categoría", "value": "Servicios" } ], "bank_account": { "supplier_id": 277, "company_id": 316, "bank_code": 37, "account_number": "00012345678", "account_type": 1, "currency": "CLP" } // bank_account es null si el proveedor no tiene cuenta cargada } } ``` ### Eliminar proveedor — `DELETE` `/api/suppliers/{uid}` > No se puede eliminar un proveedor que tenga documentos asociados ni un proveedor preloaded del sistema. ```json { "success": true } ``` ### Opciones de banco y tipos de cuenta — `GET` `/api/suppliers/bank-accounts/options` Devuelve el catálogo de bancos chilenos válidos, tipos de cuenta y monedas soportadas. Necesario para setear el bank_code y account_type correctos al cargar una cuenta de proveedor. > Estas opciones son específicas de **cuentas bancarias de proveedores** (para pagos). No confundir con los campos `bankId` / `accountType` de `trx_sources`, que usan otro vocabulario (ver Transacciones → Crear fuente). ```json { "success": true, "data": { "banks": [ { "code": 1, "label": "Banco de Chile" }, { "code": 9, "label": "Banco Internacional" }, { "code": 12, "label": "BancoEstado" }, { "code": 14, "label": "Scotiabank" }, { "code": 16, "label": "BCI" }, { "code": 17, "label": "Banco do Brasil" }, { "code": 28, "label": "BICE" }, { "code": 31, "label": "HSBC Bank" }, { "code": 37, "label": "Banco Santander" }, { "code": 39, "label": "Itaú" }, { "code": 49, "label": "Banco Security" }, { "code": 51, "label": "Banco Falabella" }, { "code": 53, "label": "Banco Ripley" }, { "code": 55, "label": "Banco Consorcio" }, { "code": 59, "label": "BBVA" }, { "code": 267, "label": "Transbank" }, { "code": 504, "label": "Scotiabank Azul" }, { "code": 507, "label": "Banco del Desarrollo" }, { "code": 672, "label": "Banco Coopeuch" }, { "code": 729, "label": "Los Heroes" }, { "code": 730, "label": "Tenpo" }, { "code": 732, "label": "TAPP Caja Los Andes" }, { "code": 738, "label": "Global66" }, { "code": 741, "label": "Copec" }, { "code": 874, "label": "Mercado Pago" }, { "code": 875, "label": "Mercado Pago Emisora" }, { "code": 876, "label": "Getnet" }, { "code": 1608, "label": "Bemmbo Pay" } ], "accountTypes": [ { "code": 1, "label": "Cuenta Corriente" }, { "code": 2, "label": "Cuenta Vista" }, { "code": 3, "label": "Cuenta de Ahorro" }, { "code": 4, "label": "Cuenta RUT" } ], "currencies": [ "CLP" ] } } ``` ### Obtener cuenta bancaria — `GET` `/api/suppliers/{uid}/bank-account` Devuelve la cuenta bancaria del proveedor en tu empresa. La response viene envuelta en una key `bankAccount` — si el proveedor no tiene cuenta cargada, `bankAccount` es `null`. ```json { "success": true, "data": { "bankAccount": { "supplier_id": 277, "company_id": 316, "bank_code": 37, "account_number": "00012345678", "account_type": 1, "currency": "CLP" } } } ``` ```json { "success": true, "data": { "bankAccount": null } } ``` ### Setear cuenta bancaria — `PUT` `/api/suppliers/{uid}/bank-account` Crea o actualiza la cuenta bancaria del proveedor. Es upsert — un solo registro por (supplier, empresa). - `bank_code` *(int)* **(requerido)** — Código del banco (ver Opciones de banco). - `account_number` *(string (max 50))* **(requerido)** — Número de cuenta. - `account_type` *(int)* **(requerido)** — Tipo de cuenta (ver Opciones — 1 a 4). - `currency` *(string (max 3))* — Por ahora sólo "CLP" (default). > No funciona para proveedores preloaded del sistema. ```json { "success": true, "data": { "bankAccount": { "supplier_id": 277, "company_id": 316, "bank_code": 37, "account_number": "00012345678", "account_type": 1, "currency": "CLP" } } } ``` ### Eliminar cuenta bancaria — `DELETE` `/api/suppliers/{uid}/bank-account` Quita la cuenta bancaria del proveedor. ```json { "success": true, "status": 200, "data": [] } ``` ### Listar metafields del proveedor — `GET` `/api/suppliers/{uid}/metafields` ```json { "success": true, "data": [ { "supplier_id": 277, "key": "Centro de Costos", "value": "Marketing" } ] } ``` ### Asignar / actualizar metafield — `PUT` `/api/suppliers/{uid}/metafields/{key}` - `value` *(string | number | boolean)* **(requerido)** — Valor (tipo según la definición). ```json { "success": true, "data": [ { "supplier_id": 277, "key": "Centro de Costos", "value": "Marketing" } ] } ``` ### Quitar metafield — `DELETE` `/api/suppliers/{uid}/metafields/{key}` Elimina el metafield del proveedor. ```json { "success": true } ``` --- # Finanzas ## Transacciones CRUD de transacciones bancarias y de las fuentes (cuentas, tarjetas, etc.) donde se registran. Para vincular transacciones con documentos emitidos/recibidos ver Conciliación. ### Listar transacciones — `POST` `/api/financials/transactions/query` Lista paginada de transacciones bancarias con filtros. #### Body - `page` *(int)* — Página (default 1). - `perPage` *(int)* — Items por página (default 25, máximo 100). - `search` *(string)* — Texto libre. Busca en description, external_id y group_name. - `trxSourceId` *(int)* — Filtra por fuente puntual (ver [Listar fuentes](https://app.wasabil.com/api-docs/financials#section-sources-list)). - `sourceType` *(string)* — bank_account | credit_card | cash | virtual_wallet | payment_terminal. - `dateFrom` *(string (YYYY-MM-DD))* — Desde. - `dateTo` *(string (YYYY-MM-DD))* — Hasta. - `status` *(string)* — PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED. - `amountSign` *(string)* — positive | negative — filtra ingresos o gastos. - `creationMode` *(string)* — manual | api | flink. - `externalId` *(string)* — External id exacto. - `groupName` *(string)* — Nombre de grupo exacto. ```json { "success": true, "data": { "items": [ { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, // negativo = gasto, positivo = ingreso "reconciled_amount": 0, // suma absoluta de las reconciliaciones (mismo signo que amount) "status": "PENDING", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": null, // timestamp del último cambio de status "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "idempotency_key": null, // clave con la que se creó la trx (null si se creó sin clave) "flink_document_id": null, "flink_document_type": null, // si la trx fue creada automáticamente desde un documento (flink), // estos campos referencian al documento origen "creation_mode": "manual", // manual | api | flink (creada desde un documento) "sign": -1, // derivado de amount (1 ingreso · -1 gasto) "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "reconciliations": [ // documentos asociados (si los hay) — sólo en GET y respuestas con expand { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z" } ], "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } } ], "total": 487, "lastPage": 20 } } ``` ### Obtener transacción — `GET` `/api/financials/transactions/{id}` Devuelve la transacción con sus reconciliaciones y la fuente envuelta en una key trx. ```json { "success": true, "data": { "trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, // negativo = gasto, positivo = ingreso "reconciled_amount": 0, // suma absoluta de las reconciliaciones (mismo signo que amount) "status": "PENDING", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": null, // timestamp del último cambio de status "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "idempotency_key": null, // clave con la que se creó la trx (null si se creó sin clave) "flink_document_id": null, "flink_document_type": null, // si la trx fue creada automáticamente desde un documento (flink), // estos campos referencian al documento origen "creation_mode": "manual", // manual | api | flink (creada desde un documento) "sign": -1, // derivado de amount (1 ingreso · -1 gasto) "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "reconciliations": [ // documentos asociados (si los hay) — sólo en GET y respuestas con expand { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z" } ], "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } } } } ``` ### Crear transacción — `POST` `/api/financials/transactions` Crea una transacción individual. `creation_mode` queda automáticamente como `manual`. - `trx_source_id` *(int)* **(requerido)** — Id de la fuente (cuenta bancaria, tarjeta, etc). - `trx_date` *(string (YYYY-MM-DD))* — Fecha del movimiento (default: hoy). - `amount` *(number)* **(requerido)** — Monto. Negativo para gastos, positivo para ingresos. - `description` *(string (max 500))* — Descripción libre. - `external_id` *(string (max 255))* — Identificador externo (id del banco, etc). - `group_name` *(string (max 255))* — Nombre de grupo (ej. "Cartola abril 2025"). - `idempotency_key` *(string (max 191))* — Clave de idempotencia — evita cargar el mismo movimiento dos veces si reintentás la llamada. Ver [Idempotencia](https://app.wasabil.com/api-docs/financials#section-trx-idempotencia). > La response del create es **liviana**: trae los campos básicos de la trx pero **no incluye** `status`, `status_at`, `reconciled_amount`, `reconciliations` ni `trx_source`. Si los necesitás, hacé `GET /transactions/{id}` después. ```json { "success": true, "data": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "idempotency_key": "pago-orden-4821", "creation_mode": "manual", "sign": -1, "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "idempotent_replay": false // true = esta trx ya existía y se devolvió por idempotency_key } } ``` ### Idempotencia (evitar transacciones duplicadas) Sin clave, cada `POST /api/financials/transactions` crea una transacción nueva. Si tu llamada se corta por timeout o tu sistema reintenta, el mismo movimiento queda cargado dos veces — y una trx duplicada ensucia la conciliación: aparece plata que no existe y se puede conciliar contra un documento real. Para evitarlo, mandá una `idempotency_key` en el body. La regla: **una clave = una transacción**. La primera llamada crea la trx y queda atada a esa clave; cualquier repetición posterior devuelve **esa misma trx** con `idempotent_replay: true`, en vez de crear otra. ```json { "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "idempotency_key": "pago-orden-4821" } // 1ra llamada → 200, crea la trx → "idempotent_replay": false // 2da llamada → 200, devuelve la MISMA trx → "idempotent_replay": true // (mismo id — no se crea una segunda) ``` #### Cómo elegir la clave - Tiene que ser un identificador **estable** de la operación en tu sistema — el id del movimiento en la cartola, el id del pago, la fila de tu planilla — y el reintento tiene que mandar **exactamente el mismo valor**. - No sirve un UUID generado en cada intento: si cada llamada lleva una clave distinta, no hay nada que comparar y se crean dos trxs. - Si de una misma operación salen **dos transacciones** (un pago que se partió en dos movimientos), cada una necesita su propia clave: `pago-4821:1`, `pago-4821:2`. - El alcance es tu empresa — dos empresas distintas pueden usar la misma clave sin pisarse — y **no** distingue el medio: la misma clave en dos cuentas distintas se considera la misma operación. Máximo **191 caracteres**; más largo devuelve **400** con `invalid_idempotency_key`. - No puede empezar con `#wasabil:` — ese prefijo está reservado para las transacciones que genera Wasabil por su cuenta. Si lo usás recibís **400** con `invalid_idempotency_key`. #### Qué pasa en cada caso | Situación | Respuesta | | --- | --- | | Clave nueva | Se crea la trx normalmente, con idempotent_replay: false. | | Clave ya usada | 200 con la trx de la primera llamada, en el estado en que esté hoy (idempotent_replay: true). No comparamos el body: si reusás la clave con datos distintos, los datos nuevos se ignoran. | | Dos llamadas simultáneas con la misma clave | Una crea la trx y la otra devuelve esa misma, aunque lleguen en el mismo milisegundo: la barrera es un índice único en la base, así que la segunda espera el lock y después resuelve. Sólo si no se puede determinar quién ganó (la primera sigue sin cerrar) devuelve 409 duplicate_request_in_progress: reintentá con la misma clave. | | La creación falla (validación, etc.) | No se creó nada y la clave queda libre: el reintento con la misma clave sí crea. | | La trx se elimina después | La clave vuelve a quedar libre y se puede volver a usar. A diferencia de un documento, borrar una trx no deja nada irreversible atrás. | | Sin idempotency_key | Cada llamada crea una trx nueva (comportamiento de siempre). | > **El error más caro es el timeout mal manejado** > Si tu llamada corta por timeout, la trx **puede haberse creado igual** — el corte fue en la conexión, no necesariamente en Wasabil. Con clave, el reintento es seguro y es la respuesta correcta: no busques primero "si existe", sólo reintentá con la misma clave. > El [bulk](https://app.wasabil.com/api-docs/financials#section-trx-bulk) también las acepta, una por fila: ahí la fila cuya clave ya se usó no corta la request, vuelve en `skipped` con `reason: "idempotent_replay"`. Actualizar una trx con `PUT` ya es repetible sin consecuencias, así que ahí el campo se ignora. ### Crear transacciones en masa — `POST` `/api/financials/transactions/bulk` Crea múltiples transacciones en una llamada. Hace deduplicación automática contra trxs existentes en la misma fuente (mismo monto + fecha + descripción se considera duplicado). - `mode` *(string)* **(requerido)** — check (sólo reporta cuáles serían duplicados sin persistir) · apply (crea las trxs). - `trx_source_id` *(int)* **(requerido)** — Fuente común a todas las transacciones del batch. - `group_name` *(string (max 255))* — Grupo común para todas (ej. "Cartola abril 2025"). - `transactions` *(array)* **(requerido)** — Mínimo 1. Cada item describe los siguientes campos: - `date` *(string (YYYY-MM-DD))* **(requerido)** — Fecha del movimiento. - `amount` *(number)* **(requerido)** — Monto. Negativo para gastos, positivo para ingresos. - `description` *(string)* — Descripción libre. - `external_id` *(string)* — Identificador externo (id del banco, etc). - `idempotency_key` *(string (max 191))* — Clave de idempotencia de ESTA fila. Si ya se usó, la fila vuelve en `skipped` con `reason: "idempotent_replay"` en vez de crear una segunda trx — y sin romper el lote. Ver [Idempotencia](https://app.wasabil.com/api-docs/financials#section-trx-idempotencia). - `skip_duplicates` *(boolean)* — Sólo en mode=apply. true (default): las filas detectadas como duplicadas NO se crean y vuelven en `skipped`. false: no se chequean duplicados y se crean todas, incluidas las que ya existen. No alcanza a las filas con idempotency_key ya usada: ésas se saltean siempre. > **Dos protecciones distintas** > La **deduplicación por contenido** (fecha + monto + descripción) es una suposición nuestra y la podés apagar con `skip_duplicates: false`. La `idempotency_key` de cada fila es lo contrario: un contrato — una clave = una trx — que no se puede apagar y que gana sobre el contenido. Con claves, repetir el lote entero después de un timeout es seguro: lo que ya entró vuelve como `idempotent_replay` y lo que falta se crea. > **Si dos cargas con las mismas claves se pisan** > El lote entero se inserta en una transacción, así que dos cargas simultáneas que comparten claves se pelean en la base. Wasabil las resuelve solo: la que llega segunda devuelve esas filas por `skipped` con `idempotent_replay`. Si la pelea no se puede resolver, la respuesta es **409** `duplicate_request_in_progress` y el lote **no se creó a medias**: reintentalo igual, con las mismas claves. ```json { "success": true, "data": { "created": [ { "index": 0, "trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "idempotency_key": null, "creation_mode": "manual", "sign": -1, "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } } // ... un objeto { index, trx } por cada transacción creada ], "skipped": [ { "index": 2, "reason": "duplicate", // dedup por contenido (fecha + monto + descripción) "existing": { "id": 998, "trx_date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "group_name": "Cartola abril", "idempotency_key": null, "creation_mode": "manual" } }, { "index": 5, "reason": "idempotent_replay", // esa idempotency_key ya había creado esta trx "existing": { "id": 1001, "trx_date": "2025-04-11", "amount": -45000, "description": "TRANSFERENCIA ARRIENDO", "group_name": "Cartola abril", "idempotency_key": "cartola-abr-1187", "creation_mode": "manual" } } ], "summary": { "total": 10, "created": 8, "skipped": 2 } } } ``` ```json { "success": true, "data": { "transactions": [ { "index": 0, "status": "new", // new | duplicate | error "normalized": { "date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "idempotency_key": null } }, { "index": 1, "status": "duplicate", "duplicate_by": "content", // content = fecha + monto + descripción · idempotency_key = clave ya usada "normalized": { "date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "idempotency_key": null }, "existing": { "id": 998, "trx_date": "2025-04-10", "amount": -19900, "description": "PAGO PROVEEDOR ABC", "group_name": "Cartola abril", "idempotency_key": null, "creation_mode": "manual" } }, { "index": 5, "status": "duplicate", "duplicate_by": "idempotency_key", "normalized": { "date": "2025-04-11", "amount": -45000, "description": "TRANSFERENCIA ARRIENDO", "external_id": null, "idempotency_key": "cartola-abr-1187" }, "existing": { "id": 1001, "trx_date": "2025-04-11", "amount": -45000, "description": "TRANSFERENCIA ARRIENDO", "group_name": "Cartola abril", "idempotency_key": "cartola-abr-1187", "creation_mode": "manual" } }, { "index": 7, "status": "duplicate", "duplicate_by": "idempotency_key", "duplicate_of_index": 6, // la clave está repetida DENTRO del lote que mandaste: todavía no hay // trx a la que apuntar, así que se señala la primera fila que la usa "normalized": { /* ... */ } } ], "summary": { "total": 10, "new": 7, "duplicates": 3, "errors": 0 } } } ``` ### Actualizar transacción — `PUT` `/api/financials/transactions/{id}` Permite cambiar fecha, descripción, external_id y group_name. **No se puede** cambiar el monto ni la fuente — si hace falta, crear una trx nueva (el monto afecta las reconciliaciones existentes). - `trx_date` *(string (YYYY-MM-DD))* — Fecha del movimiento. - `description` *(string (max 500))* — Descripción libre. - `external_id` *(string (max 255))* — Identificador externo (id del banco, etc). - `group_name` *(string (max 255))* — Nombre de grupo. ```json { "success": true, "data": { "trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, // negativo = gasto, positivo = ingreso "reconciled_amount": 0, // suma absoluta de las reconciliaciones (mismo signo que amount) "status": "PENDING", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": null, // timestamp del último cambio de status "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "idempotency_key": null, // clave con la que se creó la trx (null si se creó sin clave) "flink_document_id": null, "flink_document_type": null, // si la trx fue creada automáticamente desde un documento (flink), // estos campos referencian al documento origen "creation_mode": "manual", // manual | api | flink (creada desde un documento) "sign": -1, // derivado de amount (1 ingreso · -1 gasto) "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z", "reconciliations": [ // documentos asociados (si los hay) — sólo en GET y respuestas con expand { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z" } ], "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } } } } ``` ### Eliminar transacción — `DELETE` `/api/financials/transactions/{id}` > Elimina la transacción. Si tiene reconciliaciones, también se eliminan (los documentos vuelven a "pendiente de conciliar"). ```json { "success": true } ``` ### Listar fuentes de transacciones — `GET` `/api/financials/trx-sources` Fuentes (cuentas bancarias, tarjetas, etc.) configuradas en la empresa para registrar transacciones. ```json { "success": true, "data": [ { "id": 4, "company_id": 316, "type": "bank_account", // bank_account | credit_card | cash | virtual_wallet | payment_terminal "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } ] } ``` ### Crear fuente — `POST` `/api/financials/trx-sources` - `type` *(string)* **(requerido)** — bank_account | credit_card | cash | virtual_wallet | payment_terminal. - `name` *(string (max 255))* **(requerido)** — Nombre para identificar la fuente. Único por empresa. - `data` *(object)* — Datos del medio (varía según el type). Los valores válidos están en las tablas de abajo. Sólo aplica para bank_account / credit_card / virtual_wallet / payment_terminal; cash no usa data. - `bankId` *(string)* — Sólo para bank_account. Id del banco — ver tabla "Bancos para trx_source" abajo. - `bankName` *(string (max 255))* — Sólo para bank_account. Nombre del banco (cualquier string, se persiste tal cual). - `accountType` *(string)* — Sólo para bank_account. CUENTA_CORRIENTE | CUENTA_AHORRO | LINEA_CREDITO | CUENTA_VISTA. - `accountNumber` *(string (max 50))* — Sólo para bank_account. - `accountCategory` *(string)* — Sólo para bank_account. PERSONAL | BUSINESS_ENTREPRENEUR | BUSINESS_EMPRESAS. - `brand` *(string)* — Sólo para credit_card. Visa | Mastercard | American Express. - `lastDigits` *(string (max 4))* — Sólo para credit_card. Últimos 4 dígitos. - `provider` *(string)* — Para `virtual_wallet`: `mercado_pago`. Para `payment_terminal`: `getnet | transbank | klap | sumup | toku | tuu | fintoc`. ```json { "success": true, "data": { "id": 4, "company_id": 316, "type": "bank_account", // bank_account | credit_card | cash | virtual_wallet | payment_terminal "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } } ``` > **Mínimo una fuente** > No se puede eliminar la última fuente que queda en la empresa — siempre tiene que haber al menos una. ### Actualizar fuente — `PUT` `/api/financials/trx-sources/{id}` - `type` *(string)* - `name` *(string)* - `data` *(object)* ```json { "success": true, "data": { "id": 4, "company_id": 316, "type": "bank_account", // bank_account | credit_card | cash | virtual_wallet | payment_terminal "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } } ``` ### Eliminar fuente — `DELETE` `/api/financials/trx-sources/{id}` > No se puede eliminar una fuente que tenga transacciones asociadas. Hay que borrar las trxs primero. ```json { "success": true } ``` --- ## Documentos El documento emitido o recibido visto desde finanzas: su total con signo, cuánto lleva conciliado y qué transacciones tiene vinculadas. Se identifica por su document_pack — el id numérico del documento principal (campo `document`, ej. 90000000000366), NO el UUID. Recurso de sólo lectura. ### ¿Qué es un document_pack? El `document_pack` es el **id numérico interno** del documento principal de Wasabil (campo `document` del recurso, ej. `90000000000366`). No confundir con el folio del SII ni con el UUID público. Las notas de crédito y débito que afectan a la misma factura quedan agrupadas bajo el mismo pack. Al asociar una transacción al pack, queda asociada al grupo entero — el `reconciled_amount` del pack tiene en cuenta los signos de todos los documentos del pack. > **Los packs no se crean ni se editan por API** > Aparecen solos: cada vez que un documento queda **Emitido** y es de **venta** o **gasto**, Wasabil crea o recalcula su pack. Las guías de despacho no tienen pack, y las notas de crédito/débito tampoco tienen uno propio: caen en el pack del documento que afectan. Sobre este recurso sólo se lista (o se lee uno puntual); para vincular transacciones está [Conciliación](https://app.wasabil.com/api-docs/reconciliation). ### Listar documentos — `POST` `/api/financials/documents/query` Lista paginada de packs con su estado de conciliación: el documento principal en `main_document`, sus notas de crédito/débito en `related_documents` y las transacciones ya vinculadas en `reconciliations[].linked_trx`. Es de donde se saca el `document_pack` que piden [associate-transaction](https://app.wasabil.com/api-docs/reconciliation#section-associate-trx), [associate-document](https://app.wasabil.com/api-docs/reconciliation#section-associate-doc) y [unlink-reconciliation](https://app.wasabil.com/api-docs/reconciliation#section-unlink). #### Paginación - `page` *(int)* — Página (default 1). - `perPage` *(int)* — Items por página (default 25, máximo 250). > **El orden es fijo** > Siempre por fecha del documento principal descendente (y a igual fecha, por `document_pack` descendente). Este endpoint **ignora** `sortBy`. #### Filtro por estado de conciliación - `financialStatus` *(string)* — PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED. Acepta varios separados por coma (ej. "PENDING,PARTIALLY_RECONCILED" para lo que falta conciliar). #### Filtros por documento Se aplican sobre los documentos del pack y son **los mismos que acepta** [POST /api/documents/query](https://app.wasabil.com/api-docs/documents#section-query). Los más útiles acá: - `search` *(string)* — Texto libre sobre nombre/RUT del receptor, alias, invoice_reference, folio y document id. Acepta los mismos prefijos que el listado de documentos (folio:, tipo:, ref:, id:, receptor:, cot:). - `trxType` *(int)* — 1 venta · 2 gasto. Es el filtro de las dos pestañas de Conciliación. - `siiDocumentTypeCodes` *(array)* — Códigos SII (33, 34, 39, 41, 46, 52, 56, 61, 110, 111, 112, 200). - `received` *(boolean)* — true sólo documentos recibidos, false sólo emitidos por vos. - `fromDocumentDate` *(string (YYYY-MM-DD))* — Desde esta fecha de documento (inclusive). - `toDocumentDate` *(string (YYYY-MM-DD))* — Hasta esta fecha de documento (inclusive). - `dateFilterMode` *(string)* — Atajo de fechas: today | yesterday | this-week | this-month | last-month | this-year | last-year | last-x-months | choose-month | exact-date | range. - `dateFilterFrom / dateFilterTo` *(string (YYYY-MM-DD))* — Extremos del rango, con dateFilterMode=range. - `dateFilterMonth` *(string (YYYY-MM))* — Mes a listar, con dateFilterMode=choose-month. - `dateFilterExact` *(string (YYYY-MM-DD))* — Día exacto, con dateFilterMode=exact-date. - `dateFilterMonthsCount` *(int)* — Cantidad de meses hacia atrás, con dateFilterMode=last-x-months. - `clientId / clientRut / clientName` *(int / string / string)* — Cliente del documento. RUT exacto, nombre parcial. - `supplierId / supplierRut / supplierName` *(int / string / string)* — Proveedor del documento. RUT exacto, nombre parcial. - `folio` *(int)* — Folio del documento. - `document` *(string)* — Document id interno (o folio) de un documento del pack. - `origin / originPlatform` *(string)* — Origen con el que se creó el documento. - `metafields` *(array<{ key, value? }>)* — Filtra por presencia o valor de metafields del documento. > **El filtro busca documentos, pero devuelve packs** > Un pack entra en el resultado si **cualquiera** de sus documentos matchea el filtro. Por eso filtrar por `siiDocumentTypeCodes: [61]` no devuelve notas de crédito sueltas: devuelve los packs de las facturas que esas notas afectan. Y filtrar por estado del documento suma poco, porque sólo los documentos emitidos tienen pack. #### Response 200 ```json { "success": true, "data": { "items": [ { "document_pack": 90000000005953, "total_amount": -19900, // con signo: ventas positivas, gastos negativos (acá, una factura de compra) "reconciled_amount": -19900, "status": "RECONCILED", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": "2025-04-10T07:12:33.000000Z", "main_document": { "document": 90000000005953, "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "sii_document_type_id": 46, "folio": "12345", "document_date": "2025-04-09", "company_id": 316, "supplier_id": 277, "status_id": 3, "current_ntotal": 19900, "sent_ntotal": 19900, "receiver_rut": "76.543.210-9", "receiver_name": "Proveedor ABC SpA", "currency_id": 1, "trx_type": 2, "trx_subtype": 200, "trx_sign": 1 // (el documento completo trae todos los campos del recurso Documents) }, "related_documents": [], // notas de crédito / débito que afectan a este pack (si las hay) "reconciliations": [ { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z", "linked_trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1, "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { /* ver formato según type en Transacciones */ } } } } ] } ], "total": 487, // total de packs que matchean (para paginar) "lastPage": 20 } } ``` Los montos del pack vienen **con signo**: las ventas suman positivo y los gastos negativo (las notas de crédito restan dentro de su pack). `total_amount` es la suma de los documentos **emitidos** del pack y `reconciled_amount` la de los `linked_amount` vinculados; cuando los dos coinciden el pack pasa a `RECONCILED`. Lo que falta conciliar es la diferencia entre ambos. ### Obtener un documento — `GET` `/api/financials/documents/{document_pack}` Devuelve un pack puntual, con la misma forma que cada item de [el listado](https://app.wasabil.com/api-docs/financial-documents#section-query). Útil para releer el estado de conciliación de un documento después de vincular o desvincular una transacción. El parámetro es el `document_pack` — el `document` id interno del documento principal (ej. `90000000005953`). Acá **no** sirven el UUID ni el folio. ```json { "success": true, "data": { "financial": { "document_pack": 90000000005953, "total_amount": -19900, // con signo: ventas positivas, gastos negativos (acá, una factura de compra) "reconciled_amount": -19900, "status": "RECONCILED", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": "2025-04-10T07:12:33.000000Z", "main_document": { "document": 90000000005953, "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "sii_document_type_id": 46, "folio": "12345", "document_date": "2025-04-09", "company_id": 316, "supplier_id": 277, "status_id": 3, "current_ntotal": 19900, "sent_ntotal": 19900, "receiver_rut": "76.543.210-9", "receiver_name": "Proveedor ABC SpA", "currency_id": 1, "trx_type": 2, "trx_subtype": 200, "trx_sign": 1 // (el documento completo trae todos los campos del recurso Documents) }, "related_documents": [], // notas de crédito / débito que afectan a este pack (si las hay) "reconciliations": [ { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z", "linked_trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1, "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { /* ver formato según type en Transacciones */ } } } } ] } } } ``` > **Errores comunes** > `404 not_found` — el `document_pack` no existe en tu empresa. Ojo que un documento sin pack (una guía de despacho, o algo que todavía no quedó emitido) cae también acá. --- ## Conciliación Vincular documentos con transacciones bancarias. Cada documento (o pack de documentos relacionados, ej. una factura + sus notas de crédito) se identifica por su document_pack — que es el id numérico del documento principal (campo `document`, ej. 90000000000366), NO el UUID. El recurso en sí, con sus filtros y su estado de conciliación, está en Documentos. ### Asociar transacción a documento — `POST` `/api/financials/associate-transaction` Vincula una transacción a un [document pack](https://app.wasabil.com/api-docs/financial-documents). Si no se pasa `financial_trx_id`, se crea una transacción nueva con los datos provistos y se asocia. - `document_pack` *(int)* **(requerido)** — Id numérico del documento principal a conciliar (campo `document` del recurso). - `financial_trx_id` *(int)* — Id de una trx existente. Si se omite, se crea una nueva. - `linked_amount` *(number)* — Monto a vincular en valor absoluto — Wasabil le aplica el signo de la trx. Default: el total de la trx. - `trx_source_id` *(int)* — Sólo si se crea una trx nueva. - `trx_date` *(string (YYYY-MM-DD))* — Sólo si se crea una trx nueva (default: hoy). - `amount` *(number)* — Sólo si se crea una trx nueva (entonces es requerido). - `description` *(string)* — Sólo al crear trx nueva. - `external_id` *(string)* — Sólo al crear trx nueva. - `group_name` *(string)* — Sólo al crear trx nueva. > La `trx` en este response viene en formato **raw** (sin `reconciliations` ni `trx_source`). Para tener esa info, usá **associate-document** o hacé un `GET /transactions/{id}` después. ```json { "success": true, "data": { "trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1 }, "financial": { "document_pack": 90000000005953, "total_amount": -19900, // con signo: ventas positivas, gastos negativos (acá, una factura de compra) "reconciled_amount": -19900, "status": "RECONCILED", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": "2025-04-10T07:12:33.000000Z", "main_document": { "document": 90000000005953, "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "sii_document_type_id": 46, "folio": "12345", "document_date": "2025-04-09", "company_id": 316, "supplier_id": 277, "status_id": 3, "current_ntotal": 19900, "sent_ntotal": 19900, "receiver_rut": "76.543.210-9", "receiver_name": "Proveedor ABC SpA", "currency_id": 1, "trx_type": 2, "trx_subtype": 200, "trx_sign": 1 // (el documento completo trae todos los campos del recurso Documents) }, "related_documents": [], // notas de crédito / débito que afectan a este pack (si las hay) "reconciliations": [ { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z", "linked_trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1, "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { /* ver formato según type en Transacciones */ } } } } ] } } } ``` > **Errores comunes** > > - `404 not_found` — el `document_pack` no existe en la empresa. > - `422 already_exists` — esa trx ya está asociada al document_pack. > - `422 trx_insufficient_balance` — la trx no tiene saldo libre para cubrir `linked_amount`. > ### Asociar documento a transacción — `POST` `/api/financials/associate-document` Vincula un documento existente a una transacción ya cargada. Versión espejo de `associate-transaction` — usá ésta cuando ya tenés la trx y querés asociar el documento. - `financial_trx_id` *(int)* **(requerido)** — Id de la transacción. - `document_pack` *(int)* **(requerido)** — Id numérico del documento a asociar (campo `document` del recurso). - `linked_amount` *(number)* — Monto a vincular en valor absoluto. Default: el total de la trx. > A diferencia de `associate-transaction`, acá la `trx` viene con `reconciliations` y `trx_source` ya cargados. ```json { "success": true, "data": { "trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1, "reconciliations": [ { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z" } ], "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { "bankId": "cl_banking_business_bancosantander", "bankName": "Banco Santander - Empresas (OfficeBanking)", "accountType": "CUENTA_CORRIENTE", "accountNumber": "00012345678", "accountCategory": "BUSINESS_EMPRESAS" }, "created_at": "2025-04-10T06:00:00.000000Z", "updated_at": "2025-04-10T06:00:00.000000Z" } }, "financial": { "document_pack": 90000000005953, "total_amount": -19900, // con signo: ventas positivas, gastos negativos (acá, una factura de compra) "reconciled_amount": -19900, "status": "RECONCILED", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": "2025-04-10T07:12:33.000000Z", "main_document": { "document": 90000000005953, "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "sii_document_type_id": 46, "folio": "12345", "document_date": "2025-04-09", "company_id": 316, "supplier_id": 277, "status_id": 3, "current_ntotal": 19900, "sent_ntotal": 19900, "receiver_rut": "76.543.210-9", "receiver_name": "Proveedor ABC SpA", "currency_id": 1, "trx_type": 2, "trx_subtype": 200, "trx_sign": 1 // (el documento completo trae todos los campos del recurso Documents) }, "related_documents": [], // notas de crédito / débito que afectan a este pack (si las hay) "reconciliations": [ { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z", "linked_trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1, "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { /* ver formato según type en Transacciones */ } } } } ] } } } ``` ### Desconciliar — `POST` `/api/financials/unlink-reconciliation` Quita la asociación entre una transacción y un document pack. - `document_pack` *(int)* **(requerido)** — Id numérico del documento. - `financial_trx_id` *(int)* **(requerido)** — Id de la transacción. > La response trae sólo el **financial** recalculado (sin la trx). Si necesitás la trx actualizada, hacé un GET por id. ```json { "success": true, "data": { "financial": { "document_pack": 90000000005953, "total_amount": -19900, // con signo: ventas positivas, gastos negativos (acá, una factura de compra) "reconciled_amount": 0, "status": "PENDING", // PENDING | PARTIALLY_RECONCILED | RECONCILED | DISMISSED "status_at": "2025-04-10T07:12:33.000000Z", "main_document": { "document": 90000000005953, "uuid": "36cdebc2-79b7-402f-ac91-1534d003a91b", "sii_document_type_id": 46, "folio": "12345", "document_date": "2025-04-09", "company_id": 316, "supplier_id": 277, "status_id": 3, "current_ntotal": 19900, "sent_ntotal": 19900, "receiver_rut": "76.543.210-9", "receiver_name": "Proveedor ABC SpA", "currency_id": 1, "trx_type": 2, "trx_subtype": 200, "trx_sign": 1 // (el documento completo trae todos los campos del recurso Documents) }, "related_documents": [], // notas de crédito / débito que afectan a este pack (si las hay) "reconciliations": [ { "document_pack": 90000000005953, "financial_trx_id": 1024, "linked_amount": -19900, "creation_mode": "manual", "created_at": "2025-04-10T07:12:33.000000Z", "linked_trx": { "id": 1024, "company_id": 316, "trx_source_id": 4, "trx_date": "2025-04-10", "amount": -19900, "reconciled_amount": -19900, "status": "RECONCILED", "status_at": "2025-04-10T07:12:33.000000Z", "description": "PAGO PROVEEDOR ABC", "external_id": "BCO-REF-998877", "group_name": "Cartola abril", "flink_document_id": null, "flink_document_type": null, "creation_mode": "manual", "created_at": "2025-04-10T06:41:02.000000Z", "updated_at": "2025-04-10T07:12:33.000000Z", "sign": -1, "trx_source": { "id": 4, "company_id": 316, "type": "bank_account", "name": "Cuenta Corriente Santander", "data": { /* ver formato según type en Transacciones */ } } } } ] } } } ``` > **Errores comunes** > `404 not_found` — no existe esa combinación `(document_pack, financial_trx_id)`. --- # Otros ## Transportes Choferes y vehículos para usar en guías de despacho (DTE 52). Cada transporte es una combinación de RUT del transportista + patente + chofer. ### Listar todos los transportes — `GET` `/api/transports` ```json { "success": true, "data": { "transports": [ { "id": 12, "company_id": 316, "keyname": "ABCD12-juan-perez", "rut": "76.543.210-K", "car_plate": "ABCD12", "driver_rut": "12.345.678-9", "driver_name": "Juan Pérez", "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } ] } } ``` ### Buscar con filtros — `POST` `/api/transports/query` - `page` *(int)* — Página (default 1). - `perPage` *(int)* — Items por página (default 25, máximo 250). - `search` *(string)* — Texto libre. Si una palabra es RUT, busca contra rut o driver_rut. Sino busca en keyname, car_plate, driver_name (parcial). ```json { "success": true, "data": { "items": [ { "id": 12, "company_id": 316, "keyname": "ABCD12-juan-perez", "rut": "76.543.210-K", "car_plate": "ABCD12", "driver_rut": "12.345.678-9", "driver_name": "Juan Pérez", "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } ], "total": 8, "lastPage": 1 } } ``` ### Obtener transporte — `GET` `/api/transports/{id}` Devuelve el transporte. 404 si no existe. ```json { "success": true, "data": { "id": 12, "company_id": 316, "keyname": "ABCD12-juan-perez", "rut": "76.543.210-K", "car_plate": "ABCD12", "driver_rut": "12.345.678-9", "driver_name": "Juan Pérez", "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } } ``` ### Crear transporte — `POST` `/api/transports` - `keyname` *(string (max 255))* — Identificador interno único por empresa. Si no se envía, Wasabil genera uno desde los demás campos. - `rut` *(string)* **(requerido)** — RUT del transportista (la empresa que transporta). - `car_plate` *(string (max 8))* **(requerido)** — Patente del vehículo. - `driver_rut` *(string)* **(requerido)** — RUT del chofer. - `driver_name` *(string (max 30))* **(requerido)** — Nombre del chofer. > Una vez creado, podés usar el `id` del transporte en `dispatch_guide.transport_id` al crear una guía de despacho — Wasabil completa los datos del transporte solo. ```json { "success": true, "data": { "id": 12, "company_id": 316, "keyname": "ABCD12-juan-perez", "rut": "76.543.210-K", "car_plate": "ABCD12", "driver_rut": "12.345.678-9", "driver_name": "Juan Pérez", "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } } ``` ### Actualizar transporte — `PUT` `/api/transports/{id}` - `keyname` *(string)* — Único por empresa. - `rut` *(string)* - `car_plate` *(string (max 8))* - `driver_rut` *(string)* - `driver_name` *(string (max 30))* ```json { "success": true, "data": { "id": 12, "company_id": 316, "keyname": "ABCD12-juan-perez", "rut": "76.543.210-K", "car_plate": "ABCD12", "driver_rut": "12.345.678-9", "driver_name": "Juan Pérez", "created_at": "2025-04-10T06:41:01.000000Z", "updated_at": "2025-04-10T06:41:02.000000Z" } } ``` ### Eliminar transporte — `DELETE` `/api/transports/{id}` Elimina el transporte. ```json { "success": true } ``` --- ## Metafields Definiciones de campos personalizados (metafields) que se pueden adjuntar a documentos, clientes y proveedores. ### Resumen Los metafields son campos personalizados que cada empresa define y luego asigna a documentos, clientes o proveedores. Esta página gestiona las definiciones — la asignación a entidades concretas se hace desde los endpoints de cada recurso (ver [Documentos](https://app.wasabil.com/api-docs/documents), [Clientes](https://app.wasabil.com/api-docs/clients), [Proveedores](https://app.wasabil.com/api-docs/suppliers)). > **Definiciones iniciales** > Al crear una empresa se inicializan automáticamente las definiciones `Centro de Costos`, `Categoría` y `Proyecto` (todas tipo `options`). #### Tipos de metafield ```js { tag: 'Etiqueta booleana (presente / no presente)', text: 'Texto libre', number: 'Numérico', options: 'Selección entre opciones (lista predefinida en la definición)' } ``` #### Scopes (visible_in) Cada definición puede limitarse a uno o más scopes: `document`, `client`, `supplier`. Si no se especifica, se asume aplicable a todos. ### Listar definiciones — `GET` `/api/metafield-definitions` ```json { "success": true, "data": [ { "id": 8, "company_id": 316, "key": "Centro de Costos", "type": "options", "options": "Marketing,Ventas,Admin", // sólo presente cuando type es "options". CSV. "visible_in": "document,client", // null = todos los scopes. CSV de scopes habilitados. "created_at": "...", "updated_at": "..." }, { "id": 9, "company_id": 316, "key": "Notas internas", "type": "text", "options": null, "visible_in": null, "created_at": "...", "updated_at": "..." } ] } ``` ### Crear definición — `POST` `/api/metafield-definitions` Crea una nueva definición. Si ya existe una con el mismo `key` y el mismo `type`, devuelve la existente (no falla). Si existe con otro type, falla. - `key` *(string)* **(requerido)** — Nombre del metafield. Único por empresa. Sensible a mayúsculas pero se normaliza. - `type` *(string)* **(requerido)** — tag | text | number | options - `options` *(string | array)* — Sólo para type "options". Lista de valores válidos. Acepta string CSV o array. - `visible_in` *(string | array)* — Scopes donde se permite asignar este metafield. document | client | supplier. CSV o array. Si se omite, vale para todos. ```json { "success": true, "data": { "id": 8, "company_id": 316, "key": "Centro de Costos", "type": "options", "options": "Marketing,Ventas,Admin", // sólo presente cuando type es "options". CSV. "visible_in": "document,client", // null = todos los scopes. CSV de scopes habilitados. "created_at": "...", "updated_at": "..." } } ``` ### Actualizar definición — `PUT` `/api/metafield-definitions/{key}` Sólo permite cambiar `options` (para type "options") y `visible_in`. El `type` y el `key` no se pueden modificar — para eso hay que eliminar y recrear. - `options` *(string | array)* — Nueva lista. Si una opción usada antes ya no está, sus asignaciones se borran. - `visible_in` *(string | array)* — Nuevo set de scopes habilitados. ```json { "success": true, "data": { "id": 8, "company_id": 316, "key": "Centro de Costos", "type": "options", "options": "Marketing,Ventas,Admin", // sólo presente cuando type es "options". CSV. "visible_in": "document,client", // null = todos los scopes. CSV de scopes habilitados. "created_at": "...", "updated_at": "..." } } ``` ### Eliminar definición — `DELETE` `/api/metafield-definitions/{key}` Elimina la definición y todas sus asignaciones en documentos, clientes y proveedores. Sin error si no existe. ```json { "success": true } ``` --- # Referencia ## Referencia Tablas de constantes, enums y catálogos referenciados desde otros endpoints (códigos SII, bancos, comunas, tipos de cuenta, etc). ### Códigos de tipo de documento (SII) Códigos SII usados en el campo `sii_document_type_id` al crear documentos, y en `references[].document_type` al referenciar otros documentos. #### Documentos electrónicos Cada uno tiene su propia sección con campos y ejemplo en "Crear documento". | Código | Nombre | | --- | --- | | `33` | Factura de Venta | | `34` | Factura Exenta | | `39` | Boleta de Venta | | `41` | Boleta Exenta | | `46` | Factura de Compra | | `52` | Guía de Despacho | | `56` | Nota de Débito | | `61` | Nota de Crédito | | `110` | Factura de Exportación | | `111` | Nota de Débito de Exportación | | `112` | Nota de Crédito de Exportación | #### Códigos custom (internos Wasabil) Tipos especiales no soportados directamente por DTE pero que Wasabil maneja internamente. `200` es el único que se puede crear vía la API pública (boleta de honorarios de terceros — emitida por el portal SII de honorarios). | Código | Nombre | Notas | | --- | --- | --- | | `200` | Boleta de Honorarios de Tercero | Emisión vía SII Scrapper. Ver tipo 200 en "Crear documento". | | `201` | Boleta de Honorarios (propia) | Sólo lectura — recibidas desde el SII. | | `900` | Sale Receipt Group | Agrupador interno de boletas (resúmenes RCV). | | `901` | Credit Note Group | Agrupador interno de notas de crédito. | #### Códigos de referencia (references[].document_type) Códigos válidos para el campo `document_type` dentro de cada item de `references`. Pueden ser cualquiera de los tipos de documento listados arriba, o uno de los códigos no-DTE que el SII reconoce como referencia: | Código | Significado | | --- | --- | | `"801"` | Orden de Compra (OC) | | `"802"` | Nota de Pedido | | `"803"` | Contrato | | `"HES"` | Hoja de Entrada de Servicios (no numérico, va literal) | | `"48"` | Comprobante de Pago Electrónico | ### Estados del documento ```js { PENDING: 6, // pendiente de emisión PROCESSING: 2, // en proceso de emisión ISSUED: 3, // emitido al SII FAILED: 4 // falló la emisión } ``` ### Tipos y subtipos de transacción del documento Clasificación interna usada en los campos `trx_type` y `trx_subtype` de cada documento. ```js { SALE: 1, // venta (factura, boleta, NC/ND de venta, exportación) EXPENSE: 2, // gasto (factura de compra, BTE) DISPATCH: 3 // guía de despacho } ``` ```js { // ── Sale (trx_type 1) ───────────────────────────────────── SALE: 100, SALE_DEBIT_NOTE: 101, SALE_CREDIT_NOTE: 102, RECEIPT: 110, RECEIPT_DEBIT_NOTE: 111, RECEIPT_CREDIT_NOTE: 112, RECEIVED_PURCHASE: 120, RECEIVED_PURCHASE_DEBIT_NOTE: 121, RECEIVED_PURCHASE_CREDIT_NOTE: 122, EXPORT_SALE: 130, EXPORT_DEBIT_NOTE: 131, EXPORT_CREDIT_NOTE: 132, HONORARIUM_RECEIPT: 140, // ── Expense (trx_type 2) ────────────────────────────────── PURCHASE: 200, PURCHASE_DEBIT_NOTE: 201, PURCHASE_CREDIT_NOTE: 202, RECEIVED_SALE: 210, RECEIVED_SALE_DEBIT_NOTE: 211, RECEIVED_SALE_CREDIT_NOTE: 212, THIRD_HONORARIUM_RECEIPT: 220, RECEIVED_HONORARIUM_RECEIPT: 221, // ── Dispatch (trx_type 3) ───────────────────────────────── DISPATCH_GUIDE: 300, RECEIVED_DISPATCH_GUIDE: 310 } ``` El campo `trx_sign` (1 / -1) define el signo del documento — vale `-1` sólo para notas de crédito de anulación total. ### Tipos de entidad (entity_type) Define si un cliente/proveedor es persona o empresa, local o extranjera. Se autodetecta desde el RUT cuando no se envía explícitamente. ```js { PERSON_LOCAL: 'PL', // persona natural chilena PERSON_FOREIGN: 'PF', // persona natural extranjera COMPANY_LOCAL: 'CL', // empresa chilena COMPANY_FOREIGN: 'CF' // empresa extranjera (RUT genérico 55555555-5) } ``` ### Estados de intercambio (acuse de recibo) ```js { PENDING: 'PENDING', // sin acuse ERM: 'ERM', // aceptado (acuse de recibo) RFT: 'RFT' // rechazado } ``` ### Códigos de error de emisión Códigos que pueden aparecer en `error_code` cuando un documento queda **Pendiente** o **Fallido**. ```js { UNKNOWN: 'unknown', ISSUER_NOT_CONFIGURED: 'issuer_not_configured', ISSUER_NOT_READY: 'issuer_not_ready', DOCUMENT_TYPE_DISABLED: 'document_type_disabled', INACTIVE_PLAN: 'inactive_plan', RELATED_DOCUMENT_NOT_ISSUED: 'related_document_not_issued', PLAN_LIMIT_REACHED: 'plan_limit_reached', DOCUMENT_DUPLICATED: 'document_duplicated', INVALID_DOCUMENT_DATE: 'invalid_document_date', UNSUPPORTED_DOCUMENT_TYPE: 'unsupported_document_type', UNSUPPORTED_CURRENCY: 'unsupported_currency', REJECTED_BY_SII: 'rejected_by_sii', NEED_FOLIOS: 'need_folios', CERT_EXPIRED: 'cert_expired', INVALID_CREDENTIALS: 'invalid_credentials', // específicos del scrapper del SII (portal SII vía Puppeteer) SII_SCRAPPER_UNSUPPORTED_DOCUMENT_TYPE: 'sii_scrapper_unsupported_document_type', SII_SCRAPPER_SYSTEM_UNAVAILABLE: 'sii_scrapper_system_unavailable', SII_SCRAPPER_UNKNOWN: 'sii_scrapper_unknown', SII_SCRAPPER_COMPANY_NOT_FOUND: 'sii_scrapper_company_not_found', SII_SCRAPPER_RECEIVER_NOT_FOUND: 'sii_scrapper_receiver_not_found', SII_SCRAPPER_UNSUPPORTED_PAYMENT_METHOD: 'sii_scrapper_unsupported_payment_method', SII_SCRAPPER_INVALID_SIGN_PASSWORD: 'sii_scrapper_invalid_sign_password', SII_SCRAPPER_CREDIT_NOTE_RELATED_DOCUMENT_NOT_FOUND: 'sii_scrapper_credit_note_related_document_not_found', SII_SCRAPPER_EBOLETA_LOGIN_FAILED: 'sii_scrapper_eboleta_login_failed', SII_SCRAPPER_EBOLETA_COMPANY_NOT_FOUND: 'sii_scrapper_eboleta_company_not_found', SII_SCRAPPER_LOGIN_FAILED: 'sii_scrapper_login_failed' } ``` ### Estados de transacción bancaria Valor del campo `status` en `FinancialTrx` y en `DocumentFinancial`. Ver Transacciones y Conciliación. ```js { PENDING: 'PENDING', // sin conciliar PARTIALLY_RECONCILED: 'PARTIALLY_RECONCILED', // conciliado parcialmente RECONCILED: 'RECONCILED', // totalmente conciliado DISMISSED: 'DISMISSED' // descartado (no se va a conciliar) } ``` ### Tipos de fuente de transacción + campos de data Para `POST /api/financials/trx-sources` el campo `data` varía según `type`. Valores válidos: ```js { bank_account: { bankId, bankName, accountType, accountNumber, accountCategory }, credit_card: { brand, lastDigits }, cash: null, virtual_wallet: { provider }, payment_terminal: { provider } } ``` ```js [ 'CUENTA_CORRIENTE', 'CUENTA_AHORRO', 'LINEA_CREDITO', 'CUENTA_VISTA' ] ``` ```js [ 'PERSONAL', 'BUSINESS_ENTREPRENEUR', 'BUSINESS_EMPRESAS' ] ``` ```js [ 'Visa', 'Mastercard', 'American Express' ] ``` ```js [ 'mercado_pago' ] ``` ```js [ 'getnet', 'transbank', 'klap', 'sumup', 'toku', 'tuu', 'fintoc' ] ``` ### Bancos para trx_sources (bankId) Catálogo de `bankId` válidos cuando `type` es `bank_account`. Incluye también algunos "servicios" (AFC, SII, etc.) que aparecen como origen de transferencias en cartolas bancarias. | bankId | Nombre | | --- | --- | | `cl_services_afc` | Administradora de Fondos de Cesantía | | `cl_services_afcbiometrics` | Administradora de Fondos de Cesantía - Biométrico | | `cl_services_cmf` | Comisión para el Mercado Financiero | | `cl_services_rndpa` | Registro Nacional de Deudores de Pensión de Alimentos | | `cl_services_sii` | Servicio de Impuestos Internos | | `cl_services_tgr` | Tesorería General de la República | | `cl_banking_business_bancoestado` | Banco Estado - Empresas | | `cl_banking_business_bci` | BCI - Empresas | | `cl_banking_business_banconexion` | Banco de Chile - Empresas (Banconexión) | | `cl_banking_business_bancosantander` | Banco Santander - Empresas (OfficeBanking) | | `cl_banking_business_bancobice` | Banco BICE - Empresas | | `cl_banking_business_bancoconsorcio` | Banco Consorcio - Empresas | | `cl_banking_business_bancointernacional` | Banco Internacional - Empresas | | `cl_banking_business_bancoitau` | Banco Itaú - Empresas | | `cl_banking_business_scotiabank` | Scotiabank - Empresas | | `cl_banking_business_bancosecurity` | Banco Security - Empresas | | `cl_banking_entrepreneur_bci` | BCI - Empresarios | | `cl_banking_personal_bancoestado` | Banco Estado - Personas | | `cl_banking_personal_bci` | BCI - Personas | | `cl_banking_personal_bancochile` | Banco de Chile - Personas | | `cl_banking_personal_bancosantander` | Banco Santander - Personas | | `cl_banking_personal_bancobice` | Banco BICE - Personas | | `cl_banking_personal_bancoconsorcio` | Banco Consorcio - Personas | | `cl_banking_personal_bancoitau` | Banco Itaú - Personas | | `cl_banking_personal_scotiabank` | Scotiabank - Personas | | `cl_banking_personal_bancosecurity` | Banco Security - Personas | | `cl_banking_personal_bancocoopeuch` | Banco Coopeuch | | `cl_banking_personal_bancofalabella` | Banco Falabella | | `cl_banking_personal_bancoripley` | Banco Ripley | ### Bancos para cuentas de proveedores (bank_code) Códigos válidos para `bank_code` al setear la cuenta bancaria de un proveedor (`PUT /api/suppliers/{uid}/bank-account`). También disponibles en `GET /api/suppliers/bank-accounts/options`. > Estos códigos son **numéricos** y específicos del módulo de proveedores — distintos de los `bankId` string que usa `trx_sources`. | bank_code | Banco | | --- | --- | | `1` | Banco de Chile | | `9` | Banco Internacional | | `12` | BancoEstado | | `14` | Scotiabank | | `16` | BCI | | `17` | Banco do Brasil | | `28` | BICE | | `31` | HSBC Bank | | `37` | Banco Santander | | `39` | Itaú | | `49` | Banco Security | | `51` | Banco Falabella | | `53` | Banco Ripley | | `55` | Banco Consorcio | | `59` | BBVA | | `267` | Transbank | | `504` | Scotiabank Azul | | `507` | Banco del Desarrollo | | `672` | Banco Coopeuch | | `729` | Los Heroes | | `730` | Tenpo | | `732` | TAPP Caja Los Andes | | `738` | Global66 | | `741` | Copec | | `874` | Mercado Pago | | `875` | Mercado Pago Emisora | | `876` | Getnet | | `1608` | Bemmbo Pay | ### Tipos de cuenta para proveedores (account_type) | account_type | Tipo | | --- | --- | | `1` | Cuenta Corriente | | `2` | Cuenta Vista | | `3` | Cuenta de Ahorro | | `4` | Cuenta RUT | La moneda válida (`currency`) es por ahora sólo `CLP`. ### Comunas válidas (receiver_comuna) Listado oficial de las 345 comunas de Chile (tabla `locations`). Cuando el cliente/proveedor/receptor es persona o empresa **local** (`entity_type` PL o CL), la comuna que enviás tiene que existir en esta tabla — sino el endpoint devuelve `422 validation`. La columna *Ciudad principal* es la `city` sugerida por defecto cuando sólo enviás `comuna`. > Para clientes/proveedores extranjeros (entity_type PF o CF) el campo `comuna` es libre — no se valida contra esta tabla. | Región | Comuna | Ciudad principal | | --- | --- | --- | | Región de Antofagasta | Antofagasta | Antofagasta | | Región de Antofagasta | Calama | Calama | | Región de Antofagasta | María Elena | María Elena | | Región de Antofagasta | Mejillones | Mejillones | | Región de Antofagasta | Ollague | Ollagüe | | Región de Antofagasta | San Pedro de Atacama | San Pedro de Atacama | | Región de Antofagasta | Sierra Gorda | Baquedano | | Región de Antofagasta | Taltal | Taltal | | Región de Antofagasta | Tocopilla | Tocopilla | | Región de Arica y Parinacota | Arica | Arica | | Región de Arica y Parinacota | Camarones | Camarones | | Región de Arica y Parinacota | General Lagos | Visviri | | Región de Arica y Parinacota | Putre | Putre | | Región de Atacama | Alto del Carmen | Alto del Carmen | | Región de Atacama | Caldera | Caldera | | Región de Atacama | Chañaral | Chañaral | | Región de Atacama | Copiapó | Copiapó | | Región de Atacama | Diego de Almagro | Diego de Almagro | | Región de Atacama | Freirina | Freirina | | Región de Atacama | Huasco | Huasco | | Región de Atacama | Tierra Amarilla | Tierra Amarilla | | Región de Atacama | Vallenar | Vallenar | | Región de Aysén del General Carlos Ibáñez del Campo | Aysen | Puerto Aysén | | Región de Aysén del General Carlos Ibáñez del Campo | Chile Chico | Chile Chico | | Región de Aysén del General Carlos Ibáñez del Campo | Cisnes | Puerto Cisnes | | Región de Aysén del General Carlos Ibáñez del Campo | Cochrane | Cochrane | | Región de Aysén del General Carlos Ibáñez del Campo | Coyhaique | Coyhaique | | Región de Aysén del General Carlos Ibáñez del Campo | Guaitecas | Melinka | | Región de Aysén del General Carlos Ibáñez del Campo | Lago Verde | Lago Verde | | Región de Aysén del General Carlos Ibáñez del Campo | O'Higgins | Villa O'Higgins | | Región de Aysén del General Carlos Ibáñez del Campo | Río Ibáñez | Puerto Ingeniero Ibáñez | | Región de Aysén del General Carlos Ibáñez del Campo | Tortel | Caleta Tortel | | Región de Coquimbo | Andacollo | Andacollo | | Región de Coquimbo | Canela | Canela Baja | | Región de Coquimbo | Combarbalá | Combarbalá | | Región de Coquimbo | Coquimbo | Coquimbo | | Región de Coquimbo | Illapel | Illapel | | Región de Coquimbo | La Higuera | La Higuera | | Región de Coquimbo | La Serena | La Serena | | Región de Coquimbo | Los Vilos | Los Vilos | | Región de Coquimbo | Monte Patria | Monte Patria | | Región de Coquimbo | Ovalle | Ovalle | | Región de Coquimbo | Paihuano | Paihuano | | Región de Coquimbo | Punitaqui | Punitaqui | | Región de Coquimbo | Río Hurtado | Río Hurtado | | Región de Coquimbo | Salamanca | Salamanca | | Región de Coquimbo | Vicuña | Vicuña | | Región de La Araucanía | Angol | Angol | | Región de La Araucanía | Carahue | Carahue | | Región de La Araucanía | Cholchol | Cholchol | | Región de La Araucanía | Collipulli | Collipulli | | Región de La Araucanía | Cunco | Cunco | | Región de La Araucanía | Curacautín | Curacautín | | Región de La Araucanía | Curarrehue | Curarrehue | | Región de La Araucanía | Ercilla | Ercilla | | Región de La Araucanía | Freire | Freire | | Región de La Araucanía | Galvarino | Galvarino | | Región de La Araucanía | Gorbea | Gorbea | | Región de La Araucanía | Lautaro | Lautaro | | Región de La Araucanía | Loncoche | Loncoche | | Región de La Araucanía | Lonquimay | Lonquimay | | Región de La Araucanía | Los Sauces | Los Sauces | | Región de La Araucanía | Lumaco | Lumaco | | Región de La Araucanía | Melipeuco | Melipeuco | | Región de La Araucanía | Nueva Imperial | Nueva Imperial | | Región de La Araucanía | Padre Las Casas | Padre Las Casas | | Región de La Araucanía | Perquenco | Perquenco | | Región de La Araucanía | Pitrufquén | Pitrufquén | | Región de La Araucanía | Pucón | Pucón | | Región de La Araucanía | Purén | Purén | | Región de La Araucanía | Renaico | Renaico | | Región de La Araucanía | Saavedra | Puerto Saavedra | | Región de La Araucanía | Temuco | Temuco | | Región de La Araucanía | Teodoro Schmidt | Teodoro Schmidt | | Región de La Araucanía | Toltén | Nueva Toltén | | Región de La Araucanía | Traiguén | Traiguén | | Región de La Araucanía | Victoria | Victoria | | Región de La Araucanía | Vilcún | Vilcún | | Región de La Araucanía | Villarrica | Villarrica | | Región de Los Lagos | Ancud | Ancud | | Región de Los Lagos | Calbuco | Calbuco | | Región de Los Lagos | Castro | Castro | | Región de Los Lagos | Chaitén | Chaitén | | Región de Los Lagos | Chonchi | Chonchi | | Región de Los Lagos | Cochamó | Cochamó | | Región de Los Lagos | Curaco de Vélez | Curaco de Vélez | | Región de Los Lagos | Dalcahue | Dalcahue | | Región de Los Lagos | Fresia | Fresia | | Región de Los Lagos | Frutillar | Frutillar | | Región de Los Lagos | Futaleufú | Futaleufú | | Región de Los Lagos | Hualaihué | Hornopirén | | Región de Los Lagos | Llanquihue | Llanquihue | | Región de Los Lagos | Los Muermos | Los Muermos | | Región de Los Lagos | Maullín | Maullín | | Región de Los Lagos | Osorno | Osorno | | Región de Los Lagos | Palena | Palena | | Región de Los Lagos | Puerto Montt | Puerto Montt | | Región de Los Lagos | Puerto Octay | Puerto Octay | | Región de Los Lagos | Puerto Varas | Puerto Varas | | Región de Los Lagos | Puqueldón | Puqueldón | | Región de Los Lagos | Purranque | Purranque | | Región de Los Lagos | Puyehue | Entre Lagos | | Región de Los Lagos | Queilén | Queilén | | Región de Los Lagos | Quellón | Quellón | | Región de Los Lagos | Quemchi | Quemchi | | Región de Los Lagos | Quinchao | Achao | | Región de Los Lagos | Río Negro | Río Negro | | Región de Los Lagos | San Juan de la Costa | Puaucho | | Región de Los Lagos | San Pablo | San Pablo | | Región de Los Ríos | Corral | Corral | | Región de Los Ríos | Futrono | Futrono | | Región de Los Ríos | La Unión | La Unión | | Región de Los Ríos | Lago Ranco | Lago Ranco | | Región de Los Ríos | Lanco | Lanco | | Región de Los Ríos | Los Lagos | Los Lagos | | Región de Los Ríos | Máfil | Máfil | | Región de Los Ríos | Mariquina | San José de la Mariquina | | Región de Los Ríos | Paillaco | Paillaco | | Región de Los Ríos | Panguipulli | Panguipulli | | Región de Los Ríos | Río Bueno | Río Bueno | | Región de Los Ríos | Valdivia | Valdivia | | Región de Magallanes y la Antártica Chilena | Antártica | Base Eduardo Frei Montalva | | Región de Magallanes y la Antártica Chilena | Cabo de Hornos | Puerto Williams | | Región de Magallanes y la Antártica Chilena | Laguna Blanca | Villa Tehuelches | | Región de Magallanes y la Antártica Chilena | Porvenir | Porvenir | | Región de Magallanes y la Antártica Chilena | Primavera | Cerro Sombrero | | Región de Magallanes y la Antártica Chilena | Puerto Natales | Puerto Natales | | Región de Magallanes y la Antártica Chilena | Punta Arenas | Punta Arenas | | Región de Magallanes y la Antártica Chilena | Río Verde | Villa Ponsomby | | Región de Magallanes y la Antártica Chilena | San Gregorio | Villa Punta Delgada | | Región de Magallanes y la Antártica Chilena | Timaukel | Villa Cameron | | Región de Magallanes y la Antártica Chilena | Torres de Paine | Cerro Castillo | | Región de Ñuble | Bulnes | Bulnes | | Región de Ñuble | Chillán | Chillán | | Región de Ñuble | Chillán Viejo | Chillán Viejo | | Región de Ñuble | Cobquecura | Cobquecura | | Región de Ñuble | Coelemu | Coelemu | | Región de Ñuble | Coihueco | Coihueco | | Región de Ñuble | El Carmen | El Carmen | | Región de Ñuble | Ninhue | Ninhue | | Región de Ñuble | Pemuco | Pemuco | | Región de Ñuble | Pinto | Pinto | | Región de Ñuble | Portezuelo | Portezuelo | | Región de Ñuble | Quillón | Quillón | | Región de Ñuble | Quirihue | Quirihue | | Región de Ñuble | Ránquil | Ránquil | | Región de Ñuble | San Carlos | San Carlos | | Región de Ñuble | San Fabián | San Fabián | | Región de Ñuble | San Gregorio de Niquen | San Gregorio de Ñiquén | | Región de Ñuble | San Ignacio | San Ignacio | | Región de Ñuble | San Nicolás | San Nicolás | | Región de Ñuble | Trehuaco | Trehuaco | | Región de Ñuble | Yungay | Yungay | | Región de Tarapacá | Alto Hospicio | Alto Hospicio | | Región de Tarapacá | Camiña | Camiña | | Región de Tarapacá | Colchane | Colchane | | Región de Tarapacá | Huara | Huara | | Región de Tarapacá | Iquique | Iquique | | Región de Tarapacá | Pica | Pica | | Región de Tarapacá | Pozo Almonte | Pozo Almonte | | Región de Valparaíso | Algarrobo | Algarrobo | | Región de Valparaíso | Cabildo | Cabildo | | Región de Valparaíso | Calle Larga | Calle Larga | | Región de Valparaíso | Cartagena | Cartagena | | Región de Valparaíso | Casablanca | Casablanca | | Región de Valparaíso | Catemu | Catemu | | Región de Valparaíso | Con Con | Concón | | Región de Valparaíso | El Quisco | El Quisco | | Región de Valparaíso | El Tabo | El Tabo | | Región de Valparaíso | Hijuelas | Hijuelas | | Región de Valparaíso | Isla de Pascua | Hanga Roa | | Región de Valparaíso | Juan Fernández | San Juan Bautista | | Región de Valparaíso | La Calera | La Calera | | Región de Valparaíso | La Cruz | La Cruz | | Región de Valparaíso | La Ligua | La Ligua | | Región de Valparaíso | Limache | Limache | | Región de Valparaíso | Llay-llay | Llay-Llay | | Región de Valparaíso | Los Andes | Los Andes | | Región de Valparaíso | Nogales | Nogales | | Región de Valparaíso | Olmué | Olmué | | Región de Valparaíso | Panquehue | Panquehue | | Región de Valparaíso | Papudo | Papudo | | Región de Valparaíso | Petorca | Petorca | | Región de Valparaíso | Puchuncaví | Puchuncaví | | Región de Valparaíso | Putaendo | Putaendo | | Región de Valparaíso | Quillota | Quillota | | Región de Valparaíso | Quilpué | Quilpué | | Región de Valparaíso | Quintero | Quintero | | Región de Valparaíso | Rinconada | Rinconada | | Región de Valparaíso | San Antonio | San Antonio | | Región de Valparaíso | San Esteban | San Esteban | | Región de Valparaíso | San Felipe | San Felipe | | Región de Valparaíso | Santa María | Santa María | | Región de Valparaíso | Santo Domingo | Santo Domingo | | Región de Valparaíso | Valparaíso | Valparaíso | | Región de Valparaíso | Villa Alemana | Villa Alemana | | Región de Valparaíso | Viña del Mar | Viña del Mar | | Región de Valparaíso | Zapallar | Zapallar | | Región del Biobío | Alto Biobío | Ralco | | Región del Biobío | Antuco | Antuco | | Región del Biobío | Arauco | Arauco | | Región del Biobío | Cabrero | Cabrero | | Región del Biobío | Cañete | Cañete | | Región del Biobío | Chiguayante | Chiguayante | | Región del Biobío | Contulmo | Contulmo | | Región del Biobío | Coronel | Coronel | | Región del Biobío | Curanilahue | Curanilahue | | Región del Biobío | Florida | Florida | | Región del Biobío | Hualpén | Hualpén | | Región del Biobío | Hualqui | Hualqui | | Región del Biobío | Laja | Laja | | Región del Biobío | Lebu | Lebu | | Región del Biobío | Los Álamos | Los Álamos | | Región del Biobío | Los Ángeles | Los Ángeles | | Región del Biobío | Lota | Lota | | Región del Biobío | Mulchén | Mulchén | | Región del Biobío | Nacimiento | Nacimiento | | Región del Biobío | Negrete | Negrete | | Región del Biobío | Penco | Penco | | Región del Biobío | Quilaco | Quilaco | | Región del Biobío | Quilleco | Quilleco | | Región del Biobío | San Pedro de la Paz | San Pedro de la Paz | | Región del Biobío | San Rosendo | San Rosendo | | Región del Biobío | Santa Bárbara | Santa Bárbara | | Región del Biobío | Santa Juana | Santa Juana | | Región del Biobío | Talcahuano | Talcahuano | | Región del Biobío | Tirúa | Tirúa | | Región del Biobío | Tomé | Tomé | | Región del Biobío | Tucapel | Huépil | | Región del Biobío | Yumbel | Yumbel | | Región del Libertador Bernardo O'Higgins | Chépica | Chépica | | Región del Libertador Bernardo O'Higgins | Chimbarongo | Chimbarongo | | Región del Libertador Bernardo O'Higgins | Codegua | Codegua | | Región del Libertador Bernardo O'Higgins | Coínco | Coínco | | Región del Libertador Bernardo O'Higgins | Coltauco | Coltauco | | Región del Libertador Bernardo O'Higgins | Doñihue | Doñihue | | Región del Libertador Bernardo O'Higgins | Graneros | Graneros | | Región del Libertador Bernardo O'Higgins | La Estrella | La Estrella | | Región del Libertador Bernardo O'Higgins | Las Cabras | Las Cabras | | Región del Libertador Bernardo O'Higgins | Litueche | Litueche | | Región del Libertador Bernardo O'Higgins | Lolol | Lolol | | Región del Libertador Bernardo O'Higgins | Machalí | Machalí | | Región del Libertador Bernardo O'Higgins | Malloa | Malloa | | Región del Libertador Bernardo O'Higgins | Marchigüe | Marchigüe | | Región del Libertador Bernardo O'Higgins | Nancagua | Nancagua | | Región del Libertador Bernardo O'Higgins | Navidad | Navidad | | Región del Libertador Bernardo O'Higgins | Olivar | Olivar | | Región del Libertador Bernardo O'Higgins | Palmilla | Palmilla | | Región del Libertador Bernardo O'Higgins | Paredones | Paredones | | Región del Libertador Bernardo O'Higgins | Peralillo | Peralillo | | Región del Libertador Bernardo O'Higgins | Peumo | Peumo | | Región del Libertador Bernardo O'Higgins | Pichidegua | Pichidegua | | Región del Libertador Bernardo O'Higgins | Pichilemu | Pichilemu | | Región del Libertador Bernardo O'Higgins | Placilla | Placilla | | Región del Libertador Bernardo O'Higgins | Pumanque | Pumanque | | Región del Libertador Bernardo O'Higgins | Quinta Tilcoco | Quinta de Tilcoco | | Región del Libertador Bernardo O'Higgins | Rancagua | Rancagua | | Región del Libertador Bernardo O'Higgins | Rengo | Rengo | | Región del Libertador Bernardo O'Higgins | Requínoa | Requínoa | | Región del Libertador Bernardo O'Higgins | San Fernando | San Fernando | | Región del Libertador Bernardo O'Higgins | San Francisco de Mostazal | San Francisco de Mostazal | | Región del Libertador Bernardo O'Higgins | San Vicente | San Vicente de Tagua Tagua | | Región del Libertador Bernardo O'Higgins | Santa Cruz | Santa Cruz | | Región del Maule | Cauquenes | Cauquenes | | Región del Maule | Chanco | Chanco | | Región del Maule | Colbún | Colbún | | Región del Maule | Constitución | Constitución | | Región del Maule | Curepto | Curepto | | Región del Maule | Curicó | Curicó | | Región del Maule | Empedrado | Empedrado | | Región del Maule | Hualañé | Hualañé | | Región del Maule | Licantén | Licantén | | Región del Maule | Linares | Linares | | Región del Maule | Longaví | Longaví | | Región del Maule | Maule | Maule | | Región del Maule | Molina | Molina | | Región del Maule | Parral | Parral | | Región del Maule | Pelarco | Pelarco | | Región del Maule | Pelluhue | Pelluhue | | Región del Maule | Pencahue | Pencahue | | Región del Maule | Rauco | Rauco | | Región del Maule | Retiro | Retiro | | Región del Maule | Río Claro | Cumpeo | | Región del Maule | Romeral | Romeral | | Región del Maule | Sagrada Familia | Sagrada Familia | | Región del Maule | San Clemente | San Clemente | | Región del Maule | San Javier | San Javier | | Región del Maule | San Rafael | San Rafael | | Región del Maule | Talca | Talca | | Región del Maule | Teno | Teno | | Región del Maule | Vichuquén | Vichuquén | | Región del Maule | Villa Alegre | Villa Alegre | | Región del Maule | Yerbas Buenas | Yerbas Buenas | | Región Metropolitana de Santiago | Alhué | Alhué | | Región Metropolitana de Santiago | Buin | Buin | | Región Metropolitana de Santiago | Calera de Tango | Calera de Tango | | Región Metropolitana de Santiago | Cerrillos | Cerrillos | | Región Metropolitana de Santiago | Cerro Navia | Cerro Navia | | Región Metropolitana de Santiago | Colina | Colina | | Región Metropolitana de Santiago | Conchalí | Conchalí | | Región Metropolitana de Santiago | Curacaví | Curacaví | | Región Metropolitana de Santiago | El Bosque | El Bosque | | Región Metropolitana de Santiago | El Monte | El Monte | | Región Metropolitana de Santiago | Estación Central | Estación Central | | Región Metropolitana de Santiago | Huechuraba | Huechuraba | | Región Metropolitana de Santiago | Independencia | Independencia | | Región Metropolitana de Santiago | Isla de Maipo | Isla de Maipo | | Región Metropolitana de Santiago | La Cisterna | La Cisterna | | Región Metropolitana de Santiago | La Florida | La Florida | | Región Metropolitana de Santiago | La Granja | La Granja | | Región Metropolitana de Santiago | La Pintana | La Pintana | | Región Metropolitana de Santiago | La Reina | La Reina | | Región Metropolitana de Santiago | Lampa | Lampa | | Región Metropolitana de Santiago | Las Condes | Las Condes | | Región Metropolitana de Santiago | Lo Barnechea | Lo Barnechea | | Región Metropolitana de Santiago | Lo Espejo | Lo Espejo | | Región Metropolitana de Santiago | Lo Prado | Lo Prado | | Región Metropolitana de Santiago | Macul | Macul | | Región Metropolitana de Santiago | Maipú | Maipú | | Región Metropolitana de Santiago | María Pinto | María Pinto | | Región Metropolitana de Santiago | Melipilla | Melipilla | | Región Metropolitana de Santiago | Ñuñoa | Ñuñoa | | Región Metropolitana de Santiago | Padre Hurtado | Padre Hurtado | | Región Metropolitana de Santiago | Paine | Paine | | Región Metropolitana de Santiago | Pedro Aguirre Cerda | Pedro Aguirre Cerda | | Región Metropolitana de Santiago | Peñaflor | Peñaflor | | Región Metropolitana de Santiago | Peñalolén | Peñalolén | | Región Metropolitana de Santiago | Pirque | Pirque | | Región Metropolitana de Santiago | Providencia | Providencia | | Región Metropolitana de Santiago | Pudahuel | Pudahuel | | Región Metropolitana de Santiago | Puente Alto | Puente Alto | | Región Metropolitana de Santiago | Quilicura | Quilicura | | Región Metropolitana de Santiago | Quinta Normal | Quinta Normal | | Región Metropolitana de Santiago | Recoleta | Recoleta | | Región Metropolitana de Santiago | Renca | Renca | | Región Metropolitana de Santiago | San Bernardo | San Bernardo | | Región Metropolitana de Santiago | San Joaquín | San Joaquín | | Región Metropolitana de Santiago | San José de Maipo | San José de Maipo | | Región Metropolitana de Santiago | San Miguel | San Miguel | | Región Metropolitana de Santiago | San Pedro de Melipilla | San Pedro | | Región Metropolitana de Santiago | San Ramón | San Ramón | | Región Metropolitana de Santiago | Santiago | Santiago | | Región Metropolitana de Santiago | Talagante | Talagante | | Región Metropolitana de Santiago | Til-til | Tiltil | | Región Metropolitana de Santiago | Vitacura | Vitacura | ---