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.