---
title: "Crear (o reutilizar) un remitente"
method: POST
path: "/senders"
tags: ["addresses"]
---

# Crear (o reutilizar) un remitente

`POST /senders`

## Request

- Base URL: `https://api.enviadores.com.mx/api/v1`
- URL: `https://api.enviadores.com.mx/api/v1/senders`
- Auth: HTTP bearer

Create-or-reuse con el MISMO dedupe exacto normalizado que usa `POST /shipments` al registrar direcciones inline, evaluado sobre las filas visibles para la llave: si ya existe un remitente idéntico visible, se devuelve ese (`created: false`, 200); si no, se crea (`created: true`, 201). El `postal_code` debe tener 5 dígitos y EXISTIR en el catálogo postal (SEPOMEX); si `city`/`state` vienen, deben ser coherentes con el CP (un desajuste responde 422 nombrando el valor esperado) y si se omiten se AUTOCOMPLETAN del catálogo — la misma validación de exactitud que `POST /contacts/import`. Requiere scope `addresses:write`. Con `X-PDV-ID` (llave admin), la fila creada pertenece al directorio de ese PDV y queda visible para su personal.

## Headers

- `X-PDV-ID` string

## Request body

- SenderCreateRequest: El mismo vocabulario de campos que el `from` de `POST /shipments`, con `city`/`state` opcionales aquí (se autocompletan del catálogo SEPOMEX según el CP — la misma validación de exactitud que `POST /contacts/import`). `name` es el nombre completo; `apellido_paterno`/`apellido_materno` están deprecados (se aceptan y se integran a `name`). Campos desconocidos → 422. Los campos exceden-longitud se recortan al límite de columna.
  - `name` string, required: Nombre de pila (`nombre`).
  - `apellido_paterno` string: DEPRECATED (2026-09-21): el nombre completo va en `name`. Aún se acepta y se integra a `name` al guardar.
  - `apellido_materno` string: DEPRECATED (2026-09-21): el nombre completo va en `name`. Aún se acepta y se integra a `name` al guardar.
  - `company` string: Razón social.
  - `rfc` string
  - `phone` string, required
  - `email` string, email
  - `street` string, required
  - `number` string: Número exterior.
  - `colonia` string, required
  - `city` string: Opcional: si se omite se autocompleta del catálogo SEPOMEX según el CP; si viene, debe coincidir con el CP (si no → 422 nombrando la ciudad esperada).
  - `state` string: Opcional: si se omite se autocompleta del catálogo SEPOMEX según el CP; si viene, debe coincidir con el CP (si no → 422 nombrando el estado esperado).
  - `postal_code` string, required: 5 dígitos; debe EXISTIR en el catálogo postal (SEPOMEX).
  - `country` 'MX': Opcional. Solo `MX` — cualquier otro valor responde 422.

## Response `200`

Remitente idéntico ya existente reutilizado (`created: false`).

- object
  - `success` unknown, required
  - `data` object, required
    - `sender` Sender, required: Recurso remitente. Su `id` sirve como `from_id` en `POST /rates` y `POST /shipments`.
      - `id` string, required
      - `name` string, nullable, required
      - `apellido_paterno` unknown, required
      - `apellido_materno` unknown, required
      - `company` string, nullable, required
      - `rfc` string, nullable, required
      - `phone` string, nullable, required
      - `email` string, nullable, required
      - `street` string, nullable, required
      - `number` string, nullable, required
      - `colonia` string, nullable, required
      - `city` string, nullable, required
      - `state` string, nullable, required
      - `postal_code` string, nullable, required
      - `created_at` string, nullable, required: ISO-8601 UTC (Z).
    - `created` boolean, required
  - `requestId` string, required: Correlación de logs; también en el header `X-Request-Id`.

## Other responses

- `201`: Remitente creado (`created: true`).
- `401`: `UNAUTHORIZED` — credencial Bearer ausente/mal formada o llave desconocida/revocada (respuesta idéntica en ambos casos).
- `403`: `INSUFFICIENT_SCOPE` — a la llave le falta el scope requerido · `PDV_NOT_ALLOWED` — violación del carril X-PDV-ID. Nota de orden: el limitador por llave corre ANTES del gate de scope, así que una petición con scope incorrecto y el bucket agotado responde `429 RATE_LIMITED` (el 429 tiene precedencia sobre este 403).
- `422`: `VALIDATION_ERROR` — campos faltantes/inválidos o desconocidos (details.fields).
- `429`: `RATE_LIMITED` — bucket de la llave agotado. Espera `Retry-After` s (`details.retry_after_ms` para el hint fino). El limitador corre antes del gate de scope, por lo que un 429 tiene precedencia sobre un 403 `INSUFFICIENT_SCOPE`.
- `500`: `ADDRESS_ERROR` — no se pudo registrar; reintenta.

---

[API](https://skmtc.dev/enviadores/apis/enviadores-public-api.md) · [All operations](https://skmtc.dev/enviadores/apis/enviadores-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/enviadores/apis/enviadores-public-api/revisions/3633f08c889c?raw)
