{
    "info": {
        "_postman_id": "317787bf-6827-48f8-8ce8-0000e63b1d98",
        "name": "API REST v1 · Minimarket Digital",
        "description": "# API REST · Minimarket Digital\n\n`https://sandbox.minimarket.digital/v1`\n\n## Empezar\n\n1. Importa este archivo en Postman: **Import → File**.\n2. Pega tu token en la variable `token` de la colección (pestaña **Variables**, columna *Current value*).\n3. Envía cualquier petición. `baseUrl` ya apunta a `https://sandbox.minimarket.digital/v1`, no hay nada más que configurar.\n\nEl Environment es opcional: sirve para apuntar la misma colección a otro entorno sin tocarla.\n\n## Autenticación\nTodas las peticiones requieren la cabecera `X-SYNCS-API-TOKEN` con un token vigente, emitido por el tenant. El tenant se resuelve por el subdominio de la petición.\n\n## {{...\\_id}} / {{...\\_new}}\n\n| Parám. | Descripción |\n| --- | --- |\n| `{{recurso_id}}` | Detalle — Listar |\n| `{{recurso_new}}` | `POST` → `PATCH`, `PUT`, `DELETE` |\n\nPATCH, PUT y DELETE usan `{{recurso_new}}`, el id que devuelve el POST de la misma carpeta: la colección solo toca registros creados por ella misma.\n\n## Formato de respuesta\nTodas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados.\n\n```json\n{ \"status\": \"success\", \"code\": \"200\", \"message\": \"LIST\", \"data\": {}, \"meta\": { \"page\": 1, \"per_page\": 20, \"count\": 20, \"total\": 134 } }\n```\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`.\n\n## Códigos de error\n\n| Código | Cuándo |\n| --- | --- |\n| 400 | Petición incompleta o con campos fuera de la lista blanca; un valor que no es texto, número, booleano ni `null`, o una URL que no es http(s) (`FIELD_INVALID`); una columna de la clave o un campo calculado en un PUT/PATCH (`FIELD_READONLY`); un filtro con un valor que no es escalar (`FILTER_INVALID`); con el id en la ruta, un `i` distinto en la query o en el formulario (`PARAM_INVALID: i`) |\n| 401 | Falta el token o no es válido |\n| 403 | El rol del token no tiene permiso sobre ese recurso (`FORBIDDEN`), o no tiene el que exige un estado o una exportación (`FORBIDDEN: comando`, con el comando que falta), o el subdominio no corresponde a ningún tenant (`TENANT_UNKNOWN`) |\n| 404 | Sin resultados, ruta inexistente, o un registro que no existe, se eliminó o queda fuera del alcance del permiso |\n| 405 | Método HTTP no soportado (`METHOD_NOT_ALLOWED`), o una escritura en un recurso de sólo lectura (`READ_ONLY`) |\n| 409 | Viola una clave única (nombre, código de barras, slug…), o reutiliza una `Idempotency-Key` en otra operación (`IDEMPOTENCY_KEY_REUSED`) o mientras la primera sigue en curso (`IDEMPOTENCY_IN_PROGRESS`) |\n| 500 | Error interno o base de datos no disponible. `SANITIZER_UNAVAILABLE`: el servidor no puede sanear un campo con formato y no lo guarda sin sanear |",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "auth": {
        "type": "apikey",
        "apikey": [
            {
                "key": "key",
                "value": "X-SYNCS-API-TOKEN",
                "type": "string"
            },
            {
                "key": "value",
                "value": "{{token}}",
                "type": "string"
            },
            {
                "key": "in",
                "value": "header",
                "type": "string"
            }
        ]
    },
    "event": [
        {
            "listen": "prerequest",
            "script": {
                "type": "text/javascript",
                "exec": [
                    "pm.collectionVariables.set(\"uniq\", String(Date.now()).slice(-6));"
                ]
            }
        },
        {
            "listen": "test",
            "script": {
                "type": "text/javascript",
                "exec": [
                    "pm.test(\"Formato de respuesta\", function () {",
                    "    const b = pm.response.json();",
                    "    pm.expect(b).to.have.property(\"status\");",
                    "    pm.expect(b).to.have.property(\"code\");",
                    "    pm.expect(b).to.have.property(\"message\");",
                    "    pm.expect(String(b.code)).to.eql(String(pm.response.code));",
                    "});"
                ]
            }
        }
    ],
    "variable": [
        {
            "key": "baseUrl",
            "value": "https://sandbox.minimarket.digital/v1",
            "type": "string"
        },
        {
            "key": "token",
            "value": "",
            "type": "string"
        },
        {
            "key": "uniq",
            "value": "",
            "type": "string"
        },
        {
            "key": "announcement_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "announcement_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "article_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "article_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "category_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "category_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "customer_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "customer_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "news_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "news_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "product_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "product_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "price_list_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "price_list_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "prices_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "prices_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "stock_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "stock_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "shipping_rates_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "shipping_rates_new",
            "value": "",
            "type": "string"
        },
        {
            "key": "warehouse_id",
            "value": "",
            "type": "string"
        },
        {
            "key": "warehouse_new",
            "value": "",
            "type": "string"
        }
    ],
    "item": [
        {
            "name": "Autenticación",
            "description": "Todas las peticiones requieren la cabecera `X-SYNCS-API-TOKEN` con un token vigente, emitido por el tenant. El tenant se resuelve por el subdominio de la petición.",
            "item": [
                {
                    "name": "Verificar un token",
                    "request": {
                        "method": "GET",
                        "header": [],
                        "url": {
                            "raw": "{{baseUrl}}/acl",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "acl"
                            ]
                        },
                        "description": "Todas las peticiones requieren la cabecera `X-SYNCS-API-TOKEN` con un token vigente, emitido por el tenant. El tenant se resuelve por el subdominio de la petición.\n\n`200 TOKEN_VALID` Situación: `emp_id`, `rol_id`, `name`, `tenant`."
                    },
                    "response": [],
                    "event": [
                        {
                            "listen": "test",
                            "script": {
                                "type": "text/javascript",
                                "exec": [
                                    "pm.test(\"Verificar un token\", function () {",
                                    "    pm.response.to.have.status(200);",
                                    "    pm.expect(pm.response.json().message).to.eql(\"TOKEN_VALID\");",
                                    "});"
                                ]
                            }
                        }
                    ]
                }
            ]
        },
        {
            "name": "Almacenes",
            "item": [
                {
                    "name": "Almacenes",
                    "description": "Administración de almacenes.\n\n`https://sandbox.minimarket.digital/v1/warehouse`\n\n**Requeridos en POST**: `name`\n\n**Componentes de la clave**: `com_suc_id`, `cou_id`, `pos_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `responsible`, `responsible_phone`, `responsible_email`, `geo_id`, `state`, `province`, `city`, `zone_typ`, `zone`, `street_typ`, `street`, `number_typ`, `number`, `interior_typ`, `interior`, `zip`, `latitude`, `longitude`, `altitude`, `place_id`, `external`, `external_responsible`, `external_responsible_phone`, `external_responsible_email`\n\n**Búsqueda `?q=` sobre**: `name`, `description`, `city`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `com_suc_id`, `cou_id`, `pos_id`",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/warehouse?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "warehouse"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "name",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"com_suc_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de almacenes.\n\n`https://sandbox.minimarket.digital/v1/warehouse`\n\n**Requeridos en POST**: `name`\n\n**Componentes de la clave**: `com_suc_id`, `cou_id`, `pos_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `responsible`, `responsible_phone`, `responsible_email`, `geo_id`, `state`, `province`, `city`, `zone_typ`, `zone`, `street_typ`, `street`, `number_typ`, `number`, `interior_typ`, `interior`, `zip`, `latitude`, `longitude`, `altitude`, `place_id`, `external`, `external_responsible`, `external_responsible_phone`, `external_responsible_email`\n\n**Búsqueda `?q=` sobre**: `name`, `description`, `city`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `com_suc_id`, `cou_id`, `pos_id`\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"warehouse_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/warehouse/{{warehouse_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "warehouse",
                                        "{{warehouse_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{warehouse_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        },
                        {
                            "name": "Crear",
                            "request": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/warehouse",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "warehouse"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"Almacén Central Lima {{uniq}}\",\n    \"description\": \"Almacén principal de distribución\",\n    \"com_suc_id\": \"LIM\",\n    \"city\": \"Lima\",\n    \"province\": \"Lima\",\n    \"street_typ\": \"AV.\",\n    \"street\": \"Los Frutales\",\n    \"number\": \"350\",\n    \"zip\": \"15022\",\n    \"latitude\": -12.085,\n    \"longitude\": -76.98,\n    \"responsible_email\": \"almacen+{{uniq}}@acme.pe\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Administración de almacenes.\n\n`https://sandbox.minimarket.digital/v1/warehouse`\n\n**Requeridos en POST**: `name`\n\n**Componentes de la clave**: `com_suc_id`, `cou_id`, `pos_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `responsible`, `responsible_phone`, `responsible_email`, `geo_id`, `state`, `province`, `city`, `zone_typ`, `zone`, `street_typ`, `street`, `number_typ`, `number`, `interior_typ`, `interior`, `zip`, `latitude`, `longitude`, `altitude`, `place_id`, `external`, `external_responsible`, `external_responsible_phone`, `external_responsible_email`\n\n**Búsqueda `?q=` sobre**: `name`, `description`, `city`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `com_suc_id`, `cou_id`, `pos_id`\n\nSolo se graban las columnas de la lista blanca de cada recurso (los *campos grabables* que aparecen en cada endpoint); cualquier otra clave del JSON se ignora en silencio. Cada valor es un texto, un número, un booleano (se guarda como 1 o 0) o `null`; un arreglo o un objeto responde `400 FIELD_INVALID: campo`. Los componentes de la clave primaria que no se envíen toman el valor `---`. El `id` puede enviarse (máximo 45 caracteres alfanuméricos, `_`, `-` y `.`); si se omite, la API genera un UUID."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "pm.test(\"201 ADD\", function () {",
                                            "    pm.response.to.have.status(201);",
                                            "});",
                                            "",
                                            "// Solo este id lo tocan el PATCH, el PUT y el DELETE de abajo:",
                                            "// así la colección nunca modifica un registro que no creó ella.",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && b.data.id) {",
                                            "    pm.collectionVariables.set(\"warehouse_new\", b.data.id);",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Actualizar",
                            "request": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/warehouse/{{warehouse_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "warehouse",
                                        "{{warehouse_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"description\": \"Almacén principal de distribución\",\n    \"city\": \"Lima\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{warehouse_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Actualización parcial",
                            "request": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/warehouse/{{warehouse_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "warehouse",
                                        "{{warehouse_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"description\": \"Almacén principal de distribución\",\n    \"city\": \"Lima\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{warehouse_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Eliminar",
                            "request": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/warehouse/{{warehouse_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "warehouse",
                                        "{{warehouse_new}}"
                                    ]
                                },
                                "description": "Elimina el registro\n\n`{{warehouse_new}}` ← Crear"
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Clientes y terceros",
            "item": [
                {
                    "name": "Clientes y terceros",
                    "description": "Administración de clientes y terceros.\n\n`https://sandbox.minimarket.digital/v1/customer`\n\n**Requeridos en POST**: `doi_id`, `doi`, `name`\n\n**Componentes de la clave**: `cus_cha_id`, `sll_id`, `cus_grp_id`, `cus_cla_id`, `cus_sec_id`, `cat_id`, `doi_id`, `doi` (si no se envían toman `---`)\n\n**Campos grabables**: `cou_id`, `geo_id`, `name`, `description`, `name_commercial`, `registered`, `sic_id`, `cus_cnt_id`, `cus_cnt_name`, `firstname`, `lastname`, `middlename`, `status`, `condition`, `type`, `activity`, `phone`, `phone_home`, `phone_mobile`, `phone_office`, `phone_fax`, `email`, `state`, `province`, `city`, `zone`, `address`, `billing_address`, `shipping_address`, `importer`, `exporter`, `legal_representatives`, `employees`, `mar_id`, `edu_id`, `annual_revenue`, `agent_detraction`, `agent_retention`, `agent_collection`, `electronic_invoicing`, `electronic_payroll`, `system_accounting`, `system_invoicing`, `code`, `prd_prc_id`, `itm_prc_id`, `rating`, `score`\n\n**Búsqueda `?q=` sobre**: `name`, `name_commercial`, `doi`, `email`\n\n**Nunca se devuelven**: `pass`, `token`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `cus_cha_id`, `sll_id`, `cus_grp_id`, `cus_cla_id`, `cus_sec_id`, `cat_id`, `doi_id`, `doi`",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/customer?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "customer"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "name",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"cus_cha_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de clientes y terceros.\n\n`https://sandbox.minimarket.digital/v1/customer`\n\n**Requeridos en POST**: `doi_id`, `doi`, `name`\n\n**Componentes de la clave**: `cus_cha_id`, `sll_id`, `cus_grp_id`, `cus_cla_id`, `cus_sec_id`, `cat_id`, `doi_id`, `doi` (si no se envían toman `---`)\n\n**Campos grabables**: `cou_id`, `geo_id`, `name`, `description`, `name_commercial`, `registered`, `sic_id`, `cus_cnt_id`, `cus_cnt_name`, `firstname`, `lastname`, `middlename`, `status`, `condition`, `type`, `activity`, `phone`, `phone_home`, `phone_mobile`, `phone_office`, `phone_fax`, `email`, `state`, `province`, `city`, `zone`, `address`, `billing_address`, `shipping_address`, `importer`, `exporter`, `legal_representatives`, `employees`, `mar_id`, `edu_id`, `annual_revenue`, `agent_detraction`, `agent_retention`, `agent_collection`, `electronic_invoicing`, `electronic_payroll`, `system_accounting`, `system_invoicing`, `code`, `prd_prc_id`, `itm_prc_id`, `rating`, `score`\n\n**Búsqueda `?q=` sobre**: `name`, `name_commercial`, `doi`, `email`\n\n**Nunca se devuelven**: `pass`, `token`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `cus_cha_id`, `sll_id`, `cus_grp_id`, `cus_cla_id`, `cus_sec_id`, `cat_id`, `doi_id`, `doi`\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"customer_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/customer/{{customer_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "customer",
                                        "{{customer_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{customer_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        },
                        {
                            "name": "Crear",
                            "request": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/customer",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "customer"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"doi_id\": \"rucPE\",\n    \"doi\": \"20123456786{{uniq}}\",\n    \"name\": \"ACME Distribuciones SAC {{uniq}}\",\n    \"name_commercial\": \"ACME-{{uniq}}\",\n    \"cus_cla_id\": \"a\",\n    \"email\": \"ventas+{{uniq}}@acme.pe\",\n    \"phone_mobile\": \"+51987654321\",\n    \"city\": \"Lima\",\n    \"address\": \"Av. Javier Prado Este 1234\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Administración de clientes y terceros.\n\n`https://sandbox.minimarket.digital/v1/customer`\n\n**Requeridos en POST**: `doi_id`, `doi`, `name`\n\n**Componentes de la clave**: `cus_cha_id`, `sll_id`, `cus_grp_id`, `cus_cla_id`, `cus_sec_id`, `cat_id`, `doi_id`, `doi` (si no se envían toman `---`)\n\n**Campos grabables**: `cou_id`, `geo_id`, `name`, `description`, `name_commercial`, `registered`, `sic_id`, `cus_cnt_id`, `cus_cnt_name`, `firstname`, `lastname`, `middlename`, `status`, `condition`, `type`, `activity`, `phone`, `phone_home`, `phone_mobile`, `phone_office`, `phone_fax`, `email`, `state`, `province`, `city`, `zone`, `address`, `billing_address`, `shipping_address`, `importer`, `exporter`, `legal_representatives`, `employees`, `mar_id`, `edu_id`, `annual_revenue`, `agent_detraction`, `agent_retention`, `agent_collection`, `electronic_invoicing`, `electronic_payroll`, `system_accounting`, `system_invoicing`, `code`, `prd_prc_id`, `itm_prc_id`, `rating`, `score`\n\n**Búsqueda `?q=` sobre**: `name`, `name_commercial`, `doi`, `email`\n\n**Nunca se devuelven**: `pass`, `token`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `cus_cha_id`, `sll_id`, `cus_grp_id`, `cus_cla_id`, `cus_sec_id`, `cat_id`, `doi_id`, `doi`\n\nSolo se graban las columnas de la lista blanca de cada recurso (los *campos grabables* que aparecen en cada endpoint); cualquier otra clave del JSON se ignora en silencio. Cada valor es un texto, un número, un booleano (se guarda como 1 o 0) o `null`; un arreglo o un objeto responde `400 FIELD_INVALID: campo`. Los componentes de la clave primaria que no se envíen toman el valor `---`. El `id` puede enviarse (máximo 45 caracteres alfanuméricos, `_`, `-` y `.`); si se omite, la API genera un UUID."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "pm.test(\"201 ADD\", function () {",
                                            "    pm.response.to.have.status(201);",
                                            "});",
                                            "",
                                            "// Solo este id lo tocan el PATCH, el PUT y el DELETE de abajo:",
                                            "// así la colección nunca modifica un registro que no creó ella.",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && b.data.id) {",
                                            "    pm.collectionVariables.set(\"customer_new\", b.data.id);",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Actualizar",
                            "request": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/customer/{{customer_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "customer",
                                        "{{customer_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name_commercial\": \"ACME-{{uniq}}\",\n    \"email\": \"ventas+{{uniq}}@acme.pe\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{customer_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Actualización parcial",
                            "request": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/customer/{{customer_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "customer",
                                        "{{customer_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name_commercial\": \"ACME-{{uniq}}\",\n    \"email\": \"ventas+{{uniq}}@acme.pe\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{customer_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Eliminar",
                            "request": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/customer/{{customer_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "customer",
                                        "{{customer_new}}"
                                    ]
                                },
                                "description": "Elimina el registro\n\n`{{customer_new}}` ← Crear"
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Planificación del transporte",
            "item": [
                {
                    "name": "Tarifas de Envío",
                    "description": "Tarifas de envío por courier, destino y tramo de peso.\n\n`https://sandbox.minimarket.digital/v1/shipping-rates`\n\n**Componentes de la clave**: `cou_id`, `shp_id`, `geo_id`\n\n**Campos**: `name`, `valid_since`, `weight_max`, `cur_id`, `price_sell`, `price`, `price_tax`, `price_extra`, `price_fixed`, `fixed_since`, `fixed_until`, `price_discount`, `discount_since`, `discount_until`, `local_cur_id`, `local_price_sell`, `local_price`, `local_price_tax`, `local_price_extra`, `local_price_fixed`, `local_price_discount`, `time_days`\n\n**Búsqueda `?q=` sobre**: `name`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/shipping-rates?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "shipping-rates"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "weight_max",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"cou_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Tarifas de envío por courier, destino y tramo de peso.\n\n`https://sandbox.minimarket.digital/v1/shipping-rates`\n\n**Componentes de la clave**: `cou_id`, `shp_id`, `geo_id`\n\n**Campos**: `name`, `valid_since`, `weight_max`, `cur_id`, `price_sell`, `price`, `price_tax`, `price_extra`, `price_fixed`, `fixed_since`, `fixed_until`, `price_discount`, `discount_since`, `discount_until`, `local_cur_id`, `local_price_sell`, `local_price`, `local_price_tax`, `local_price_extra`, `local_price_fixed`, `local_price_discount`, `time_days`\n\n**Búsqueda `?q=` sobre**: `name`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"shipping_rates_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/shipping-rates/{{shipping_rates_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "shipping-rates",
                                        "{{shipping_rates_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{shipping_rates_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Productos y servicios",
            "item": [
                {
                    "name": "Productos",
                    "description": "Administración de productos.\n\n`https://sandbox.minimarket.digital/v1/product`\n\n**Requeridos en POST**: `name`\n\n**Componentes de la clave**: `cou_id`, `cha_id`, `sll_id`, `cat_id`, `prd_lin_id`, `prd_seg_id`, `prd_fam_id`, `prd_cla_id`, `prd_cod_id`, `prd_man_id`, `prd_bra_id`, `prd_bat_id`, `prd_rot_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `description_short`, `specs`, `composition`, `contraindications`, `warnings`, `datasheet`, `visible`, `visible_soldout`, `featured`, `kit`, `typ_id`, `model`, `serial`, `bar_id`, `bar`, `package_width`, `package_height`, `package_depth`, `package_volume`, `package_weight`, `product_width`, `product_height`, `product_depth`, `product_volume`, `product_weight`, `recurrent`, `fre_id`, `frequency_date`, `thumbnail`, `url`, `meta_keywords`, `meta_description`, `tag`, `slug`, `reviews`, `rating`, `score`, `loyalty`, `to_purchase`, `purchase_cur`, `purchase_unit`, `purchase_min`, `purchase_max`, `to_sell_online`, `to_sell`, `sell_cur`, `sell_unit`, `sell_min`, `sell_max`, `to_sync`\n\n**Búsqueda `?q=` sobre**: `name`, `description`, `model`, `bar`, `slug`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `cou_id`, `cha_id`, `sll_id`, `cat_id`, `prd_lin_id`, `prd_seg_id`, `prd_fam_id`, `prd_cla_id`, `prd_cod_id`, `prd_man_id`, `prd_bra_id`, `prd_bat_id`, `prd_rot_id`",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/product?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "product"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "name",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"cou_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de productos.\n\n`https://sandbox.minimarket.digital/v1/product`\n\n**Requeridos en POST**: `name`\n\n**Componentes de la clave**: `cou_id`, `cha_id`, `sll_id`, `cat_id`, `prd_lin_id`, `prd_seg_id`, `prd_fam_id`, `prd_cla_id`, `prd_cod_id`, `prd_man_id`, `prd_bra_id`, `prd_bat_id`, `prd_rot_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `description_short`, `specs`, `composition`, `contraindications`, `warnings`, `datasheet`, `visible`, `visible_soldout`, `featured`, `kit`, `typ_id`, `model`, `serial`, `bar_id`, `bar`, `package_width`, `package_height`, `package_depth`, `package_volume`, `package_weight`, `product_width`, `product_height`, `product_depth`, `product_volume`, `product_weight`, `recurrent`, `fre_id`, `frequency_date`, `thumbnail`, `url`, `meta_keywords`, `meta_description`, `tag`, `slug`, `reviews`, `rating`, `score`, `loyalty`, `to_purchase`, `purchase_cur`, `purchase_unit`, `purchase_min`, `purchase_max`, `to_sell_online`, `to_sell`, `sell_cur`, `sell_unit`, `sell_min`, `sell_max`, `to_sync`\n\n**Búsqueda `?q=` sobre**: `name`, `description`, `model`, `bar`, `slug`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `cou_id`, `cha_id`, `sll_id`, `cat_id`, `prd_lin_id`, `prd_seg_id`, `prd_fam_id`, `prd_cla_id`, `prd_cod_id`, `prd_man_id`, `prd_bra_id`, `prd_bat_id`, `prd_rot_id`\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"product_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/product/{{product_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "product",
                                        "{{product_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{product_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        },
                        {
                            "name": "Crear",
                            "request": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/product",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "product"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"name\": \"Martillo de uña 16oz {{uniq}}\",\n    \"cat_id\": \"herramientas\",\n    \"description_short\": \"Martillo de uña con mango de fibra de vidrio\",\n    \"model\": \"MT-16-{{uniq}}\",\n    \"bar_id\": \"EAN13\",\n    \"bar\": \"7750000000017{{uniq}}\",\n    \"slug\": \"martillo-una-16oz-{{uniq}}\",\n    \"visible\": 1,\n    \"to_sell\": 1,\n    \"sell_cur\": \"PEN\",\n    \"sell_unit\": \"U\",\n    \"sell_min\": 1,\n    \"product_weight\": 0.65\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Administración de productos.\n\n`https://sandbox.minimarket.digital/v1/product`\n\n**Requeridos en POST**: `name`\n\n**Componentes de la clave**: `cou_id`, `cha_id`, `sll_id`, `cat_id`, `prd_lin_id`, `prd_seg_id`, `prd_fam_id`, `prd_cla_id`, `prd_cod_id`, `prd_man_id`, `prd_bra_id`, `prd_bat_id`, `prd_rot_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `description_short`, `specs`, `composition`, `contraindications`, `warnings`, `datasheet`, `visible`, `visible_soldout`, `featured`, `kit`, `typ_id`, `model`, `serial`, `bar_id`, `bar`, `package_width`, `package_height`, `package_depth`, `package_volume`, `package_weight`, `product_width`, `product_height`, `product_depth`, `product_volume`, `product_weight`, `recurrent`, `fre_id`, `frequency_date`, `thumbnail`, `url`, `meta_keywords`, `meta_description`, `tag`, `slug`, `reviews`, `rating`, `score`, `loyalty`, `to_purchase`, `purchase_cur`, `purchase_unit`, `purchase_min`, `purchase_max`, `to_sell_online`, `to_sell`, `sell_cur`, `sell_unit`, `sell_min`, `sell_max`, `to_sync`\n\n**Búsqueda `?q=` sobre**: `name`, `description`, `model`, `bar`, `slug`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `cou_id`, `cha_id`, `sll_id`, `cat_id`, `prd_lin_id`, `prd_seg_id`, `prd_fam_id`, `prd_cla_id`, `prd_cod_id`, `prd_man_id`, `prd_bra_id`, `prd_bat_id`, `prd_rot_id`\n\nSolo se graban las columnas de la lista blanca de cada recurso (los *campos grabables* que aparecen en cada endpoint); cualquier otra clave del JSON se ignora en silencio. Cada valor es un texto, un número, un booleano (se guarda como 1 o 0) o `null`; un arreglo o un objeto responde `400 FIELD_INVALID: campo`. Los componentes de la clave primaria que no se envíen toman el valor `---`. El `id` puede enviarse (máximo 45 caracteres alfanuméricos, `_`, `-` y `.`); si se omite, la API genera un UUID."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "pm.test(\"201 ADD\", function () {",
                                            "    pm.response.to.have.status(201);",
                                            "});",
                                            "",
                                            "// Solo este id lo tocan el PATCH, el PUT y el DELETE de abajo:",
                                            "// así la colección nunca modifica un registro que no creó ella.",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && b.data.id) {",
                                            "    pm.collectionVariables.set(\"product_new\", b.data.id);",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Actualizar",
                            "request": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/product/{{product_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "product",
                                        "{{product_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"description_short\": \"Martillo de uña con mango de fibra de vidrio\",\n    \"model\": \"MT-16-{{uniq}}\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{product_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Actualización parcial",
                            "request": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/product/{{product_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "product",
                                        "{{product_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"description_short\": \"Martillo de uña con mango de fibra de vidrio\",\n    \"model\": \"MT-16-{{uniq}}\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{product_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Eliminar",
                            "request": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/product/{{product_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "product",
                                        "{{product_new}}"
                                    ]
                                },
                                "description": "Elimina el registro\n\n`{{product_new}}` ← Crear"
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Catálogo",
            "item": [
                {
                    "name": "Stock",
                    "description": "Existencias por almacén, ubicación, lote y SKU: totales, disponibles, reservados y en tránsito.\n\n`https://sandbox.minimarket.digital/v1/stock`\n\n**Componentes de la clave**: `com_suc_id`, `cou_id`, `geo_id`, `wrh_id`, `wrh_loc_id`, `prd_bat_id`, `prd_id`, `prd_sku_id`, `lpn_id`, `sts_id`\n\n**Campos**: `name`, `description`, `uni_id`, `factor`, `stock_min`, `stock_max`, `stock_total`, `stock_transit`, `stock_available`, `stock_reserved`, `price_cost`, `price_sell`, `price_storage`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/stock?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "stock"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "entered",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"com_suc_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Existencias por almacén, ubicación, lote y SKU: totales, disponibles, reservados y en tránsito.\n\n`https://sandbox.minimarket.digital/v1/stock`\n\n**Componentes de la clave**: `com_suc_id`, `cou_id`, `geo_id`, `wrh_id`, `wrh_loc_id`, `prd_bat_id`, `prd_id`, `prd_sku_id`, `lpn_id`, `sts_id`\n\n**Campos**: `name`, `description`, `uni_id`, `factor`, `stock_min`, `stock_max`, `stock_total`, `stock_transit`, `stock_available`, `stock_reserved`, `price_cost`, `price_sell`, `price_storage`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"stock_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/stock/{{stock_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "stock",
                                        "{{stock_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{stock_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        }
                    ]
                },
                {
                    "name": "Precios",
                    "description": "Una línea de precio por lista (prd_prc_id) y SKU, ya creada al dar de alta la lista o el SKU. POST crea la que falta o actualiza la existente; el producto sale del SKU y la moneda de la lista. El precio de venta (price_sell) lo calcula la API: costo × (1 + margen/100), o el precio fijo si está vigente hoy.\n\n`https://sandbox.minimarket.digital/v1/prices`\n\n**Requeridos en POST**: `prd_prc_id`\n\n**Componentes de la clave**: `prd_prc_id`, `cur_id`, `prd_id`, `prd_sku_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `factor`, `fixed_since`, `fixed_until`, `price_base`, `price`, `price_unit`, `price_tax`, `price_discount`, `price_storage`, `price_shipping`, `price_setup`, `price_replacement`, `price_maintenance`, `price_purchase`, `price_books`, `price_fixed`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Calculados por la API (se devuelven, no se envían)**: `price_sell`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `prd_prc_id`, `cur_id`, `prd_id`, `prd_sku_id`",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/prices?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "prices"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "entered",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"prd_prc_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Una línea de precio por lista (prd_prc_id) y SKU, ya creada al dar de alta la lista o el SKU. POST crea la que falta o actualiza la existente; el producto sale del SKU y la moneda de la lista. El precio de venta (price_sell) lo calcula la API: costo × (1 + margen/100), o el precio fijo si está vigente hoy.\n\n`https://sandbox.minimarket.digital/v1/prices`\n\n**Requeridos en POST**: `prd_prc_id`\n\n**Componentes de la clave**: `prd_prc_id`, `cur_id`, `prd_id`, `prd_sku_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `factor`, `fixed_since`, `fixed_until`, `price_base`, `price`, `price_unit`, `price_tax`, `price_discount`, `price_storage`, `price_shipping`, `price_setup`, `price_replacement`, `price_maintenance`, `price_purchase`, `price_books`, `price_fixed`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Calculados por la API (se devuelven, no se envían)**: `price_sell`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `prd_prc_id`, `cur_id`, `prd_id`, `prd_sku_id`\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"prices_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/prices/{{prices_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "prices",
                                        "{{prices_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{prices_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        },
                        {
                            "name": "Crear",
                            "request": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/prices",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "prices"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"prd_prc_id\": \"LP01\",\n    \"prd_id\": \"PRD-0001\",\n    \"prd_sku_id\": \"PRD-0001-01\",\n    \"price_purchase\": 10,\n    \"factor\": 25,\n    \"price\": 12.5,\n    \"price_fixed\": 11.9,\n    \"fixed_since\": \"2026-07-01\",\n    \"fixed_until\": \"2026-12-31\"\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Una línea de precio por lista (prd_prc_id) y SKU, ya creada al dar de alta la lista o el SKU. POST crea la que falta o actualiza la existente; el producto sale del SKU y la moneda de la lista. El precio de venta (price_sell) lo calcula la API: costo × (1 + margen/100), o el precio fijo si está vigente hoy.\n\n`https://sandbox.minimarket.digital/v1/prices`\n\n**Requeridos en POST**: `prd_prc_id`\n\n**Componentes de la clave**: `prd_prc_id`, `cur_id`, `prd_id`, `prd_sku_id` (si no se envían toman `---`)\n\n**Campos grabables**: `name`, `description`, `factor`, `fixed_since`, `fixed_until`, `price_base`, `price`, `price_unit`, `price_tax`, `price_discount`, `price_storage`, `price_shipping`, `price_setup`, `price_replacement`, `price_maintenance`, `price_purchase`, `price_books`, `price_fixed`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Calculados por la API (se devuelven, no se envían)**: `price_sell`\n\n**Con formato (se sanean al guardar)**: `description`\n\n**No cambian por PUT/PATCH (400 FIELD_READONLY)**: `prd_prc_id`, `cur_id`, `prd_id`, `prd_sku_id`\n\nSolo se graban las columnas de la lista blanca de cada recurso (los *campos grabables* que aparecen en cada endpoint); cualquier otra clave del JSON se ignora en silencio. Cada valor es un texto, un número, un booleano (se guarda como 1 o 0) o `null`; un arreglo o un objeto responde `400 FIELD_INVALID: campo`. Los componentes de la clave primaria que no se envíen toman el valor `---`. El `id` puede enviarse (máximo 45 caracteres alfanuméricos, `_`, `-` y `.`); si se omite, la API genera un UUID.\n\nAlta o actualización: si el registro ya existe, el `POST` lo actualiza con los campos enviados y responde `200 UPDATE`, y para eso exige además el permiso de Editar sobre ese registro. Si no existe, lo crea y responde `201 ADD`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "pm.test(\"201 ADD / 200 UPDATE\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 201]);",
                                            "});",
                                            "",
                                            "// Solo un ALTA (201) llena el id que tocan PATCH, PUT y DELETE:",
                                            "// un 200 actualizó un registro que ya existía, y ese no se borra.",
                                            "const b = pm.response.json();",
                                            "if (pm.response.code === 201 && b && b.data && b.data.id) {",
                                            "    pm.collectionVariables.set(\"prices_new\", b.data.id);",
                                            "} else {",
                                            "    pm.collectionVariables.unset(\"prices_new\");",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Actualizar",
                            "request": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/prices/{{prices_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "prices",
                                        "{{prices_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"price_purchase\": 10,\n    \"factor\": 25\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{prices_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Actualización parcial",
                            "request": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/prices/{{prices_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "prices",
                                        "{{prices_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"price_purchase\": 10,\n    \"factor\": 25\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{prices_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Eliminar",
                            "request": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/prices/{{prices_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "prices",
                                        "{{prices_new}}"
                                    ]
                                },
                                "description": "Elimina el registro\n\n`{{prices_new}}` ← Crear"
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Publicaciones internas",
            "item": [
                {
                    "name": "Anuncios",
                    "description": "Administración de anuncios.\n\n`https://sandbox.minimarket.digital/v1/announcement`\n\n**Componentes de la clave**: `cat_id`, `typ_id`\n\n**Campos**: `name`, `title`, `subtitle`, `content`, `url`, `publish_since`, `publish_until`\n\n**Búsqueda `?q=` sobre**: `name`, `title`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/announcement?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "announcement"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "publish_since",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"cat_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de anuncios.\n\n`https://sandbox.minimarket.digital/v1/announcement`\n\n**Componentes de la clave**: `cat_id`, `typ_id`\n\n**Campos**: `name`, `title`, `subtitle`, `content`, `url`, `publish_since`, `publish_until`\n\n**Búsqueda `?q=` sobre**: `name`, `title`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"announcement_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/announcement/{{announcement_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "announcement",
                                        "{{announcement_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{announcement_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        }
                    ]
                },
                {
                    "name": "Noticias",
                    "description": "Administración de noticias.\n\n`https://sandbox.minimarket.digital/v1/news`\n\n**Componentes de la clave**: `cou_id`, `cat_id`, `typ_id`\n\n**Campos**: `name`, `title`, `subject`, `content`, `slug`, `author`, `source`, `url`, `published`\n\n**Búsqueda `?q=` sobre**: `name`, `subject`, `author`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/news?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "news"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "published",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"cou_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de noticias.\n\n`https://sandbox.minimarket.digital/v1/news`\n\n**Componentes de la clave**: `cou_id`, `cat_id`, `typ_id`\n\n**Campos**: `name`, `title`, `subject`, `content`, `slug`, `author`, `source`, `url`, `published`\n\n**Búsqueda `?q=` sobre**: `name`, `subject`, `author`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"news_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/news/{{news_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "news",
                                        "{{news_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{news_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Archivos y conocimiento",
            "item": [
                {
                    "name": "Artículos",
                    "description": "Administración de artículos.\n\n`https://sandbox.minimarket.digital/v1/article`\n\n**Componentes de la clave**: `ses_id`, `scc_id`, `cat_id`, `typ_id`, `lng_id`\n\n**Campos**: `name`, `title`, `subtitle`, `content`, `slug`, `author`, `published`, `featured`, `editor_pick`\n\n**Búsqueda `?q=` sobre**: `name`, `subtitle`, `author`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/article?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "article"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "published",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"ses_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de artículos.\n\n`https://sandbox.minimarket.digital/v1/article`\n\n**Componentes de la clave**: `ses_id`, `scc_id`, `cat_id`, `typ_id`, `lng_id`\n\n**Campos**: `name`, `title`, `subtitle`, `content`, `slug`, `author`, `published`, `featured`, `editor_pick`\n\n**Búsqueda `?q=` sobre**: `name`, `subtitle`, `author`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"article_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/article/{{article_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "article",
                                        "{{article_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{article_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Clasificación del catálogo",
            "item": [
                {
                    "name": "Categorías",
                    "description": "Administración de categorías.\n\n`https://sandbox.minimarket.digital/v1/category`\n\n**Componentes de la clave**: `lng_id`, `mnu_id`\n\n**Campos**: `name`, `description`, `parent`, `order`, `color`, `ico`, `slug`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/category?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "category"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "order",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"lng_id\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de categorías.\n\n`https://sandbox.minimarket.digital/v1/category`\n\n**Componentes de la clave**: `lng_id`, `mnu_id`\n\n**Campos**: `name`, `description`, `parent`, `order`, `color`, `ico`, `slug`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Sólo lectura**: Este recurso sólo se consulta: su contenido lo calculan los procesos del sistema. `POST`, `PUT`, `PATCH` y `DELETE` responden `405 READ_ONLY`.\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"category_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/category/{{category_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "category",
                                        "{{category_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{category_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        }
                    ]
                }
            ]
        },
        {
            "name": "Precios y condiciones",
            "item": [
                {
                    "name": "Listas de Precios",
                    "description": "Administración de listas de Precios.\n\n`https://sandbox.minimarket.digital/v1/price-list`\n\n**Requeridos en POST**: `name`, `cur_id`\n\n**Campos grabables**: `name`, `description`, `cur_id`, `factor`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Con formato (se sanean al guardar)**: `description`",
                    "item": [
                        {
                            "name": "Listar",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/price-list?page=1&per_page=20",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "price-list"
                                    ],
                                    "query": [
                                        {
                                            "key": "page",
                                            "value": "1",
                                            "description": "Número de página"
                                        },
                                        {
                                            "key": "per_page",
                                            "value": "20",
                                            "description": "Registros por página (máx. 1000)"
                                        },
                                        {
                                            "key": "since",
                                            "value": "2026-11-01",
                                            "disabled": true,
                                            "description": "Inicio del rango de creación (columna `entered`). Solo fecha = desde las 00:00:00"
                                        },
                                        {
                                            "key": "until",
                                            "value": "2026-11-08",
                                            "disabled": true,
                                            "description": "Fin del rango de creación. Solo fecha = hasta las 23:59:59"
                                        },
                                        {
                                            "key": "q",
                                            "value": "",
                                            "disabled": true,
                                            "description": "Búsqueda de texto en los campos indicados en cada recurso"
                                        },
                                        {
                                            "key": "s",
                                            "value": "name",
                                            "disabled": true,
                                            "description": "Campo de ordenamiento"
                                        },
                                        {
                                            "key": "o",
                                            "value": "desc",
                                            "disabled": true,
                                            "description": "Sentido: `asc` o `desc`"
                                        },
                                        {
                                            "key": "f",
                                            "value": "{\"name\":\"...\"}",
                                            "disabled": true,
                                            "description": "Filtros exactos en JSON"
                                        }
                                    ]
                                },
                                "description": "Administración de listas de Precios.\n\n`https://sandbox.minimarket.digital/v1/price-list`\n\n**Requeridos en POST**: `name`, `cur_id`\n\n**Campos grabables**: `name`, `description`, `cur_id`, `factor`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Con formato (se sanean al guardar)**: `description`\n\nEn los listados, `data` es un objeto indexado por el `id` de cada registro. El código HTTP de la respuesta coincide siempre con el campo `code`."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "// Listar",
                                            "pm.test(\"200 LIST / 404 NO_DATA\", function () {",
                                            "    pm.expect(pm.response.code).to.be.oneOf([200, 404]);",
                                            "});",
                                            "",
                                            "// Guarda el primer id para el detalle, el PATCH y el DELETE",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && pm.response.code === 200) {",
                                            "    const k = Object.keys(b.data)[0];",
                                            "    if (k) { pm.collectionVariables.set(\"price_list_id\", k); }",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Detalle",
                            "request": {
                                "method": "GET",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/price-list/{{price_list_id}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "price-list",
                                        "{{price_list_id}}"
                                    ]
                                },
                                "description": "Id del registro (equivale a `/{recurso}/{id}`). Con el id en la ruta, manda el de la ruta: un `i` distinto, vacío o en arreglo responde `400 PARAM_INVALID: i`\n\nUn registro — `{{price_list_id}}` Todas las respuestas comparten la misma envoltura. `meta` aparece solo en los listados."
                            },
                            "response": []
                        },
                        {
                            "name": "Crear",
                            "request": {
                                "method": "POST",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/price-list",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "price-list"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"id\": \"LP01-{{uniq}}\",\n    \"name\": \"Lista Mayorista {{uniq}}\",\n    \"description\": \"Precios para clientes mayoristas\",\n    \"cur_id\": \"PEN\",\n    \"factor\": 25\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Administración de listas de Precios.\n\n`https://sandbox.minimarket.digital/v1/price-list`\n\n**Requeridos en POST**: `name`, `cur_id`\n\n**Campos grabables**: `name`, `description`, `cur_id`, `factor`\n\n**Búsqueda `?q=` sobre**: `name`, `description`\n\n**Con formato (se sanean al guardar)**: `description`\n\nSolo se graban las columnas de la lista blanca de cada recurso (los *campos grabables* que aparecen en cada endpoint); cualquier otra clave del JSON se ignora en silencio. Cada valor es un texto, un número, un booleano (se guarda como 1 o 0) o `null`; un arreglo o un objeto responde `400 FIELD_INVALID: campo`. Los componentes de la clave primaria que no se envíen toman el valor `---`. El `id` puede enviarse (máximo 45 caracteres alfanuméricos, `_`, `-` y `.`); si se omite, la API genera un UUID."
                            },
                            "response": [],
                            "event": [
                                {
                                    "listen": "test",
                                    "script": {
                                        "type": "text/javascript",
                                        "exec": [
                                            "pm.test(\"201 ADD\", function () {",
                                            "    pm.response.to.have.status(201);",
                                            "});",
                                            "",
                                            "// Solo este id lo tocan el PATCH, el PUT y el DELETE de abajo:",
                                            "// así la colección nunca modifica un registro que no creó ella.",
                                            "const b = pm.response.json();",
                                            "if (b && b.data && b.data.id) {",
                                            "    pm.collectionVariables.set(\"price_list_new\", b.data.id);",
                                            "}"
                                        ]
                                    }
                                }
                            ]
                        },
                        {
                            "name": "Actualizar",
                            "request": {
                                "method": "PUT",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/price-list/{{price_list_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "price-list",
                                        "{{price_list_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"description\": \"Precios para clientes mayoristas\",\n    \"factor\": 25\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{price_list_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Actualización parcial",
                            "request": {
                                "method": "PATCH",
                                "header": [
                                    {
                                        "key": "Content-Type",
                                        "value": "application/json"
                                    }
                                ],
                                "url": {
                                    "raw": "{{baseUrl}}/price-list/{{price_list_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "price-list",
                                        "{{price_list_new}}"
                                    ]
                                },
                                "body": {
                                    "mode": "raw",
                                    "raw": "{\n    \"description\": \"Precios para clientes mayoristas\",\n    \"factor\": 25\n}",
                                    "options": {
                                        "raw": {
                                            "language": "json"
                                        }
                                    }
                                },
                                "description": "Ambos hacen exactamente lo mismo: **actualización parcial**. Solo se modifican las columnas presentes en el JSON, el resto queda intacto — no hace falta reenviar el registro completo. Se usa `PATCH` por corrección semántica y `PUT` por compatibilidad con clientes que no lo soportan. La API graba `modified` y `modified_by` automáticamente.\n\nSi el `id` no existe, ya se eliminó o queda fuera del alcance del permiso, responden `404 NO_DATA`; si el JSON no trae ninguna columna válida, `400 NO_VALID_FIELDS`.\n\n`{{price_list_new}}` ← Crear"
                            },
                            "response": []
                        },
                        {
                            "name": "Eliminar",
                            "request": {
                                "method": "DELETE",
                                "header": [],
                                "url": {
                                    "raw": "{{baseUrl}}/price-list/{{price_list_new}}",
                                    "host": [
                                        "{{baseUrl}}"
                                    ],
                                    "path": [
                                        "price-list",
                                        "{{price_list_new}}"
                                    ]
                                },
                                "description": "Elimina el registro\n\n`{{price_list_new}}` ← Crear"
                            },
                            "response": []
                        }
                    ]
                }
            ]
        }
    ]
}