# 321label > Buy a shipping label in a few steps — API-first, built for AI agents. > Live since 28-09-2026. One core behind three surfaces: REST (this API), MCP, and a human UI. ## For people Buy a shipping label in three steps at https://321label.com — the sender is optional, pay by card, Apple Pay or Google Pay, or pay later. Create an account at https://321label.com/account for a prepaid wallet and invoices; self-serve API keys live at /account#/developers and agent tokens at /account#/agents. ## API - OpenAPI: https://321label.com/openapi.json - Interactive docs: https://321label.com/docs - POST /v1/quotes — live rates in carrier terms, cheapest first - POST /v1/labels — mint a label (`sandbox:true` = full dry-run, nothing charged) - GET /v1/labels/{id} — read back · POST /v1/labels/{id}/cancel — void (idempotent) - GET /v1/shipments/{ref} — track · GET /v1/carriers — what's offered where ## MCP - Endpoint: https://mcp.321label.com/mcp (streamable HTTP) - Tools: quote_label (live rates) · create_label (mint a label) · get_label (read an order back) · track_shipment (track by ref) · cancel_label (void, idempotent) · list_carriers (what's offered where) · get_wallet (read your prepaid balance) · list_labels (list your account's labels) · create_topup_link (top up your wallet) ## Conventions - snake_case keys; units set globally (`metric` kg/cm or `imperial` lb/in) — no unit suffixes - Carrier abstracted: `cheapest` | `fastest` | gls | postnord | dhl | ups | bring | dao | evri | dpd | royal mail | dhl ecommerce | fedex | postnl | asendia | dfm - Errors: {"error": {"code", "message", "doc_url", "field"}}; send Idempotency-Key on POST /v1/labels - Status lifecycle: quoted → awaiting_payment | issued_unpaid → paid → (void | expired) - Quotes and charges are in the requested `currency` (DKK default; EUR, USD, GBP, SEK, NOK supported). ## Status Live since 28-09-2026. Full reference: https://321label.com/llms-full.txt