Scopes
Cada API key tiene asociada una lista de scopes que delimitan qué endpoints puede invocar. El servidor verifica el scope requerido por cada endpoint y devuelve 403 Forbidden si la API key no lo tiene.
Scopes disponibles
| Scope | Qué habilita |
|---|---|
facturas:read | GET /facturas/{clave}, GET /facturas/{clave}/pdf, GET /facturas/{clave}/xml, GET /consecutivos/proximo |
facturas:write | POST /facturas para FE (01) y TE (04), y POST /facturas/{clave}/email |
notas:write | POST /facturas para NC (03) y ND (02) |
facturas:anular | DELETE /facturas/{clave} |
facturas-compra:write | POST /facturas-compra |
facturas-compra:read | GET /facturas-compra/{clave} y GET /facturas-compra/{clave}/pdf |
catalogo:write | POST /productos, POST /clientes, POST /marcas |
catalogo:read | GET /productos/{codigo}, GET /clientes/{identificacion}, GET /catalogos/* |
mensajes:write | POST /mensajes-receptor (aceptar o rechazar la factura de un proveedor) |
mensajes:read | GET /mensajes-receptor/{clave} |
Cambio incompatible desde v1.2: emitir NC o ND ya no lo habilita
facturas:write. Una key con solofacturas:writerecibe403al enviartipo: "NotaCredito"o"NotaDebito". Ver el changelog.
Por qué NC/ND tienen su propio scope
POST /facturas es un único endpoint, pero según el tipo hace dos cosas muy distintas:
- FE/TE: registra una venta nueva. Es la operación cotidiana.
- NC/ND: modifica un comprobante ya emitido — típicamente devuelve dinero (NC) o cobra un monto adicional al cliente (ND) sobre un comprobante ya remitido a Hacienda. Es un permiso más sensible: una key comprometida que solo emite no puede anular ventas ajenas retroactivamente; una que además emite NC, sí.
Separar FE de TE, en cambio, no aportaría protección alguna: son la misma operación (registrar una venta) con o sin cliente identificado — dividir sus scopes solo agregaría fricción sin ganar seguridad.
facturas-compra:* es un par de scopes aparte porque la operación es distinta en su raíz: el comprobante se emite a nombre de un tercero (el proveedor), no de una venta propia. Mezclarlo con los scopes de venta permitiría que una key de POS normal emitiera, de forma involuntaria, comprobantes fiscales atribuidos a un proveedor. Ver Emitir factura de compra.
mensajes:* va aparte porque no corresponde a una venta: aceptar o rechazar la factura de un proveedor determina si esa compra se toma como gasto, y se emite a nombre propio contra un comprobante ajeno. Una key destinada a facturar no debería poder responder ante el fisco por las compras del comercio. Ver Aceptar o rechazar la factura de un proveedor.
catalogo:* también va aparte, y por una razón distinta: escribir aquí no emite nada fiscal, pero afecta datos maestros —precio, CABYS, impuestos— que después alimentan cada comprobante que se emita con ese producto. Una key destinada únicamente a facturar no debería poder modificar el precio ni el CABYS del catálogo del comercio. Ver Crear o actualizar producto.
Combinaciones recomendadas
| Caso de uso | Scopes |
|---|---|
| E-commerce que solo emite tiquetes al consumidor final | facturas:read, facturas:write |
| POS que emite FE/TE y hace devoluciones | facturas:read, facturas:write, notas:write |
| Emisión + anulación interna + devoluciones | facturas:read, facturas:write, notas:write, facturas:anular |
| Backoffice de compras a proveedores de régimen especial | facturas-compra:read, facturas-compra:write |
| Solo consulta (auditoría, contabilidad) | facturas:read |
| Integración que además sincroniza su catálogo (productos/clientes) | facturas:read, facturas:write, catalogo:read, catalogo:write |
| Backoffice que además responde las facturas de sus proveedores | mensajes:read, mensajes:write |
| Integración completa (ventas + compras + anulación + catálogo + mensajes) | los diez |
Principio de menor privilegio: deben solicitarse únicamente los scopes que la integración realmente necesita. Un e-commerce que nunca realiza devoluciones por API no necesita
notas:write, aunque emita cientos de tiquetes al día. Si más adelante se requieren scopes adicionales, la API key puede rotarse con scopes ampliados.