← Back to home

API Documentation

REST API for short links, branded QR codes, bio pages, and link packages. Business package

Base URL & authentication

All endpoints live under:

https://qrsa.net/app/api/v1

Authenticate every request with your API key in the X-API-Key header (find it in Settings → API Access). Programmatic API access is exclusive to the Business package and includes 10,000 API requests per 30-day usage period.

curl -H "X-API-Key: YOUR_API_KEY" https://qrsa.net/app/api/v1/links/

Response shape

Every response is JSON. Success: { "success": true, "data": { … } }. Error: { "success": false, "error": "message", "code": "CODE" }. Missing/invalid key returns 401. Rate limit: 60 requests/min per key.

Endpoints

Links · QR templates · Tags · Bio pages · Account & stats · Billing · Pricing (public)

Links

GET/links/

List your links (paginated). Query: ?page=, ?search=, ?tag= (filter by a single tag). Each link object includes a tags array, qr_code_url (PNG), short_url, and click_count.

POST/links/

Create a short link + QR. Body:

FieldRequiredNotes
original_urlyesDestination URL
custom_slugnoCustom short slug (must be unique)
titlenoLabel
expires_atnoISO 8601; must be in the future; capped by plan
template_idnoApply a saved QR template (design + logo)
qr_colornoHex, e.g. #6c63ff
qr_stylenoclassic · rounded · dots · bars
qr_framenoBranded frame: none, scan_btm, scan_top, round_btm, arrow, ticket, coffee, … (append _ar for Arabic text)
logo_placementnocenter · background
tagsnoArray of labels (Pro). Lowercased & de-duped; max 15 × 40 chars. Ignored on plans without tagging.
curl -X POST https://qrsa.net/app/api/v1/links/ \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"original_url":"https://example.com","template_id":"<TEMPLATE_ID>"}'
GET/links/{slug}/
PATCH/links/{slug}/

Update original_url, custom_slug, title, expires_at, is_active, tags, QR design. (Sending tags replaces the full set.) The QR keeps working — it encodes a permanent ID, not the slug.

DELETE/links/{slug}/
GET/links/{slug}/stats/

Click analytics for a link (totals, recent, device split).

GET/links/{slug}/qr/

Download the QR as a PNG (binary).

Manage links

POST/links/bulk-delete/

Delete several links at once. Body: { "slugs": ["abc123", "def456"] }.

POST/links/{slug}/logo/

Upload a center/background logo for the link's QR (multipart/form-data, field logo).

POST/links/{slug}/qr-image/

Replace the QR image with your own styled PNG (multipart/form-data, field image).

QR Templates

GET/templates/

List your saved QR templates. Use a template's id as template_id when creating a link to apply its color, style, frame, and logo.

POST/templates/

Create a template. Accepts name, qr_color, qr_style, qr_frame, logo_placement, an optional image (multipart), and tags. A template's tags are inherited by any link created from it.

GET/templates/{id}/
PATCH/templates/{id}/
DELETE/templates/{id}/

Tags

Tag links to group and filter them. Tags are set via tags on link create/update, lowercased and de-duped server-side. Links created through this API are automatically tagged api, and links from a template inherit the template's tags.

GET/tags/

List every distinct tag across your links with a link count. Returns { "tags": [ { "tag": "marketing", "count": 4 }, … ] } (empty on plans without tagging).

# create a tagged link
curl -X POST https://qrsa.net/app/api/v1/links/ \
  -H "X-API-Key: YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"original_url":"https://example.com","tags":["marketing","q2"]}'

# list links in a tag group
curl -H "X-API-Key: YOUR_API_KEY" "https://qrsa.net/app/api/v1/links/?tag=marketing"

Bio pages

Build shareable link-in-bio pages at qrsa.net/@handle. Bio pages use the shared link-slot balance and remain subject to the package's Bio-page limit. The Free package does not include Bio pages.

GET/bio-pages/

List your pages. Each includes public_url, page_qr_url, and avatar_url.

POST/bio-pages/

Create a page. Body:

FieldNotes
handleUnique @handle (a–z, 0–9, _ , -). Auto-suggested from the title if omitted.
page_typebusiness or social
design_idDesign key, e.g. biz-minimal
title, bioDisplay name + tagline
email, phone, whatsappContact details (business)
socialsArray: [{"platform":"instagram","url":"…","label":"…"}]
qr_templateQR template id to style the page QR
contact_qr_kindnone · phone · whatsapp
links_layoutlist or grid
is_activePublish/unpublish
GET/bio-pages/handle-available/?handle=

Check if an @handle is free before creating.

GET/bio-pages/{id}/
PATCH/bio-pages/{id}/
DELETE/bio-pages/{id}/
POST/bio-pages/{id}/avatar/

Upload the page avatar (multipart/form-data, field avatar).

Account & stats

GET/stats/

Account-wide totals (links, clicks, plan, usage).

GET/account/

Your profile, plan, limits, and entitlements.

PATCH/account/

Update profile fields: name, company_name, phone.

POST/account/password/

Change password. Body: { "current_password": "…", "new_password": "…" }.

POST/account/regenerate-key/

Rotate your API key (no body). The old key stops working immediately.

Link packages & purchases

GET/billing/

Current package benefits, shared slot balance, usage, owned packages, and available packages.

GET/billing/quote/?plan=&quantity=

Get a signed annual-plan quote. Quantity is 1–5 years (upgrades use the remaining term only). Renewals and lower plans are paid now and start at the current expiry. Set keep_addons=false to omit add-on renewal. For extra links use ?kind=addon&slots=10 (10, 50 or 100). Add-ons are prorated to the current expiry and do not change plan features.

POST/billing/subscribe/

Body: { "quote_token": "TOKEN_FROM_QUOTE", "selection": { "links": [], "bios": [] } }. Quotes expire after 15 minutes. When requires_selection is true, submit the owned IDs to retain from selection_options. Unselected links are paused at activation, never deleted. The response returns requires_payment and a hosted-checkout redirect_url. Prices are calculated by the server.

GET/billing/invoices/
GET/billing/invoices/{id}/pdf/

List invoices, or download one as a PDF.

Pricing public

GET/pricing/

Public plan catalog (no API key) — the same source the pricing page uses.

← Back to dashboard