Developers

REST API

Create and manage short links, QR codes and statistics from your own apps. All requests and responses use JSON.

Base URL: http://127.0.0.1:8770/api/v1

Authentication

Find your API key under Integrations in your dashboard and send it as a Bearer token.

curl http://127.0.0.1:8770/api/v1/account \
  -H "Authorization: Bearer YOUR_API_KEY"

Create a link

POST /links

curl -X POST http://127.0.0.1:8770/api/v1/links \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/spring-sale",
    "alias": "spring",
    "title": "Spring sale",
    "tags": ["sale", "spring"],
    "utm": {"source": "newsletter", "medium": "email"},
    "geo": [{"country": "GB", "url": "https://uk.example.com/spring"}],
    "expires_at": "2026-12-31 23:59"
  }'

Only url is required. Other fields: domain_id, alias, title, description, campaign_id, type (direct, frame, splash, overlay), splash_id, overlay_id, password, expires_at, click_limit, expired_url, geo, devices, languages, rotator, utm, params, deep_links, pixel_ids, tags, notes, public_stats.

{
  "error": false,
  "data": {
    "id": 42,
    "short_url": "https://go.designversa.com/spring",
    "alias": "spring",
    "url": "https://example.com/spring-sale",
    "clicks": 0,
    "unique_clicks": 0,
    ...
  }
}

List links

GET /links?page=1&per_page=25&q=spring&sort=clicks

Get a link

GET /links/{id}

Update a link

PUT /links/{id} with any of the fields you can send when creating a link.

Delete a link

DELETE /links/{id}

Link statistics

GET /links/{id}/stats?range=30d Ranges: today, 7d, 30d, 90d, 12m.

{
  "error": false,
  "data": {
    "total": 1840, "uniques": 1312,
    "series": {"labels": ["Oct 1", ...], "clicks": [52, ...], "uniques": [40, ...]},
    "countries": [{"value": "US", "count": 610, "percent": 33.2}, ...],
    "referrers": [...], "devices": [...], "browsers": [...], "os": [...]
  }
}

QR codes

GET /qr, POST /qr, DELETE /qr/{id}

curl -X POST http://127.0.0.1:8770/api/v1/qr \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "Menu", "type": "url", "url": "https://example.com/menu",
       "style": {"fg": "#0b1020", "eye": "#4f46e5", "module": "dots"}}'

The response includes svg_url and png_url download links.

Account & more

GET /account, GET /domains, GET /campaigns, GET /bio

Errors & limits

Errors return "error": true with a message and an HTTP status: 401 invalid key, 403 not allowed by your plan, 404 not found, 422 validation error, 429 rate limit. Each key can make 60 requests per minute.

Webhooks

Add a webhook URL under Integrations to receive link.created, link.clicked, qr.scanned and bio.viewed events. Every request carries an X-Versa-Signature header: the HMAC-SHA256 of the raw body with your webhook secret. Zapier users can paste a Catch Hook URL here.

Live preview: buttons and forms are switched off Get Versa Link →