API
Create an API key in your dashboard and send it as Authorization: Bearer gogl_.... All bodies are JSON.
Create a link
POST /api/v1/links
{"url": "https://example.com/page", "slug": "optional-back-half", "title": "optional",
"tags": ["optional"], "password": "optional", "expiresAt": "2026-12-31T00:00:00Z",
"expiredUrl": "https://example.com/ended", "iosUrl": "https://apps.apple.com/...", "androidUrl": "https://play.google.com/..."}
Returns 201 with the link, including shortUrl.
List, read, update, delete
GET /api/v1/links?q=search&limit=50&before=ID
GET /api/v1/links/ID
PATCH /api/v1/links/ID {"url": "...", "slug": "...", "title": "...", "tags": [...]}
DELETE /api/v1/links/ID
Analytics
GET /api/v1/links/ID/stats?days=30
Returns totals, clicks per day, countries, devices, operating systems, browsers, referrers and QR scans.
Bulk import
POST /api/v1/links/bulk
{"csv": "url,slug,title,tags
https://example.com,promo,Promo,spring|email"}Up to 1,000 rows. Columns: url (required), slug, title, tags (separated by |).
Check a destination
GET /api/v1/check?url=https://example.com
Limits
300 requests per minute per network and 60 new links per minute per account. Responses use standard HTTP status codes and a JSON error message.