Code catalogs
GET /api/v1/catalogos/{medios-pago | condiciones-venta | unidades-medida | actividades | puntos-venta | tipos-codigo | marcas}
Seven read-only endpoints for building an issuance request without copying codes from this documentation —which goes out of date— or guessing values that are specific to the tenant: economic activities, points of sale, and brands.
Each one exposes its own stable API contract instead of the internal entity, so a change on the LX CloudPos side doesn’t alter the contract for the integrator.
Authentication and permissions
All seven routes share the same policy:
| Attribute | Value |
|---|---|
| Scheme | API key (X-Api-Key) |
| Required scope | catalogo:read (all) |
| Rate limit | 120 req/min per API key |
Headers
GET /api/v1/catalogos/medios-pago HTTP/1.1
Host: api.pos.lxsyscr.com
X-Api-Key: lxs_live_a1b2c3d4_001122...
Accept: application/jsonGET /catalogos/medios-pago
The codigo of each row is what you send as medioPago when issuing.
Important: It is not
idMedioPago. If that name shows up in an old comment somewhere, it’s incorrect.
[
{ "codigo": "01", "nombre": "Efectivo", "permiteDescuento": true },
{ "codigo": "02", "nombre": "Tarjeta", "permiteDescuento": true },
{ "codigo": "03", "nombre": "Cheque", "permiteDescuento": true },
{ "codigo": "04", "nombre": "Transferencia – depósito bancario", "permiteDescuento": true },
{ "codigo": "05", "nombre": "Recaudado por terceros", "permiteDescuento": true },
{ "codigo": "06", "nombre": "SINPE Móvil", "permiteDescuento": true },
{ "codigo": "07", "nombre": "Plataforma digital", "permiteDescuento": true },
{ "codigo": "99", "nombre": "Otros (requiere descripción)", "permiteDescuento": true }
]A payment method with permiteDescuento: false does not accept montoDescuento on lines paid with it. See Discounts.
GET /catalogos/condiciones-venta
The codigo is what you send as condicionVenta when issuing. Codes 02 and 04 imply credit and require plazoCredito.
[
{ "codigo": "01", "nombre": "Contado" },
{ "codigo": "02", "nombre": "Crédito" },
{ "codigo": "03", "nombre": "Consignación" },
{ "codigo": "04", "nombre": "Apartado" },
{ "codigo": "99", "nombre": "Otros" }
]The tenant may have more conditions configured than these five, typically up to ten. The endpoint returns the tenant’s complete, real catalog; the above is just an illustrative extract.
GET /catalogos/unidades-medida
The codigo is what you send as unidadMedida when creating a product or in a purchase invoice line.
[
{ "codigo": "Unid", "nombre": "Unidad", "reduceInventario": true },
{ "codigo": "Kg", "nombre": "Kilogramo", "reduceInventario": true },
{ "codigo": "Sp", "nombre": "Servicios Profesionales", "reduceInventario": false }
]With reduceInventario: false, selling that product does not deduct stock — typical of service units.
GET /catalogos/actividades
Economic activities registered with Hacienda (Costa Rica’s tax authority) for this tenant, not Hacienda’s generic catalog. The codigo is what you send as codigoActividad when issuing, when you need to force one other than the primary one. If the tenant has no activities configured, it returns [], not an error.
[
{
"codigo": "6209.0",
"descripcion": "Otras actividades de la tecnología de información y servicio informáticos",
"principal": true
}
]principal: true marks the activity used by default when no explicit codigoActividad is sent. See Economic activities.
GET /catalogos/puntos-venta
The id is what you send as idPuntoVenta when issuing, when the integration handles several points of sale. It includes inactive ones (activo: false); filter them out on the integrator’s side if you don’t want to offer them.
[
{ "id": 1, "nombre": "WAFFLE MONKEY TAMARINDO", "activo": true },
{ "id": 2, "nombre": "WAFFLE MONKEY FLAMINGO", "activo": true }
]GET /catalogos/tipos-codigo
The codigo is what you send as tipoCodigo when creating a product. These are Hacienda’s five fixed values: they indicate who assigned the product’s code. If tipoCodigo is omitted when creating, "01" is used.
[
{ "codigo": "01", "descripcion": "Código del producto del vendedor" },
{ "codigo": "02", "descripcion": "Código del producto del comprador" },
{ "codigo": "03", "descripcion": "Código del producto asignado por la industria" },
{ "codigo": "04", "descripcion": "Código uso interno" },
{ "codigo": "99", "descripcion": "Otros" }
]GET /catalogos/marcas
The id is what you send as idMarca when creating a product. Brands are data specific to the tenant, so there’s no fixed list that can be hardcoded. It returns only active brands — precisely the ones a product can point to; that’s why it doesn’t carry an activo field that would always read true.
If the brand you need isn’t registered, create it with POST /api/v1/marcas.
[
{ "id": 2, "nombre": "Waffle Monkey" }
]Errors
All seven routes share the same behavior as the rest of the API.
401 Unauthorized
{ "error": "API key ausente, inválida o revocada." }403 Forbidden
{ "error": "La API key no tiene el scope requerido para esta operación." }429 Too Many Requests / 500 Internal Server Error
See Rate limiting and HTTP status codes.