---
title: "Issue a single-use QR link"
method: POST
path: "/v1/link/issue"
---

# Issue a single-use QR link

`POST /v1/link/issue`

## Request

- Base URL: `https://api.affix-io.com`
- URL: `https://api.affix-io.com/v1/link/issue`
- Auth: one of:
  - API key in header `X-API-Key`
  - HTTP bearer

Issue a link carrier for a QR code. The response includes https_link (https://www.affix-io.com/v/<token>), deep_link (affix://v/<token>), token, expires_at and carrier. Opening https_link shows a privacy-safe pass status page. Verifying a link does not spend it: call /v1/gate/verify with circuit_id, proof (the proof_id), gate_id and mode consume to admit once; a second consume returns 409 double_spend_detected.

## Request body

- CarrierIssueRequest: Every presentment carrier must be bound to a proof you created with this API key. Send proof_digest (64 hex) or proof_ref (the proof_id from prove). Empty, unknown, someone else's or already spent proofs are refused.
  - `proof_digest` string: proof_digest returned by prove.
  - `proof_ref` string: proof_id returned by prove (e.g. pf_...). Used when proof_digest is omitted.
  - `circuit_id` string
  - `gate_id` string
  - `label` string: Your label. Not shown on the public status page.
  - `ttl_seconds` integer
  - `meta` object

## Response `201`

Carrier issued.

## Other responses

- `400`: proof_required (no proof_digest or proof_ref), unknown_proof, or invalid_request.
- `401`: API key missing or not accepted.
- `403`: proof_not_owned: the proof was created with a different API key.
- `409`: already_used: the proof has already been consumed.
- `429`: Rate limited; see Retry-After.

---

[API](https://skmtc.dev/affix-io/apis/affixio-verification-api.md) · [All operations](https://skmtc.dev/affix-io/apis/affixio-verification-api/llms.txt) · [OpenAPI document](https://skmtc.dev/affix-io/apis/affixio-verification-api/revisions/9a5f8ff2582d?raw)
