# API pública de Wizerp — referencia > **GENERADO** por `tools/api/generar_contrato.php` desde `ApiConsulta::catalogo()` y > `ApiLlave::permisos()` el 2026-10-10. No se edita a mano: se regenera. Dirección base: `https://api.wizerp.com/api/v1` API de servidor a servidor de Wizerp. Todo va en JSON y todo está acotado a tu empresa. La empresa sale de tu llave: no es un parámetro, no se puede pasar y no hay forma de leer datos de otra. Esta API no se llama desde el navegador. Una petición con la cabecera Origin, con ?sid= o con x-csrf-mexerp se rechaza con 400. ## Autenticación | Cabecera | Ejemplo | Qué es | |---|---|---| | `Authorization` | `Bearer wzk_live_…` | El secreto completo de la llave. | | `X-Wizerp-Key-Id` | `208_a3f91c7d` | El identificador público. Van las dos: sin ésta la petición falla con 401 aunque el secreto sea correcto. | ## Permisos (scopes) | Scope | Nombre | Qué permite | |---|---|---| | `leads:write` | Registrar prospectos | Crear fichas en el CRM. No puede leer tu cartera ni tocar clientes que ya existen. | | `clientes:read` | Consultar clientes | Leer tu cartera: folio, correo, teléfono, RFC y los identificadores de marketplace. Solo lectura. | | `clientes:write` | Crear y editar clientes | Dar de alta clientes nuevos y editar los que ya existen (nombre, RFC, régimen, uso de CFDI, contacto y domicilio). ESCRIBE en tu cartera. | | `productos:read` | Consultar productos | Leer tu catálogo por SKU, estatus, tipo, marca o categoría, buscar por texto, y leer marcas, categorías y listas de precios. Solo lectura. | | `productos:write` | Crear y editar productos | Dar de alta productos nuevos y editar los que ya existen (SKU, descripción, unidad, clave del SAT, impuestos, costo y categoría). ESCRIBE en tu catálogo. No toca precios de venta ni inventario. | | `inventario:read` | Consultar existencias | Leer existencias por SKU y por almacén, y los catálogos de almacenes y sucursales. Solo lectura. | | `kardex:read` | Consultar movimientos de inventario | Leer el kardex de un producto o de un documento: entradas, salidas, traspasos y ajustes, con existencias y costos. Incluye costos: dalo solo a quien pueda verlos. Solo lectura. | | `proveedores:read` | Consultar proveedores | Leer tu padrón de proveedores por folio, RFC o nombre. Solo lectura. | | `ventas:read` | Consultar ventas | Leer tus documentos de venta (ventas, facturas, cotizaciones, pedidos) y sus renglones, por folio, cliente, fecha o SKU. Solo lectura. | | `facturas:read` | Consultar CFDI | Leer el registro de comprobantes timbrados: UUID, tipo, estatus y fechas. Solo lectura. | | `compras:read` | Consultar compras | Leer tus órdenes de compra y sus renglones, con proveedor, importes y costos, por folio, proveedor, estatus o fecha. Solo lectura. | | `cxc:read` | Consultar cuentas por cobrar | Leer los documentos de tu cartera, sus saldos y vencimientos, y los pagos aplicados a cada uno. Solo lectura. | ## Topes Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. ## Errores Todos tienen la misma forma: `{"ok":false,"error":{"codigo","mensaje","peticion"}}`. El campo `peticion` es lo que hay que pegar en un correo a soporte. | HTTP | Cuándo | |---|---| | 400 | Petición mal formada: filtro no permitido, filtro vacío, cursor o límite inválidos, o una cabecera de navegador | | 401 | La llave no es válida, está revocada, venció, o la empresa dejó de ser PRO | | 403 | La llave no tiene el permiso que pide esta operación | | 404 | La ruta no existe, o tu empresa no tiene la API habilitada | | 405 | Método equivocado para esta ruta. La respuesta trae la cabecera Allow | | 409 | Conflicto: misma Idempotency-Key con datos distintos, o ya existe un registro con ese identificador (RFC, SKU) | | 413 | El cuerpo pasa del máximo | | 415 | El cuerpo no va como JSON (falta Content-Type: application/json) | | 422 | Un dato no es válido para tu empresa | | 429 | Pasaste un tope. La respuesta trae Retry-After | | 500 | Falló de nuestro lado. Reintenta y reporta el valor de peticion | | 503 | Tu empresa tiene demasiadas peticiones en curso, o la búsqueda no está disponible. Trae Retry-After | ## Operaciones ### Comprobar que la API responde `GET https://api.wizerp.com/api/v1/health` · sin llave No necesita llave y no toca la base de datos: dice que el proceso está vivo y sirviendo, no que la base conteste. Campos de la respuesta: `ok`, `version`, `peticion`. Respuestas: 404, 405, 500 (ver tabla de errores). ### Registrar un prospecto `POST https://api.wizerp.com/api/v1/leads` · permiso `leads:write` Crea una ficha de prospecto en el CRM. Necesita nombre o empresa, y correo o teléfono. Los datos van en el cuerpo JSON, nunca en la URL. Manda la cabecera Idempotency-Key para poder reintentar sin duplicar: con la misma clave y los mismos datos se devuelve la respuesta guardada, byte por byte. | Campo del cuerpo | Tipo | Obligatorio | Detalle | |---|---|---|---| | `nombre` | string | no | Máximo 100. Se necesita éste o «empresa». | | `empresa` | string | no | Máximo 200. | | `correo` | string | no | Máximo 50. Se necesita éste o «telefono». | | `telefono` | string | no | Máximo 30. | | `mensaje` | string | no | Máximo 2000. | | `vendedor` | integer | no | Clave del vendedor al que se asigna. | Campos de la respuesta: `ok`, `prospecto`, `creado`, `folio`. Respuestas: 400, 401, 403, 404, 409, 413, 422, 429, 500, 503 (ver tabla de errores). ### Lista de clientes `GET https://api.wizerp.com/api/v1/clientes` · permiso `clientes:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. El campo correo puede traer varias direcciones separadas por coma y recortadas: el filtro correo compara el campo completo, así que no encuentra a un cliente por su segunda dirección. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `folio` | string | Coincidencia exacta. No admite comodines. | `idx_ctcia_ctfol` | | `correo` | string | Correo exacto. Se compara normalizado: no distingue mayúsculas ni espacios de sobra. | `ix_ctes_mailnorm` | | `telefono` | string | Se comparan los últimos 10 caracteres tras quitar espacios, guiones, paréntesis y el signo de más. Manda el número como lo tengas. | `ix_ctes_telnorm` | | `movil` | string | Se comparan los últimos 10 caracteres tras quitar espacios, guiones, paréntesis y el signo de más. Manda el número como lo tengas. | `ix_ctes_movnorm` | | `rfc` | string | Coincidencia exacta. No admite comodines. | `CTRFC` | | `prospecto` | boolean | true o false. | `ix_ctes_crm_plat` | | `publico` | boolean | true o false. | `ix_ctes_cia_publico` | | `id_mercadolibre` | string | Coincidencia exacta. No admite comodines. | `CTCIA_MELI` | | `id_shopify` | string | Coincidencia exacta. No admite comodines. | `CTIDSHOP` | | `id_woocommerce` | string | Coincidencia exacta. No admite comodines. | `CTIDWOO` | | `id_tiendanube` | string | Coincidencia exacta. No admite comodines. | `CTIDTN` | | `id_walmart` | string | Coincidencia exacta. No admite comodines. | `CTIDWAL` | | `uso_cfdi` | string | La clave del SAT, por ejemplo G03. No el identificador interno de Wizerp. | `CTIDUSOCFDI` | | `modificado_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `modification_time` | | `proximo_contacto_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `ix_ctes_semaforo` | | `proximo_contacto_hasta` | string | Fecha ISO 8601 en UTC. Devuelve lo que sea igual o anterior. | `ix_ctes_semaforo` | Campos de la respuesta: `clave`, `folio`, `nombre`, `razon_social`, `rfc`, `correo`, `telefono`, `movil`, `prospecto`, `id_mercadolibre`, `id_shopify`, `id_woocommerce`, `id_tiendanube`, `id_walmart`, `publico`, `proximo_contacto`, `modificado`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Crear un cliente `POST https://api.wizerp.com/api/v1/clientes` · permiso `clientes:write` Da de alta un cliente en tu cartera. La empresa sale de tu llave. Necesita nombre. El RFC es opcional, pero si lo mandas y no es genérico (XAXX010101000 / XEXX010101000), no se permite repetirlo: un RFC ya dado de alta responde 409. Régimen y uso de CFDI se mandan con la clave del SAT (regimen=612, uso_cfdi=G03). Se valida que el uso sea compatible con el régimen y con el tipo de persona del RFC. Con RFC genérico y sin régimen/uso, se usan los del ERP. No se pueden escribir la empresa, el folio, el vendedor ni los saldos: son datos de identidad y de dinero. Las empresas en esquema de franquicia no pueden usar esta operación aún. Toda escritura necesita la cabecera Idempotency-Key: un valor único por operación (por ejemplo un UUID) que repites tal cual al reintentar. Con la misma clave y los mismos datos se devuelve la respuesta guardada, sin duplicar; con la misma clave y datos distintos responde 409. | Campo del cuerpo | Tipo | Obligatorio | Detalle | |---|---|---|---| | `nombre` | string | sí | Nombre o razón social. Obligatorio. Máximo 100. | | `rfc` | string | no | RFC válido. En el alta, un RFC no genérico no puede repetirse en tu empresa. | | `regimen` | integer | no | Clave del régimen fiscal del SAT, por ejemplo 612 o 601. | | `uso_cfdi` | string | no | Clave del uso de CFDI del SAT, por ejemplo G03. Debe ser compatible con el régimen. | | `cp` | string | no | Código postal de 5 dígitos, como texto ("01000"). | | `correo` | string | no | Correo. Máximo 50. | | `telefono` | string | no | Teléfono. Máximo 30. | | `movil` | string | no | Móvil. Máximo 14. | | `calle` | string | no | Calle y número. Máximo 200. | | `colonia` | string | no | Colonia. Máximo 50. | | `pais` | integer | no | Clave de país (172 = México por omisión). | Campos de la respuesta: `ok`, `cliente`, `folio`, `rfc`. Respuestas: 400, 401, 403, 404, 409, 413, 415, 422, 429, 500, 503 (ver tabla de errores). ### Editar un cliente `PUT https://api.wizerp.com/api/v1/clientes/{clave}` · permiso `clientes:write` Cambia los datos de un cliente de tu empresa. La clave va en la URL y es la que devuelve GET /clientes. Es una edición parcial: sólo se tocan los campos que mandes; lo demás se conserva, incluidas las etiquetas. Régimen y uso de CFDI se validan igual que en el alta. Las empresas en esquema de franquicia no pueden usar esta operación aún. Toda escritura necesita la cabecera Idempotency-Key: un valor único por operación (por ejemplo un UUID) que repites tal cual al reintentar. Con la misma clave y los mismos datos se devuelve la respuesta guardada, sin duplicar; con la misma clave y datos distintos responde 409. Parámetro de ruta `clave` (integer, en la URL): La clave del cliente (la de GET /clientes). Va en la URL. | Campo del cuerpo | Tipo | Obligatorio | Detalle | |---|---|---|---| | `nombre` | string | no | Nombre o razón social. Máximo 100. | | `rfc` | string | no | RFC válido. | | `regimen` | integer | no | Clave del régimen fiscal del SAT, por ejemplo 612. | | `uso_cfdi` | string | no | Clave del uso de CFDI del SAT, por ejemplo G03. Compatible con el régimen. | | `cp` | string | no | Código postal de 5 dígitos, como texto. | | `correo` | string | no | Correo. Máximo 50. | | `telefono` | string | no | Teléfono. Máximo 30. | | `movil` | string | no | Móvil. Máximo 14. | | `calle` | string | no | Calle y número. Máximo 200. | | `colonia` | string | no | Colonia. Máximo 50. | | `pais` | integer | no | Clave de país (172 = México). | Campos de la respuesta: `ok`, `cliente`. Respuestas: 400, 401, 403, 404, 409, 413, 415, 422, 429, 500, 503 (ver tabla de errores). ### Lista de productos `GET https://api.wizerp.com/api/v1/productos` · permiso `productos:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Los productos eliminados no se devuelven salvo que pidas estatus=eliminado. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `sku` | string | Coincidencia exacta. No admite comodines. | `PRCIA_PRCPROD_PRST` | | `folio` | integer | Número entero. | `PRCIA_PRFOLPR` | | `estatus` | string | Uno de los valores de la lista. Valores: `activo`, `inactivo`, `eliminado`. | `PRCIA_PRST` | | `tipo` | string | Uno de los valores de la lista. Valores: `normal`, `virtual_con_precio`, `virtual_sin_precio`, `gasto`. | `PRCIA_PRST_PRTIPO` | | `subtipo` | string | Uno de los valores de la lista. Valores: `terminado`, `componente`, `materia_prima`. | `PRCIA_PRSUBTIPO` | | `kit` | boolean | true o false. | `MULT (PRCIA, PRST, PRKIT)` | | `codigo_sat` | string | Coincidencia exacta. No admite comodines. | `PRSATCOD` | | `id_shopify` | string | Coincidencia exacta. No admite comodines. | `PRSHOPIFY_PRCIA` | | `marca` | string | El nombre tal como aparece en el catálogo, no su identificador. | `PRMARCA` | | `categoria` | string | El nombre tal como aparece en el catálogo, no su identificador. | `PRCAT` | | `sku_padre` | string | El código del producto. Si el SKU corresponde a varios productos, se devuelven las filas de todos. | `PRCVEPADRE_PRST` | | `buscar` | string | Búsqueda de texto. Mínimo 3 caracteres en al menos una palabra; las más cortas se descartan. No admite comodines. | `ft_search_text` | | `modificado_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `modification_time` | Campos de la respuesta: `clave`, `sku`, `folio`, `descripcion`, `estatus`, `tipo`, `subtipo`, `kit`, `clave_padre`, `codigo_sat`, `marca`, `categoria`, `id_shopify`, `modificado`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Crear un producto `POST https://api.wizerp.com/api/v1/productos` · permiso `productos:write` Da de alta un producto en tu catálogo. La empresa sale de tu llave. Necesita sku, descripcion y unidad. El SKU no puede repetir el de otro producto activo de tu empresa: si ya existe, responde 409. Los datos fiscales (clave_sat, objeto_impuesto, iva_venta, iva_compra, tipo) son opcionales, pero si los mandas se validan contra el catálogo del SAT y de tu empresa; si los omites, se usan los valores por omisión del ERP. No crea inventario ni listas de precios, y no sincroniza con marketplaces: eso queda para una versión posterior. No se pueden escribir la empresa, el código interno, el estatus ni el producto padre. Toda escritura necesita la cabecera Idempotency-Key: un valor único por operación (por ejemplo un UUID) que repites tal cual al reintentar. Con la misma clave y los mismos datos se devuelve la respuesta guardada, sin duplicar; con la misma clave y datos distintos responde 409. | Campo del cuerpo | Tipo | Obligatorio | Detalle | |---|---|---|---| | `sku` | string | sí | Código del producto (SKU). Obligatorio. Máximo 100. En el alta no puede repetir otro activo. | | `descripcion` | string | sí | Descripción. Obligatorio. Máximo 500. | | `codigo_barras` | string | no | Código de barras. Máximo 18. | | `categoria` | integer | no | Clave de categoría de tu empresa (ver GET /categorias). | | `costo` | number | no | Costo de reposición en pesos. En el alta, si lo omites queda en 0. | | `clave_sat` | string | no | Clave de producto/servicio del SAT (8 caracteres, p. ej. 01010101). | | `unidad` | integer | sí | Clave de la unidad de medida. Obligatorio. Debe estar activa y tener clave del SAT. | | `objeto_impuesto` | string | no | Objeto de impuesto del SAT (2 caracteres, p. ej. 02). | | `iva_venta` | string | no | Clave de IVA de venta (p. ej. IVA16). | | `iva_compra` | string | no | Clave de IVA de compra (p. ej. IVA16). | | `tipo` | string | no | A = normal, B = virtual con precio, C = virtual sin precio. | Campos de la respuesta: `ok`, `producto`, `sku`. Respuestas: 400, 401, 403, 404, 409, 413, 415, 422, 429, 500, 503 (ver tabla de errores). ### Editar un producto `PUT https://api.wizerp.com/api/v1/productos/{clave}` · permiso `productos:write` Cambia los datos de un producto de tu empresa. La clave va en la URL y es la que devuelve GET /productos. Es una edición parcial: sólo se tocan los campos que mandes. Si no mandas costo, se conserva el actual. Los datos fiscales se validan igual que en el alta. No cambia precios de venta ni inventario, y no sincroniza con marketplaces. Toda escritura necesita la cabecera Idempotency-Key: un valor único por operación (por ejemplo un UUID) que repites tal cual al reintentar. Con la misma clave y los mismos datos se devuelve la respuesta guardada, sin duplicar; con la misma clave y datos distintos responde 409. Parámetro de ruta `clave` (integer, en la URL): La clave del producto (la de GET /productos). Va en la URL. | Campo del cuerpo | Tipo | Obligatorio | Detalle | |---|---|---|---| | `sku` | string | no | Código del producto (SKU). Máximo 100. En el alta no puede repetir otro activo. | | `descripcion` | string | no | Descripción. Máximo 500. | | `codigo_barras` | string | no | Código de barras. Máximo 18. | | `categoria` | integer | no | Clave de categoría de tu empresa (ver GET /categorias). | | `costo` | number | no | Costo de reposición en pesos. En el alta, si lo omites queda en 0. | | `clave_sat` | string | no | Clave de producto/servicio del SAT (8 caracteres, p. ej. 01010101). | | `unidad` | integer | no | Clave de la unidad de medida. Debe estar activa y tener clave del SAT. | | `objeto_impuesto` | string | no | Objeto de impuesto del SAT (2 caracteres, p. ej. 02). | | `iva_venta` | string | no | Clave de IVA de venta (p. ej. IVA16). | | `iva_compra` | string | no | Clave de IVA de compra (p. ej. IVA16). | | `tipo` | string | no | A = normal, B = virtual con precio, C = virtual sin precio. | Campos de la respuesta: `ok`, `producto`. Respuestas: 400, 401, 403, 404, 409, 413, 415, 422, 429, 500, 503 (ver tabla de errores). ### Lista de marcas `GET https://api.wizerp.com/api/v1/marcas` · permiso `productos:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Estos son los nombres que acepta el filtro marca de GET /productos. Las marcas borradas en el ERP no se devuelven salvo que pidas estatus=eliminado. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `estatus` | string | Uno de los valores de la lista. Valores: `activo`, `eliminado`. | `tabla chica — barrido acotado por MARCIA` | Campos de la respuesta: `clave`, `nombre`, `estatus`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de categorías `GET https://api.wizerp.com/api/v1/categorias` · permiso `productos:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Es un árbol: cada categoría trae padre, que es la clave de otra categoría. El padre -1 marca la raíz del árbol: normalmente es una sola categoría, «Productos», y todas las demás cuelgan de ella. Para recorrerlo, pide padre=-1 y luego padre= de cada categoría. El borrado de categorías es físico: una categoría borrada desaparece de la lista, no existe estatus eliminado. Estos son los nombres que acepta el filtro categoria de GET /productos. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `padre` | integer | Número entero; admite negativo. En categorías, padre=-1 devuelve la raíz del árbol. | `UNIQUE CATPARENT (CATPARENT, CATCIA, CATDES)` | | `estatus` | string | Uno de los valores de la lista. Valores: `activo`, `inactivo`. | `tabla chica — barrido acotado por CATCIA` | Campos de la respuesta: `clave`, `nombre`, `padre`, `estatus`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Precios por producto `GET https://api.wizerp.com/api/v1/precios` · permiso `productos:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Una fila activa por producto y moneda, con los diez precios de tu empresa: precio01 a precio10 corresponden a las listas de precios L1 a L10, cuyos nombres tu empresa define en el ERP (Configuración › Almacenes › Lista de precios › Nombrar listas de precios); la API entrega las diez posiciones y tu integración decide cuál usar. Un precio puede venir null si esa lista no está capturada para el producto. Por omisión solo salen filas activas; pide estatus para ver inactivas o eliminadas. Identifica cada precio por sku y moneda, no por clave: cuando el ERP recalcula precios puede guardarlos en una fila nueva (clave nueva) y marcar la anterior como eliminada. Para sincronizar, recorre el listado completo con cursor, o consulta por sku los productos que te interesan. No hay filtro por fecha de modificación ni por moneda: ninguno de los dos tiene un índice que responda rápido en empresas grandes. La moneda sí viene en cada fila. El campo actualizado es la fecha de última modificación y es solo informativo: viene null en las filas que nunca cambiaron desde que existe ese registro, que en muchas empresas son casi todas. El campo sku puede venir null si el producto fue eliminado por completo del catálogo. Si un SKU corresponde a varios productos, el filtro sku devuelve las filas de todos. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `sku` | string | El código del producto. Si el SKU corresponde a varios productos, se devuelven las filas de todos. | `PRCIA_PRCPROD_PRST + LIPRID_LIMON` | | `estatus` | string | Uno de los valores de la lista. Valores: `activo`, `inactivo`, `eliminado`. | `LICIA (forzado; el extended key da el orden del cursor)` | Campos de la respuesta: `clave`, `sku`, `moneda`, `estatus`, `precio01`, `precio02`, `precio03`, `precio04`, `precio05`, `precio06`, `precio07`, `precio08`, `precio09`, `precio10`, `actualizado`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de proveedores `GET https://api.wizerp.com/api/v1/proveedores` · permiso `proveedores:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Los registros eliminados no se devuelven salvo que pidas estatus=eliminado. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `folio` | string | Coincidencia exacta. No admite comodines. | `idx_dbprove_pvcia_pvfol` | | `estatus` | string | Uno de los valores de la lista. Valores: `activo`, `inactivo`, `eliminado`. | `idx_dbprove_pvcia_pvstat` | | `rfc` | string | Coincidencia exacta. No admite comodines. | `PVRFC` | | `nombre` | string | Búsqueda de texto. Mínimo 3 caracteres en al menos una palabra; las más cortas se descartan. No admite comodines. | `PVNOM1` | Campos de la respuesta: `clave`, `folio`, `nombre`, `contacto`, `rfc`, `correo`, `telefono`, `estatus`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de existencias `GET https://api.wizerp.com/api/v1/inventario` · permiso `inventario:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Puede devolver existencias de productos que ya no están activos: una existencia es un hecho sobre el almacén, no sobre el ciclo de vida del producto. Si sincronizas catálogo, cruza contra GET /productos. El campo apartado viene con signo y el ERP calcula el disponible como existencia menos el valor absoluto de apartado, con piso en minimo. No restes de frente o puedes ofrecer lo que Wizerp no vende. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `sku` | string | El código del producto. Si el SKU corresponde a varios productos, se devuelven las filas de todos. | `PRCIA_PRCPROD_PRST + INCIA_INPROD` | | `almacen` | string | El código de tres caracteres del almacén. Consúltalos en GET /almacenes. | `DBCIAALM.CACIA + INCIA_INALMCVE` | | `sucursal` | integer | Número entero. | `INSUC` | | `modificado_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `modification_time` | Campos de la respuesta: `clave`, `sku`, `descripcion`, `almacen`, `sucursal`, `existencia`, `apartado`, `por_embarcar`, `minimo`, `ubicacion`, `modificado`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de almacenes `GET https://api.wizerp.com/api/v1/almacenes` · permiso `inventario:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Los registros eliminados no se devuelven salvo que pidas estatus=eliminado. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `codigo` | string | Coincidencia exacta. No admite comodines. | `CACIA (CACIA, CACVE, CAALM)` | | `sucursal` | integer | Número entero. | `idx_DBCIAALM_CACIA_CASUC_CAMAIN` | | `principal` | boolean | true o false. | `idx_DBCIAALM_CACIA_CASUC_CAMAIN` | | `estatus` | string | Uno de los valores de la lista. Valores: `activo`, `inactivo`, `eliminado`. | `idx_cacve_cast` | Campos de la respuesta: `clave`, `codigo`, `nombre`, `folio`, `sucursal`, `principal`, `estatus`, `poblacion`, `estado`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de sucursales `GET https://api.wizerp.com/api/v1/sucursales` · permiso `inventario:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. La MATRIZ es la sucursal 0 y no tiene fila en este catálogo: un documento con sucursal 0 es de la matriz, no de una sucursal faltante. Las sucursales eliminadas no se devuelven salvo que pidas estatus=eliminada. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `estatus` | string | Uno de los valores de la lista. Valores: `activa`, `eliminada`. | `tabla chica — barrido acotado por SUCOMP` | Campos de la respuesta: `clave`, `nombre`, `domicilio`, `colonia`, `codigo_postal`, `telefono`, `estatus`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de ventas `GET https://api.wizerp.com/api/v1/ventas` · permiso `ventas:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Aquí viven TODOS los documentos de venta: remisiones, facturas, cotizaciones, pedidos y anticipos. Sin el filtro tipo se devuelven las ventas (tipo=venta; remision es sinónimo). Para los demás pide ese tipo: cada tipo se pagina por separado, no hay un listado de todos a la vez. En pedidos, surtido_estatus y monto_surtido traen el avance del surtido; en los demás tipos vienen null. No hay filtro por surtido. Los documentos cancelados no salen salvo que pidas cancelada=true. El filtro folio busca en el folio del tipo consultado: el mismo número puede existir como venta y como factura. Si filtras por fechas, el rango máximo es de 92 días: para un periodo mayor, pide por ventanas y recorre cada una con cursor. Los renglones de un documento se consultan en GET /ventas-renglones con la clave que devuelve esta lista. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `tipo` | string | Uno de los valores de la lista. Valores: `remision`, `venta`, `factura`, `cotizacion`, `pedido`, `anticipo`. | `idx_dbcabvta_comp_tipo_uid` | | `folio` | integer | El número de folio del documento. El folio se busca según el «tipo» consultado: el mismo número puede existir como venta y como factura. | `CVCOMP_CVFOLR / CVCOMP_CVTIPO_CVFOLF / CVCOMP_CVFOLC / CVCOMP_CVFOLP` | | `cliente` | integer | Número entero. | `idx_vta_comp_cte_tipo_fecha` | | `cancelada` | boolean | true devuelve solo documentos cancelados; false, solo vigentes. Sin este filtro, los cancelados no salen. | `multiplePrimeFe (CVCOMP+CVSTAT+CVTIPO+...)` | | `fecha_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `multiple2 (CVCOMP+CVFPRIMERDOCVENTA+CVSTAT+CVTIPO)` | | `fecha_hasta` | string | Fecha ISO 8601 en UTC. Devuelve lo que sea igual o anterior. | `multiple2 (CVCOMP+CVFPRIMERDOCVENTA+CVSTAT+CVTIPO)` | | `sucursal` | integer | Número entero. | `IDX_DBCABVTA_COMP_SUC_TIPO` | | `sku` | string | El código del producto. Devuelve los documentos que incluyen ese SKU en sus renglones. Si el SKU corresponde a varios productos, cuentan todos. | `ix_dbdetvta_comp_prod_uid_qty + ix_dbproduc_prcprod_prcve` | Campos de la respuesta: `clave`, `tipo`, `folio`, `cancelada`, `fecha`, `cliente`, `cliente_nombre`, `rfc`, `subtotal`, `descuento`, `iva`, `total`, `saldo`, `moneda`, `tipo_cambio`, `sucursal`, `almacen`, `vendedor`, `uuid`, `creado`, `surtido_estatus`, `monto_surtido`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Renglones de una venta `GET https://api.wizerp.com/api/v1/ventas-renglones` · permiso `ventas:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Necesita el filtro venta (o clave, para releer un renglón): esta consulta devuelve los renglones de UN documento, no un listado general. La clave de la venta la da GET /ventas. El campo sku puede venir null si el producto fue eliminado por completo del catálogo. En renglones de un pedido, cantidad es lo pedido y cantidad_surtida lo ya surtido; en los demás documentos cantidad_surtida trae un eco de la cantidad o cero y no significa nada. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Manda al menos uno de: venta o clave. Número entero. | `PRIMARY` | | `venta` | integer | Manda al menos uno de: venta o clave. Número entero. | `DVCOMP_DVUIDVTA` | | `sku` | string | El código del producto. Si el SKU corresponde a varios productos, se devuelven las filas de todos. | `idx_dv_uid_comp + PRIMARY de DBPRODUC` | Campos de la respuesta: `clave`, `venta`, `sku`, `descripcion`, `unidad`, `cantidad`, `cantidad_surtida`, `precio`, `importe`, `descuento`, `total`, `almacen`, `sucursal`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de facturas timbradas `GET https://api.wizerp.com/api/v1/facturas` · permiso `facturas:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. A diferencia de /ventas, esta lista trae TODOS los estatus —también canceladas y con error— porque es el registro de timbrado y su historia completa es el punto. Este es el registro de timbrado: aquí no hay importes. Los montos del documento están en GET /ventas (el campo venta de esta lista es la clave para consultarlo con tipo=factura). Si filtras por fechas, el rango máximo es de 92 días: para un periodo mayor, pide por ventanas y recorre cada una con cursor. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `uuid` | string | El folio fiscal (UUID) completo, 36 caracteres. No distingue mayúsculas. | `FACCOM_FACUUID_FACTIPO_FACSTAT` | | `venta` | integer | Número entero. | `multiple (FACCOM+FACVTA)` | | `tipo` | string | Uno de los valores de la lista. Valores: `factura`, `nota_credito`, `pago`, `traslado`, `embarque`, `externa`. | `multiple2 (FACCOM+FACTIPO+FACUUID+FACSTAT)` | | `estatus` | string | Uno de los valores de la lista. Valores: `vigente`, `cancelada`, `en_espera`, `error`. | `multiple2 (FACCOM+FACTIPO+FACUUID+FACSTAT)` | | `fecha_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `idx_faccom_facfec` | | `fecha_hasta` | string | Fecha ISO 8601 en UTC. Devuelve lo que sea igual o anterior. | `idx_faccom_facfec` | Campos de la respuesta: `clave`, `uuid`, `tipo`, `estatus`, `folio`, `venta`, `cliente`, `fecha`, `fecha_timbrado`, `uuid_relacionado`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Lista de órdenes de compra `GET https://api.wizerp.com/api/v1/compras` · permiso `compras:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Las compras canceladas no salen salvo que pidas estatus=cancelada (o cualquier estatus explícito). El folio NO es único: el mismo número puede aparecer en dos compras de tu empresa. Identifica cada compra por su clave, y usa esa clave para pedir sus renglones en GET /compras-renglones. fecha es la fecha de creación de la compra y es la que filtran fecha_desde y fecha_hasta. Si filtras por fechas, el rango máximo es de 92 días: para un periodo mayor, pide por ventanas y recorre cada una con cursor. moneda puede venir null en compras antiguas. total es subtotal + iva, y el ieps entra según tipo_ieps: impuesto lo suma, retencion lo resta, y con tipo_ieps null el ieps no forma parte del total. Son los importes que guardó el ERP: si la compra se editó, pueden no coincidir al centavo con la suma de sus renglones. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `folio` | integer | Número entero. | `idx_DBCABOC_PHCOMP_PHORD` | | `proveedor` | integer | Número entero. | `PHCOMP_PHPROV_PGAUT` | | `estatus` | string | Uno de los valores de la lista. Valores: `generada`, `recibida_parcial`, `recibida`, `cerrada_parcial`, `cancelada`, `pagada`. | `intersect PHCOMP+PHSTAT` | | `tipo` | string | Uno de los valores de la lista. Valores: `inventariable`, `gasto`. | `PHCOMP` | | `autorizacion` | string | Uno de los valores de la lista. Valores: `cotizacion`, `en_proceso`, `autorizada`, `rechazada`, `pendiente_por_saldos`. | `PHCOMP_PHAUTH` | | `fecha_desde` | string | Fecha ISO 8601 en UTC, por ejemplo 2026-10-01T00:00:00Z. Devuelve lo que sea igual o posterior. | `PHCOMP` | | `fecha_hasta` | string | Fecha ISO 8601 en UTC. Devuelve lo que sea igual o anterior. | `PHCOMP` | Campos de la respuesta: `clave`, `folio`, `tipo`, `estatus`, `autorizacion`, `proveedor`, `proveedor_nombre`, `proveedor_rfc`, `sucursal`, `almacen`, `moneda`, `tipo_cambio`, `subtotal`, `iva`, `ieps`, `tipo_ieps`, `total`, `fecha`, `vencimiento`, `factura_uuid`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Renglones de una compra `GET https://api.wizerp.com/api/v1/compras-renglones` · permiso `compras:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Necesita el filtro compra (o clave, para releer un renglón): esta consulta devuelve los renglones de UNA compra, no un listado general. La clave de la compra la da GET /compras. Wizerp liga los renglones a la compra por su folio, y el folio puede repetirse en otra compra de tu empresa. Si eso pasa, la respuesta trae los renglones de todas las compras con ese folio —lo mismo que muestra el ERP— y en esos renglones el campo compra viene null, porque no hay forma de saber a cuál pertenecen. folio viene siempre. El campo sku viene null en renglones capturados como texto libre o si el producto fue eliminado por completo del catálogo; la descripción viene siempre. costo_total es cantidad × costo_unitario, y costo_unitario es el costo por unidad ya con descuento; precio es el de lista antes del descuento. iva e ieps son los impuestos del renglón. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Manda al menos uno de: compra o clave. Número entero. | `PRIMARY / idx_DBDETOC_PDCOMP (forzado)` | | `compra` | integer | Manda al menos uno de: compra o clave. La clave de la compra (campo clave de GET /compras), no su folio. | `PRIMARY de DBCABOC + idx_DBDETOC_PDCOMP_PDORD` | Campos de la respuesta: `clave`, `compra`, `folio`, `linea`, `sku`, `descripcion`, `unidad`, `cantidad`, `recibido`, `precio`, `descuento`, `costo_unitario`, `costo_total`, `iva`, `ieps`, `tipo_ieps`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Documentos de cuentas por cobrar `GET https://api.wizerp.com/api/v1/cxc` · permiso `cxc:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Por omisión solo salen los documentos pendientes de cobro; pide estatus=pagado o estatus=cancelado para ver los demás. Nunca salen los documentos cerrados a mano ni los depósitos en garantía: el ERP tampoco los cuenta en el saldo de cartera. vencido=true puede sumar menos que el saldo vencido de la ficha del cliente en el ERP: la ficha sí cuenta los depósitos en garantía y los documentos con vencimiento anterior al año 2000, y la API no. saldo puede ser negativo: es un saldo a favor del cliente. moneda se entrega tal como está guardada, y en documentos antiguos puede traer valores que no son una moneda (vacío, «0», «1.2»). No la normalizamos por ti: trátala como dato a validar. fecha y vencimiento pueden venir null cuando el documento no tiene fecha válida; las anteriores al año 2000 son datos heredados. venta es la clave del documento en GET /ventas. Los pagos de cada documento se consultan en GET /cxc-pagos con documento=. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `estatus` | string | Uno de los valores de la lista. Valores: `cancelado`, `pendiente`, `pagado`. | `CCSTAT_CCCIA` | | `cliente` | integer | Número entero. | `intersect CCCTE+CCCIA` | | `venta` | integer | Número entero. | `CCCIA_CCFOLIOINT / CCFOLIOINT` | | `vencido` | boolean | true devuelve los documentos con saldo mayor a cero y vencimiento anterior a hoy (UTC); false, todos los demás. Los vencimientos anteriores al año 2000 son datos heredados y nunca cuentan como vencidos. | `CCSTAT_CCCIA + filtro en memoria` | Campos de la respuesta: `clave`, `folio`, `folio_venta`, `venta`, `cliente`, `sucursal`, `moneda`, `tipo_cambio`, `importe`, `saldo`, `subtotal`, `iva`, `fecha`, `vencimiento`, `uuid`, `estatus`, `parcialidades`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Pagos aplicados a cuentas por cobrar `GET https://api.wizerp.com/api/v1/cxc-pagos` · permiso `cxc:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Solo pagos de cuentas por cobrar: los pagos a proveedores no salen aquí. Por omisión solo salen los pagos vigentes; pide estatus=cancelado para ver los cancelados. fecha_pago es la fecha del pago que capturó tu equipo —la del estado de cuenta y del complemento de pago—; fecha es cuándo se registró en Wizerp. Pueden ser días distintos: para conciliar contra el banco usa fecha_pago. forma se entrega tal como está guardada: en pagos recientes es la clave del SAT (01 efectivo, 03 transferencia…) y en pagos antiguos puede traer códigos previos (EFE, TRA, CHE). moneda puede venir null. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Número entero. | `PRIMARY` | | `documento` | integer | Número entero. | `idx_DBPAGOS_PGIDCXC` | | `estatus` | string | Uno de los valores de la lista. Valores: `vigente`, `cancelado`. | `PCIA_PGSTAT` | Campos de la respuesta: `clave`, `documento`, `fecha`, `fecha_pago`, `importe`, `moneda`, `forma`, `estatus`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores). ### Movimientos de inventario (kardex) `GET https://api.wizerp.com/api/v1/movimientos-inventario` · permiso `kardex:read` Devuelve los registros de tu empresa, paginados por cursor. Las consultas devuelven páginas, no listas completas. Pide la siguiente pasando en `cursor` el valor que vino en `siguiente`, hasta que `hay_mas` sea false. No hay conteo total: contar millones de filas cuesta lo mismo que traerlas. Sólo se aceptan los filtros documentados. Cualquier otro parámetro contesta 400 filtro_no_permitido; no se ignora en silencio, porque un filtro ignorado hace creer que filtraste. Necesita el filtro sku, venta o clave: esta consulta devuelve el kardex de UN producto o de UN documento, no un listado general. No hay filtro por fechas: el kardex se consulta por producto o por documento. El SKU lo da GET /productos y la clave de la venta, GET /ventas. cantidad siempre es positiva; si el movimiento suma o resta lo dice sentido (entrada o salida). Traen sentido null el saldo inicial (fija la existencia), la salida por embarque (ver abajo) y los tipos que no reconocemos. existencia_anterior y existencia_actual son la existencia del almacén antes y después del movimiento, no costos. En almacenes que surten por embarque, esas dos existencias son el disponible (existencia menos lo comprometido por embarcar): la venta lo descuenta al venderse, y la salida_embarque registra después la salida física sin cambiarlo. Por eso su sentido es null; contarla como salida descontaría dos veces la misma venta. almacen y almacen_destino se entregan como texto tal como están guardados: casi siempre es la clave del almacén (campo clave de GET /almacenes), pero los movimientos antiguos y algunos procesos del ERP guardan su código (campo codigo). Un mismo texto puede ser la clave de un almacén y el código de otro. fecha está en UTC. El campo sku puede venir null si el producto fue eliminado por completo del catálogo; si un SKU corresponde a varios productos, el filtro sku devuelve los movimientos de todos. | Parámetro | Tipo | Detalle | Índice que lo sirve | |---|---|---|---| | `cursor` | string | La clave que vino en «siguiente» de la página anterior. Sin él, empieza por el principio. | — | | `limite` | integer | Registros por página. Omisión 100, máximo 500. | — | | `clave` | integer | Manda al menos uno de: sku, venta o clave. Número entero. | `PRIMARY / HICIA (forzado)` | | `sku` | string | Manda al menos uno de: sku, venta o clave. El código del producto. Si el SKU corresponde a varios productos, se devuelven las filas de todos. | `PRCIA_PRCPROD_PRST + HIPROD / HICIA_HIPROD` | | `venta` | integer | Manda al menos uno de: sku, venta o clave. Número entero. | `HIIDCABVTA` | | `tipo` | string | Uno de los valores de la lista. Valores: `registro`, `traspaso_salida`, `traspaso_entrada`, `ajuste_entrada`, `ajuste_salida`, `compra`, `cancelacion_compra`, `venta`, `cancelacion_venta`, `devolucion_nota_credito`, `cancelacion_nota_credito`, `saldo_inicial`, `orden_servicio`, `salida_embarque`, `produccion`, `merma`, `devolucion`. | `acompaña a sku o venta (HICIA_HITMOV_HIPROD_HICVE)` | Campos de la respuesta: `clave`, `tipo`, `sentido`, `sku`, `cantidad`, `existencia_anterior`, `existencia_actual`, `costo_unitario`, `costo_promedio`, `moneda`, `sucursal`, `almacen`, `sucursal_destino`, `almacen_destino`, `venta`, `fecha`. Respuestas: 400, 401, 403, 404, 429, 500, 503 (ver tabla de errores).