API guide
Create cards, issue them to people and manage members from your own systems with the Qudo Ink REST API.
3 min read
The API lets your CRM, sign-up form, ticket shop or HR system do what you'd otherwise do by hand: give someone their membership card the moment they pay, add new staff with their badge, keep Members in sync.
- Base URL:
https://qudo.ink/api/v1 - Format: JSON in, JSON out
- Reference: the full OpenAPI description is at
/api/v1/openapi.json— import it into Postman, Insomnia or a code generator.
1. Create a key
Open Settings → Developers and tap Create key. Copy it straight away — it's shown once. A key acts for the workspace it was created in: a business key works with that business's cards and members; a personal key with your own cards.
Only owners and admins of a business can create keys, and a key stops working if the person who made it is no longer an owner or admin.
2. Make a request
Send the key in the Authorization header:
curl https://qudo.ink/api/v1/me \
-H "Authorization: Bearer qk_live_…"
Give someone their card
Design the card once in the app (say, Monthly membership), note its id from the editor's address bar (/dashboard/cards/<id>) or from GET /cards?issued=false, then issue a copy per person:
curl -X POST https://qudo.ink/api/v1/cards/CARD_ID/issue \
-H "Authorization: Bearer qk_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "Amina Okoye",
"email": "amina@example.com",
"role": "Members",
"details": { "tier": "Gold", "validUntil": "2027-06-30" }
}'
The response is Amina's card, with its url, number (M-00042…) and qr_svg_url. She's added to Members with the role you gave (matched by email, so repeat calls don't duplicate her), and gets that role's automatic cards. Leave out number to use the next one in sequence, or send your own.
Endpoints
| Method | Path | What it does |
|---|---|---|
GET | /me | The workspace this key belongs to — handy to test a key |
GET | /cards | List cards. Filters: kind, issued=true|false, limit (≤ 200), offset |
POST | /cards | Create a card: kind, name, title, company, email, phone, website, details, design … |
GET | /cards/{id} | One card |
PATCH | /cards/{id} | Change only the fields you send |
DELETE | /cards/{id} | Delete — its link and QR code stop working |
POST | /cards/{id}/issue | Give one person their own copy (business keys) |
GET | /members | List members. Filters: role, email, limit, offset |
POST | /members | Add or update a member by email; issues their role's automatic cards |
GET | /print-orders | Print orders and their status |
Card kinds are person, team, membership, badge, event, travel, loyalty and coupon. Each has its own details fields — the same ones you see in the editor (for example tier, memberSince and validUntil on a membership card).
Errors
Every error has the same shape and a matching HTTP status:
{ "error": { "code": "invalid_card", "message": "Add a name so people know whose card this is." } }
| Status | Meaning |
|---|---|
400 | The body isn't JSON |
401 | Missing, wrong or revoked key |
402 | That needs an active business plan |
403 | The key's creator is no longer an owner or admin |
404 | Nothing with that id in this workspace |
409 / 422 | The request can't be applied — the message says why |
429 | More than 120 requests a minute for this key |
Stay in sync with webhooks
Rather than polling, let us tell you when someone joins with a QR code, gets a card or a print order ships — see Webhooks.
Still stuck? Ask a person.
Email us and someone from the team replies — usually within one working day.