> For the complete documentation index, see [llms.txt](https://docs.zipnova.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.zipnova.com/carriers/referencia-api/tarifarios.md).

# Tarifarios

Crea y administra los tarifarios del Carrier y publica sus zonas.

## GET /tariffs

> Listar los tarifarios del Carrier

```json
{"openapi":"3.1.0","info":{"title":"Zipnova Carrier API","version":"1.0.0"},"tags":[{"name":"Tariffs","description":"Tarifarios del Carrier. Sin versionado ni aprobación previa: lo publicado queda activo de inmediato."}],"servers":[{"url":"https://api.zipnova.com.ar/carrier/v1","description":"Argentina (AR)"},{"url":"https://api.zipnova.cl/carrier/v1","description":"Chile (CL)"},{"url":"https://api.zipnova.com.mx/carrier/v1","description":"México (MX)"}],"security":[{"carrierApiKey":[]}],"components":{"securitySchemes":{"carrierApiKey":{"type":"http","description":"API key del Carrier, generada desde el Carrier Hub","scheme":"bearer"}},"schemas":{"CarrierTariffResource":{"title":"Tariff","allOf":[{"properties":{"id":{"description":"ID del tarifario","type":"integer"},"service_type":{"description":"Tipo de servicio del tarifario","type":"string"},"tariff_type":{"description":"Magnitud de los rangos de costo: peso en gramos o volumen en cm³","type":"string","enum":["weight","volume"]},"zones_count":{"description":"Cantidad de zonas publicadas","type":"integer"},"pending_revisions":{"description":"Cambios de precio (zonas y costos, seguro y aforo) que esperan la aprobación de Operaciones. Solo los carriers open ya aprobados por Zipnova los tienen; hasta la decisión siguen vigentes las tarifas anteriores.","type":"array","items":{"properties":{"id":{"type":"integer"},"type":{"type":"string","enum":["rates","pricing"]},"submitted_at":{"type":"string","format":"date-time"},"summary":{"type":"object"}},"type":"object"}},"updated_at":{"description":"Última modificación del tarifario o de sus zonas","type":"string","format":"date-time"}},"type":"object"},{"$ref":"#/components/schemas/TariffAttributes"}]},"TariffAttributes":{"description":"Parámetros del tarifario. Pesos en gramos, dimensiones en cm, volúmenes en cm³ e importes en la moneda del país. Los límites en null no restringen.","properties":{"name":{"description":"Nombre del tarifario","type":"string","maxLength":100},"active":{"description":"Si el tarifario participa de la cotización. Se crea inactivo: activarlo una vez publicadas sus zonas o sus settings.","type":"boolean"},"rate_source":{"description":"table: cotiza con las zonas publicadas. api: cotiza con el callback del carrier (las zonas, si hay, quedan de fallback). Los carriers con Zipnova Rutas solo cotizan por tabla. Un carrier puede tener como máximo un tarifario api por service_type (activo o no); los de tabla no tienen límite.","type":"string","enum":["table","api"]},"logistic_types":{"description":"Tipos logísticos del tarifario. Solo se aceptan los habilitados para el carrier (ver allowed_logistic_types en GET /me).","type":"array","items":{"type":"string"}},"use_volumetric_weight":{"description":"Cotizar por el mayor entre el peso real y el peso volumétrico","type":"boolean"},"volumetric_weight_factor":{"description":"Factor de peso volumétrico en kg/m³ (ej. 250): el peso volumétrico es volumen × factor","type":["integer","null"]},"insurance_rate":{"description":"Seguro: porcentaje sobre el valor declarado","type":["number","null"]},"insurance_min_amount":{"description":"Seguro: importe mínimo que se cobra por envío","type":["number","null"]},"max_package_count":{"description":"Cantidad máxima de bultos por envío","type":["integer","null"]},"max_package_weight":{"description":"Peso máximo de cada bulto, en gramos","type":["integer","null"]},"max_package_volume":{"description":"Volumen máximo de cada bulto, en cm³","type":["integer","null"]},"max_package_dimension":{"description":"Lado más largo permitido de cada bulto, en cm","type":["integer","null"]},"max_package_dimension_sum":{"description":"Suma máxima de los tres lados de cada bulto, en cm","type":["integer","null"]},"max_package_width":{"description":"Ancho máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_height":{"description":"Alto máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_contour":{"description":"Contorno máximo de cada bulto, en cm","type":["integer","null"]},"min_shipment_weight":{"description":"Peso total mínimo del envío, en gramos. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_weight":{"description":"Peso total máximo del envío, en gramos","type":["integer","null"]},"min_shipment_volume":{"description":"Volumen total mínimo del envío, en cm³. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_volume":{"description":"Volumen total máximo del envío, en cm³","type":["integer","null"]},"min_declared_value":{"description":"Valor declarado mínimo del envío. Null equivale a 0 (sin mínimo).","type":["number","null"]},"max_declared_value":{"description":"Valor declarado máximo del envío","type":["number","null"]},"settings":{"description":"Valores key-value que se envían al callback de cotización (según el settings_schema del carrier). Con Zipnova Rutas es obligatorio y lleva service_type_code: el código del tipo de servicio de la organización en Rutas que corresponde al tarifario.","type":["object","null"]}},"type":"object"}}},"paths":{"/tariffs":{"get":{"tags":["Tariffs"],"summary":"Listar los tarifarios del Carrier","operationId":"c5b4ae1862cfed50df189d0b67f66352","responses":{"200":{"description":"Tarifarios","content":{"application/json":{"schema":{"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CarrierTariffResource"}}},"type":"object"}}}}}}}}}
```

## POST /tariffs

> Crear un tarifario. Se crea inactivo: activarlo después de publicar sus zonas o sus settings.

```json
{"openapi":"3.1.0","info":{"title":"Zipnova Carrier API","version":"1.0.0"},"tags":[{"name":"Tariffs","description":"Tarifarios del Carrier. Sin versionado ni aprobación previa: lo publicado queda activo de inmediato."}],"servers":[{"url":"https://api.zipnova.com.ar/carrier/v1","description":"Argentina (AR)"},{"url":"https://api.zipnova.cl/carrier/v1","description":"Chile (CL)"},{"url":"https://api.zipnova.com.mx/carrier/v1","description":"México (MX)"}],"security":[{"carrierApiKey":[]}],"components":{"securitySchemes":{"carrierApiKey":{"type":"http","description":"API key del Carrier, generada desde el Carrier Hub","scheme":"bearer"}},"schemas":{"StoreTariffRequest":{"title":"Create tariff","required":["name","service_type","logistic_types"],"allOf":[{"$ref":"#/components/schemas/TariffAttributes"},{"properties":{"service_type":{"description":"Tipo de servicio del tarifario. Se envía como service_type en el callback de cotización. pickup_point (retiro en punto) todavía no es compatible. No se puede cambiar después.","type":"string","enum":["standard_delivery","meli_flex","meli_turbo","express_delivery"]},"tariff_type":{"description":"Magnitud de los rangos de costo: peso en gramos (weight) o volumen en cm³ (volume)","type":"string","enum":["weight","volume"]}},"type":"object"}]},"TariffAttributes":{"description":"Parámetros del tarifario. Pesos en gramos, dimensiones en cm, volúmenes en cm³ e importes en la moneda del país. Los límites en null no restringen.","properties":{"name":{"description":"Nombre del tarifario","type":"string","maxLength":100},"active":{"description":"Si el tarifario participa de la cotización. Se crea inactivo: activarlo una vez publicadas sus zonas o sus settings.","type":"boolean"},"rate_source":{"description":"table: cotiza con las zonas publicadas. api: cotiza con el callback del carrier (las zonas, si hay, quedan de fallback). Los carriers con Zipnova Rutas solo cotizan por tabla. Un carrier puede tener como máximo un tarifario api por service_type (activo o no); los de tabla no tienen límite.","type":"string","enum":["table","api"]},"logistic_types":{"description":"Tipos logísticos del tarifario. Solo se aceptan los habilitados para el carrier (ver allowed_logistic_types en GET /me).","type":"array","items":{"type":"string"}},"use_volumetric_weight":{"description":"Cotizar por el mayor entre el peso real y el peso volumétrico","type":"boolean"},"volumetric_weight_factor":{"description":"Factor de peso volumétrico en kg/m³ (ej. 250): el peso volumétrico es volumen × factor","type":["integer","null"]},"insurance_rate":{"description":"Seguro: porcentaje sobre el valor declarado","type":["number","null"]},"insurance_min_amount":{"description":"Seguro: importe mínimo que se cobra por envío","type":["number","null"]},"max_package_count":{"description":"Cantidad máxima de bultos por envío","type":["integer","null"]},"max_package_weight":{"description":"Peso máximo de cada bulto, en gramos","type":["integer","null"]},"max_package_volume":{"description":"Volumen máximo de cada bulto, en cm³","type":["integer","null"]},"max_package_dimension":{"description":"Lado más largo permitido de cada bulto, en cm","type":["integer","null"]},"max_package_dimension_sum":{"description":"Suma máxima de los tres lados de cada bulto, en cm","type":["integer","null"]},"max_package_width":{"description":"Ancho máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_height":{"description":"Alto máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_contour":{"description":"Contorno máximo de cada bulto, en cm","type":["integer","null"]},"min_shipment_weight":{"description":"Peso total mínimo del envío, en gramos. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_weight":{"description":"Peso total máximo del envío, en gramos","type":["integer","null"]},"min_shipment_volume":{"description":"Volumen total mínimo del envío, en cm³. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_volume":{"description":"Volumen total máximo del envío, en cm³","type":["integer","null"]},"min_declared_value":{"description":"Valor declarado mínimo del envío. Null equivale a 0 (sin mínimo).","type":["number","null"]},"max_declared_value":{"description":"Valor declarado máximo del envío","type":["number","null"]},"settings":{"description":"Valores key-value que se envían al callback de cotización (según el settings_schema del carrier). Con Zipnova Rutas es obligatorio y lleva service_type_code: el código del tipo de servicio de la organización en Rutas que corresponde al tarifario.","type":["object","null"]}},"type":"object"},"CarrierTariffResource":{"title":"Tariff","allOf":[{"properties":{"id":{"description":"ID del tarifario","type":"integer"},"service_type":{"description":"Tipo de servicio del tarifario","type":"string"},"tariff_type":{"description":"Magnitud de los rangos de costo: peso en gramos o volumen en cm³","type":"string","enum":["weight","volume"]},"zones_count":{"description":"Cantidad de zonas publicadas","type":"integer"},"pending_revisions":{"description":"Cambios de precio (zonas y costos, seguro y aforo) que esperan la aprobación de Operaciones. Solo los carriers open ya aprobados por Zipnova los tienen; hasta la decisión siguen vigentes las tarifas anteriores.","type":"array","items":{"properties":{"id":{"type":"integer"},"type":{"type":"string","enum":["rates","pricing"]},"submitted_at":{"type":"string","format":"date-time"},"summary":{"type":"object"}},"type":"object"}},"updated_at":{"description":"Última modificación del tarifario o de sus zonas","type":"string","format":"date-time"}},"type":"object"},{"$ref":"#/components/schemas/TariffAttributes"}]}}},"paths":{"/tariffs":{"post":{"tags":["Tariffs"],"summary":"Crear un tarifario. Se crea inactivo: activarlo después de publicar sus zonas o sus settings.","operationId":"81d2844e751222b7fc89ff184f1822e8","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StoreTariffRequest"}}}},"responses":{"201":{"description":"Tarifario creado","content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CarrierTariffResource"}},"type":"object"}}}},"422":{"description":"Datos inválidos, tipo logístico no permitido o ya existe un tarifario por API de ese service_type (errors.service_type: \"A custom carrier can have only one API tariff per service type.\")"}}}}}}
```

## GET /tariffs/{tariff\_id}

> Detalle de un tarifario

```json
{"openapi":"3.1.0","info":{"title":"Zipnova Carrier API","version":"1.0.0"},"tags":[{"name":"Tariffs","description":"Tarifarios del Carrier. Sin versionado ni aprobación previa: lo publicado queda activo de inmediato."}],"servers":[{"url":"https://api.zipnova.com.ar/carrier/v1","description":"Argentina (AR)"},{"url":"https://api.zipnova.cl/carrier/v1","description":"Chile (CL)"},{"url":"https://api.zipnova.com.mx/carrier/v1","description":"México (MX)"}],"security":[{"carrierApiKey":[]}],"components":{"securitySchemes":{"carrierApiKey":{"type":"http","description":"API key del Carrier, generada desde el Carrier Hub","scheme":"bearer"}},"schemas":{"CarrierTariffResource":{"title":"Tariff","allOf":[{"properties":{"id":{"description":"ID del tarifario","type":"integer"},"service_type":{"description":"Tipo de servicio del tarifario","type":"string"},"tariff_type":{"description":"Magnitud de los rangos de costo: peso en gramos o volumen en cm³","type":"string","enum":["weight","volume"]},"zones_count":{"description":"Cantidad de zonas publicadas","type":"integer"},"pending_revisions":{"description":"Cambios de precio (zonas y costos, seguro y aforo) que esperan la aprobación de Operaciones. Solo los carriers open ya aprobados por Zipnova los tienen; hasta la decisión siguen vigentes las tarifas anteriores.","type":"array","items":{"properties":{"id":{"type":"integer"},"type":{"type":"string","enum":["rates","pricing"]},"submitted_at":{"type":"string","format":"date-time"},"summary":{"type":"object"}},"type":"object"}},"updated_at":{"description":"Última modificación del tarifario o de sus zonas","type":"string","format":"date-time"}},"type":"object"},{"$ref":"#/components/schemas/TariffAttributes"}]},"TariffAttributes":{"description":"Parámetros del tarifario. Pesos en gramos, dimensiones en cm, volúmenes en cm³ e importes en la moneda del país. Los límites en null no restringen.","properties":{"name":{"description":"Nombre del tarifario","type":"string","maxLength":100},"active":{"description":"Si el tarifario participa de la cotización. Se crea inactivo: activarlo una vez publicadas sus zonas o sus settings.","type":"boolean"},"rate_source":{"description":"table: cotiza con las zonas publicadas. api: cotiza con el callback del carrier (las zonas, si hay, quedan de fallback). Los carriers con Zipnova Rutas solo cotizan por tabla. Un carrier puede tener como máximo un tarifario api por service_type (activo o no); los de tabla no tienen límite.","type":"string","enum":["table","api"]},"logistic_types":{"description":"Tipos logísticos del tarifario. Solo se aceptan los habilitados para el carrier (ver allowed_logistic_types en GET /me).","type":"array","items":{"type":"string"}},"use_volumetric_weight":{"description":"Cotizar por el mayor entre el peso real y el peso volumétrico","type":"boolean"},"volumetric_weight_factor":{"description":"Factor de peso volumétrico en kg/m³ (ej. 250): el peso volumétrico es volumen × factor","type":["integer","null"]},"insurance_rate":{"description":"Seguro: porcentaje sobre el valor declarado","type":["number","null"]},"insurance_min_amount":{"description":"Seguro: importe mínimo que se cobra por envío","type":["number","null"]},"max_package_count":{"description":"Cantidad máxima de bultos por envío","type":["integer","null"]},"max_package_weight":{"description":"Peso máximo de cada bulto, en gramos","type":["integer","null"]},"max_package_volume":{"description":"Volumen máximo de cada bulto, en cm³","type":["integer","null"]},"max_package_dimension":{"description":"Lado más largo permitido de cada bulto, en cm","type":["integer","null"]},"max_package_dimension_sum":{"description":"Suma máxima de los tres lados de cada bulto, en cm","type":["integer","null"]},"max_package_width":{"description":"Ancho máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_height":{"description":"Alto máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_contour":{"description":"Contorno máximo de cada bulto, en cm","type":["integer","null"]},"min_shipment_weight":{"description":"Peso total mínimo del envío, en gramos. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_weight":{"description":"Peso total máximo del envío, en gramos","type":["integer","null"]},"min_shipment_volume":{"description":"Volumen total mínimo del envío, en cm³. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_volume":{"description":"Volumen total máximo del envío, en cm³","type":["integer","null"]},"min_declared_value":{"description":"Valor declarado mínimo del envío. Null equivale a 0 (sin mínimo).","type":["number","null"]},"max_declared_value":{"description":"Valor declarado máximo del envío","type":["number","null"]},"settings":{"description":"Valores key-value que se envían al callback de cotización (según el settings_schema del carrier). Con Zipnova Rutas es obligatorio y lleva service_type_code: el código del tipo de servicio de la organización en Rutas que corresponde al tarifario.","type":["object","null"]}},"type":"object"}}},"paths":{"/tariffs/{tariff_id}":{"get":{"tags":["Tariffs"],"summary":"Detalle de un tarifario","operationId":"f9ff5da99c015d04b92b46b4a64f762a","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Tarifario","content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CarrierTariffResource"}},"type":"object"}}}},"404":{"description":"El tarifario no existe o no es del Carrier"}}}}}}
```

## Editar un tarifario (parámetros, settings de cotización o activación)

> En un carrier open ya aprobado por Zipnova, los cambios de seguro y aforo no se aplican: quedan como pending\_revisions hasta que Operaciones los apruebe.

```json
{"openapi":"3.1.0","info":{"title":"Zipnova Carrier API","version":"1.0.0"},"tags":[{"name":"Tariffs","description":"Tarifarios del Carrier. Sin versionado ni aprobación previa: lo publicado queda activo de inmediato."}],"servers":[{"url":"https://api.zipnova.com.ar/carrier/v1","description":"Argentina (AR)"},{"url":"https://api.zipnova.cl/carrier/v1","description":"Chile (CL)"},{"url":"https://api.zipnova.com.mx/carrier/v1","description":"México (MX)"}],"security":[{"carrierApiKey":[]}],"components":{"securitySchemes":{"carrierApiKey":{"type":"http","description":"API key del Carrier, generada desde el Carrier Hub","scheme":"bearer"}},"schemas":{"UpdateTariffRequest":{"title":"Update tariff","description":"Edición parcial. service_type y tariff_type no pueden cambiarse.","allOf":[{"$ref":"#/components/schemas/TariffAttributes"}]},"TariffAttributes":{"description":"Parámetros del tarifario. Pesos en gramos, dimensiones en cm, volúmenes en cm³ e importes en la moneda del país. Los límites en null no restringen.","properties":{"name":{"description":"Nombre del tarifario","type":"string","maxLength":100},"active":{"description":"Si el tarifario participa de la cotización. Se crea inactivo: activarlo una vez publicadas sus zonas o sus settings.","type":"boolean"},"rate_source":{"description":"table: cotiza con las zonas publicadas. api: cotiza con el callback del carrier (las zonas, si hay, quedan de fallback). Los carriers con Zipnova Rutas solo cotizan por tabla. Un carrier puede tener como máximo un tarifario api por service_type (activo o no); los de tabla no tienen límite.","type":"string","enum":["table","api"]},"logistic_types":{"description":"Tipos logísticos del tarifario. Solo se aceptan los habilitados para el carrier (ver allowed_logistic_types en GET /me).","type":"array","items":{"type":"string"}},"use_volumetric_weight":{"description":"Cotizar por el mayor entre el peso real y el peso volumétrico","type":"boolean"},"volumetric_weight_factor":{"description":"Factor de peso volumétrico en kg/m³ (ej. 250): el peso volumétrico es volumen × factor","type":["integer","null"]},"insurance_rate":{"description":"Seguro: porcentaje sobre el valor declarado","type":["number","null"]},"insurance_min_amount":{"description":"Seguro: importe mínimo que se cobra por envío","type":["number","null"]},"max_package_count":{"description":"Cantidad máxima de bultos por envío","type":["integer","null"]},"max_package_weight":{"description":"Peso máximo de cada bulto, en gramos","type":["integer","null"]},"max_package_volume":{"description":"Volumen máximo de cada bulto, en cm³","type":["integer","null"]},"max_package_dimension":{"description":"Lado más largo permitido de cada bulto, en cm","type":["integer","null"]},"max_package_dimension_sum":{"description":"Suma máxima de los tres lados de cada bulto, en cm","type":["integer","null"]},"max_package_width":{"description":"Ancho máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_height":{"description":"Alto máximo de cada bulto, en cm (solo bulto vertical)","type":["integer","null"]},"max_package_contour":{"description":"Contorno máximo de cada bulto, en cm","type":["integer","null"]},"min_shipment_weight":{"description":"Peso total mínimo del envío, en gramos. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_weight":{"description":"Peso total máximo del envío, en gramos","type":["integer","null"]},"min_shipment_volume":{"description":"Volumen total mínimo del envío, en cm³. Null equivale a 0 (sin mínimo).","type":["integer","null"]},"max_shipment_volume":{"description":"Volumen total máximo del envío, en cm³","type":["integer","null"]},"min_declared_value":{"description":"Valor declarado mínimo del envío. Null equivale a 0 (sin mínimo).","type":["number","null"]},"max_declared_value":{"description":"Valor declarado máximo del envío","type":["number","null"]},"settings":{"description":"Valores key-value que se envían al callback de cotización (según el settings_schema del carrier). Con Zipnova Rutas es obligatorio y lleva service_type_code: el código del tipo de servicio de la organización en Rutas que corresponde al tarifario.","type":["object","null"]}},"type":"object"},"CarrierTariffResource":{"title":"Tariff","allOf":[{"properties":{"id":{"description":"ID del tarifario","type":"integer"},"service_type":{"description":"Tipo de servicio del tarifario","type":"string"},"tariff_type":{"description":"Magnitud de los rangos de costo: peso en gramos o volumen en cm³","type":"string","enum":["weight","volume"]},"zones_count":{"description":"Cantidad de zonas publicadas","type":"integer"},"pending_revisions":{"description":"Cambios de precio (zonas y costos, seguro y aforo) que esperan la aprobación de Operaciones. Solo los carriers open ya aprobados por Zipnova los tienen; hasta la decisión siguen vigentes las tarifas anteriores.","type":"array","items":{"properties":{"id":{"type":"integer"},"type":{"type":"string","enum":["rates","pricing"]},"submitted_at":{"type":"string","format":"date-time"},"summary":{"type":"object"}},"type":"object"}},"updated_at":{"description":"Última modificación del tarifario o de sus zonas","type":"string","format":"date-time"}},"type":"object"},{"$ref":"#/components/schemas/TariffAttributes"}]}}},"paths":{"/tariffs/{tariff_id}":{"put":{"tags":["Tariffs"],"summary":"Editar un tarifario (parámetros, settings de cotización o activación)","description":"En un carrier open ya aprobado por Zipnova, los cambios de seguro y aforo no se aplican: quedan como pending_revisions hasta que Operaciones los apruebe.","operationId":"10674142ce4786a68d6b01b69b8aa5fb","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTariffRequest"}}}},"responses":{"200":{"description":"Tarifario actualizado","content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/CarrierTariffResource"}},"type":"object"}}}},"404":{"description":"El tarifario no existe o no es del Carrier"},"422":{"description":"Datos inválidos o, al pasar rate_source de table a api, ya existe un tarifario por API de ese service_type (errors.rate_source: \"A custom carrier can have only one API tariff per service type.\")"}}}}}}
```

## Publicar zonas del tarifario: reemplazo total (mode=replace, por defecto) o incremental por nombre de zona (mode=upsert)

> En un carrier open ya aprobado por Zipnova, la publicación no reemplaza las tarifas vigentes: queda pendiente de la aprobación de Operaciones (pending\_approval en la publicación).

```json
{"openapi":"3.1.0","info":{"title":"Zipnova Carrier API","version":"1.0.0"},"tags":[{"name":"Tariffs","description":"Tarifarios del Carrier. Sin versionado ni aprobación previa: lo publicado queda activo de inmediato."}],"servers":[{"url":"https://api.zipnova.com.ar/carrier/v1","description":"Argentina (AR)"},{"url":"https://api.zipnova.cl/carrier/v1","description":"Chile (CL)"},{"url":"https://api.zipnova.com.mx/carrier/v1","description":"México (MX)"}],"security":[{"carrierApiKey":[]}],"components":{"securitySchemes":{"carrierApiKey":{"type":"http","description":"API key del Carrier, generada desde el Carrier Hub","scheme":"bearer"}},"schemas":{"ImportTariffRatesRequest":{"title":"Publish tariff zones","description":"Cada zona define sus rangos de costo, sus destinos y sus orígenes. Con mode=replace (por defecto) se reemplazan todas las zonas del tarifario; con mode=upsert se reemplazan solo las zonas enviadas (por nombre) y el resto queda intacto. La publicación se procesa en segundo plano. En un carrier restringido, privado o todavía no aprobado queda vigente al terminar; en un carrier open ya aprobado por Zipnova queda pendiente de la aprobación de Operaciones (pending_approval en la publicación) y las tarifas vigentes no cambian hasta entonces.","required":["zones"],"properties":{"mode":{"description":"replace: reemplaza todas las zonas. upsert: reemplaza solo las zonas enviadas (por nombre).","type":"string","default":"replace","enum":["replace","upsert"]},"zones":{"description":"Zonas del tarifario","type":"array","items":{"required":["name","costs","destinations","origins"],"properties":{"name":{"description":"Nombre de la zona (clave para el upsert)","type":"string"},"costs":{"description":"Rangos escalonados. max_cargo es el tope del rango en gramos (tarifario por peso) o cm³ (por volumen)","type":"array","items":{"properties":{"max_cargo":{"description":"Gramos o cm³, entero positivo","type":"integer"},"value":{"description":"Importe del rango, en la moneda del país","type":"number"}},"type":"object"}},"destinations":{"description":"Destinos que cubre la zona","type":"array","items":{"allOf":[{"$ref":"#/components/schemas/TariffLocation"},{"properties":{"delivery_time_min":{"description":"Días","type":["integer","null"]},"delivery_time_max":{"description":"Días","type":["integer","null"]}},"type":"object"}]}},"origins":{"description":"Orígenes desde los que aplica la zona","type":"array","items":{"$ref":"#/components/schemas/TariffLocation"}}},"type":"object"}}},"type":"object"},"TariffLocation":{"required":["type","value"],"properties":{"type":{"description":"Tipo de ubicación","type":"string","enum":["zipcode","city_id","state","country"]},"value":{"description":"Código postal, id de ciudad de Zipnova, código de provincia/región o código ISO de país","type":"string"}},"type":"object"},"TariffImportResource":{"title":"Tariff import","properties":{"id":{"description":"ID de la publicación (import_id)","type":"integer"},"tariff_id":{"description":"ID del tarifario","type":"integer"},"status":{"description":"pending y processing: en curso. finished: publicada y activa, o a la espera de aprobación si pending_approval es true. failed: no se aplicó ningún cambio (ver errors).","type":"string","enum":["pending","processing","finished","failed"]},"pending_approval":{"description":"true mientras el cambio espera la aprobación de Operaciones (carrier ya aprobado por Zipnova): las tarifas vigentes no cambian hasta entonces. Pasa a false cuando se aplica, se rechaza, se reemplaza o combina en otro cambio, o falla (ver revision_status)","type":"boolean"},"revision_id":{"description":"ID del cambio generado por la publicación cuando requiere aprobación de Operaciones","type":["integer","null"]},"revision_status":{"description":"Estado del cambio: pending (espera a Operaciones), approved (aprobado, aplicándose), applied, rejected, superseded (reemplazado o combinado en un cambio posterior) o failed (no se pudo aplicar). null si la publicación no generó un cambio","type":["string","null"]},"zones_total":{"description":"Zonas recibidas","type":"integer"},"zones_processed":{"description":"Zonas publicadas","type":"integer"},"errors":{"description":"Errores de validación encontrados (máximo 100)","type":"array","items":{"type":"string"}},"error_details":{"description":"Los mismos errores, con el archivo y la línea cuando se publicó con archivos (file y line en null si el error no es de una línea)","type":"array","items":{"properties":{"file":{"type":["string","null"]},"line":{"description":"Línea del archivo; el encabezado es la 1","type":["integer","null"]},"message":{"type":"string"}},"type":"object"}},"created_at":{"description":"Fecha de recepción de la publicación","type":"string","format":"date-time"},"finished_at":{"description":"Fecha de fin del proceso","type":["string","null"],"format":"date-time"}},"type":"object"}}},"paths":{"/tariffs/{tariff_id}/rates":{"put":{"tags":["Tariffs"],"summary":"Publicar zonas del tarifario: reemplazo total (mode=replace, por defecto) o incremental por nombre de zona (mode=upsert)","description":"En un carrier open ya aprobado por Zipnova, la publicación no reemplaza las tarifas vigentes: queda pendiente de la aprobación de Operaciones (pending_approval en la publicación).","operationId":"3550c8ad9ae1f1edf399fef4bea9b02c","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportTariffRatesRequest"}}}},"responses":{"202":{"description":"Publicación encolada","content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TariffImportResource"}},"type":"object"}}}},"404":{"description":"El tarifario no existe o no es del Carrier"},"422":{"description":"Payload inválido o demasiado grande"}}}}}}
```

## GET /tariffs/{tariff\_id}/imports/{import\_id}

> Estado de una publicación de zonas

```json
{"openapi":"3.1.0","info":{"title":"Zipnova Carrier API","version":"1.0.0"},"tags":[{"name":"Tariffs","description":"Tarifarios del Carrier. Sin versionado ni aprobación previa: lo publicado queda activo de inmediato."}],"servers":[{"url":"https://api.zipnova.com.ar/carrier/v1","description":"Argentina (AR)"},{"url":"https://api.zipnova.cl/carrier/v1","description":"Chile (CL)"},{"url":"https://api.zipnova.com.mx/carrier/v1","description":"México (MX)"}],"security":[{"carrierApiKey":[]}],"components":{"securitySchemes":{"carrierApiKey":{"type":"http","description":"API key del Carrier, generada desde el Carrier Hub","scheme":"bearer"}},"schemas":{"TariffImportResource":{"title":"Tariff import","properties":{"id":{"description":"ID de la publicación (import_id)","type":"integer"},"tariff_id":{"description":"ID del tarifario","type":"integer"},"status":{"description":"pending y processing: en curso. finished: publicada y activa, o a la espera de aprobación si pending_approval es true. failed: no se aplicó ningún cambio (ver errors).","type":"string","enum":["pending","processing","finished","failed"]},"pending_approval":{"description":"true mientras el cambio espera la aprobación de Operaciones (carrier ya aprobado por Zipnova): las tarifas vigentes no cambian hasta entonces. Pasa a false cuando se aplica, se rechaza, se reemplaza o combina en otro cambio, o falla (ver revision_status)","type":"boolean"},"revision_id":{"description":"ID del cambio generado por la publicación cuando requiere aprobación de Operaciones","type":["integer","null"]},"revision_status":{"description":"Estado del cambio: pending (espera a Operaciones), approved (aprobado, aplicándose), applied, rejected, superseded (reemplazado o combinado en un cambio posterior) o failed (no se pudo aplicar). null si la publicación no generó un cambio","type":["string","null"]},"zones_total":{"description":"Zonas recibidas","type":"integer"},"zones_processed":{"description":"Zonas publicadas","type":"integer"},"errors":{"description":"Errores de validación encontrados (máximo 100)","type":"array","items":{"type":"string"}},"error_details":{"description":"Los mismos errores, con el archivo y la línea cuando se publicó con archivos (file y line en null si el error no es de una línea)","type":"array","items":{"properties":{"file":{"type":["string","null"]},"line":{"description":"Línea del archivo; el encabezado es la 1","type":["integer","null"]},"message":{"type":"string"}},"type":"object"}},"created_at":{"description":"Fecha de recepción de la publicación","type":"string","format":"date-time"},"finished_at":{"description":"Fecha de fin del proceso","type":["string","null"],"format":"date-time"}},"type":"object"}}},"paths":{"/tariffs/{tariff_id}/imports/{import_id}":{"get":{"tags":["Tariffs"],"summary":"Estado de una publicación de zonas","operationId":"fc5af8f3fdacff0fe0c781b41c03974b","parameters":[{"name":"tariff_id","in":"path","required":true,"schema":{"type":"integer"}},{"name":"import_id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Estado de la publicación","content":{"application/json":{"schema":{"properties":{"data":{"$ref":"#/components/schemas/TariffImportResource"}},"type":"object"}}}},"404":{"description":"La publicación no existe"}}}}}}
```
