---
title: "Send or replace the payer's PAN card link"
method: POST
path: "/stamps/{id}/pan-card"
tags: ["Stamps"]
---

# Send or replace the payer's PAN card link

`POST /stamps/{id}/pan-card`

## Request

- Base URL: `https://esahayak.io/api/v1`
- URL: `https://esahayak.io/api/v1/stamps/{id}/pan-card`
- Auth: HTTP bearer
- TypeScript: <https://skmtc.dev/esahayak/apis/esahayak-stamp-api/docs/stamps/:id/pan-card/post.ts> (a function with typed inputs; its response is checked against the schema)

For a stamp created through this API, until a vendor has started on it. Use it after `panCard.status` becomes `FAILED` or `REJECTED`, or to add a PAN to a stamp ordered without one. Processing is asynchronous: this answers 202 with `PROCESSING`, and the result arrives in `panCard` on the stamp and in the `stamp.pan_card_updated` webhook. A new link replaces any earlier one, including one still being processed or under review. In sandbox the file is downloaded and its type checked, but it is not stored or read: a good file ends `VERIFIED`, and a bad link fails exactly as it would live.

## Path parameters

- `id` string, uuid, required

## Request body

- object
  - `panCardImage` string, uri, required: Required. An https link, as on `StampInput.panCardImage`.

## Response `202`

Accepted for processing.

- object
  - `stampId` string, uuid
  - `panCard` StampPanCard: Where the stamp-duty payer's PAN card has got to. Never carries a link, a file or anything read off the card.
    - `status` 'NOT_PROVIDED' | 'PROCESSING' | 'VERIFIED' | 'IN_REVIEW' | 'REJECTED' | 'FAILED', required: `NOT_PROVIDED`: no PAN is on file. `PROCESSING`: being downloaded and checked. `VERIFIED`: checked against the payer. `IN_REVIEW`: could not be confirmed automatically, so a person is checking it. `REJECTED`: not accepted; send a new link. `FAILED`: the file could not be used; send a new link. A stamp ordered with a link waits in `PROCESSING`, `IN_REVIEW`, `REJECTED` and `FAILED`; one that has no PAN hold on it carries on regardless.
    - `code` string, nullable, required: Why, as a stable code. `FAILED`: `PAN_LINK_BLOCKED`, `PAN_LINK_REFUSED`, `PAN_LINK_UNREACHABLE`, `PAN_FILE_EMPTY`, `PAN_FILE_TOO_LARGE`, `PAN_FILE_UNSUPPORTED`, `PAN_FILE_UNREADABLE`. `IN_REVIEW`: `NAME_MISMATCH`, `NOT_PAN`, `SERVICE_ERROR`. `REJECTED`: `UNCLEAR_PHOTO`, `WRONG_PERSON`, `NOT_PAN`.
    - `message` string, nullable, required: The same, in words you can show your customer.

## Other responses

- `401`: Missing / invalid / expired / revoked key
- `404`: Not found (workspace + is_test scoped)
- `409`: A vendor has started on this stamp, or it is fulfilled or cancelled, or it has had too many links (10).
- `422`: `panCardImage` is missing or fails the link check (`details.code`: `INVALID_PAN_CARD_LINK`).
- `429`: Rate limit exceeded. Limits are per API key: a burst of **120 requests** with a sustained refill of **20 requests/second**. The `Retry-After` header tells you how many seconds to wait before retrying. Limits are enforced per compute instance (pilot-grade), so real-world throughput may be higher.

## Changes

- **2026-11-04** `552a6a346eee`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/esahayak/apis/esahayak-stamp-api/changes/stamps/:id/pan-card/post.md)

---

[API](https://skmtc.dev/esahayak/apis/esahayak-stamp-api.md) - [All operations](https://skmtc.dev/esahayak/apis/esahayak-stamp-api/llms.txt) - [OpenAPI document](https://skmtc.dev/esahayak/apis/esahayak-stamp-api/revisions/c36af4a5fd91?raw)
