---
title: "Create Shipment"
method: POST
path: "/shipments"
tags: ["Shipments"]
---

# Create Shipment

`POST /shipments`

Attaches a carrier tracking number to a payment and begins tracking it.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `account_id` string — The unique identifier of the account, prefixed `biz_`.
  - `payment_id` string, required — The payment to attach the shipment to, prefixed `pay_`.
  - `tracking_number` string, required — The carrier-assigned tracking number.

## Response `201`

shipment created

- Shipment
  - `account_id` string, required — The account that owns this shipment, prefixed `biz_`.
  - `carrier` string, nullable, required — The shipping carrier detected for this shipment. Null until a tracking update identifies it.
  - `checkpoints` ShipmentCheckpoint[], required
    - `location` string, nullable, required — Where the carrier recorded the scan, such as `PHILADELPHIA, PA`. Null when the carrier sent none.
    - `message` string, nullable, required — Carrier's description of the scan, such as `Departed USPS Regional Facility`. Null when the carrier sent none.
    - `status` 'unknown' | 'pre_transit' | 'in_transit' | 'out_for_delivery' | 'delivered' | 'available_for_pickup' | 'return_to_sender' | 'failure' | 'cancelled' | 'error', required — Delivery status this carrier scan maps to.
    - `timestamp` string, nullable, required — When the carrier recorded the scan, as an ISO 8601 timestamp. Null when the carrier sent no scan time.
  - `created_at` string, required — The datetime the shipment was created (ISO 8601).
  - `id` string, required — Shipment ID, prefixed `ship_`.
  - `payment_id` string, required — The payment this shipment fulfills, prefixed `pay_`.
  - `status` 'unknown' | 'pre_transit' | 'in_transit' | 'out_for_delivery' | 'delivered' | 'available_for_pickup' | 'return_to_sender' | 'failure' | 'cancelled' | 'error', required — The current delivery status of this shipment.
  - `tracking_number` string, required — The carrier-assigned tracking number used to look up shipment progress.
  - `tracking_url` string, required — A customer-facing URL to track this shipment's progress.
  - `updated_at` string, required — The datetime the shipment was last updated (ISO 8601).

## Other responses

- `400` — Invalid Parameters
- `401` — Unauthorized
- `403` — Forbidden
- `409` — Conflict

## Changes

- **2026-08-12** `ae20b30817de` — 1 info
  - added the non-success response with the status `409`
- **2026-08-08** `db0883548bc5` — 1 info
  - added the required property `checkpoints` to the response with the `201` status
- **2026-08-07** `f1020c3ecda4` — 3 info
  - added the optional property `error/code` to the response with the `400` status
  - added the optional property `error/code` to the response with the `401` status
  - added the optional property `error/code` to the response with the `403` status
- **2026-07-31** `099fdc3be422` — 2 breaking, 8 warning, 9 info
  - added the new required request property `tracking_number`
  - removed the success response with the status `200`
  - removed the request property `company_id`
  - removed the request property `tracking_code`
  - …15 more
- **2026-07-26** `60bbb4a6ffbc` — 1 breaking
  - removed the required property `carrier` from the response with the `200` status

[Change history](https://skmtc.dev/whop/apis/whop-api/changes/shipments/post.md)

---

[API](https://skmtc.dev/whop/apis/whop-api.md) · [All operations](https://skmtc.dev/whop/apis/whop-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/whop/whop-api/revisions/1b5d50d09479/schema)
