API reference
Everything below is JSON over HTTPS. Base URL: https://nexishare.com/api/v1
Authentication
Create a key under API keys in your dashboard and send it as a bearer token. Keys start with ob_. Revoking a key cuts it off at once.
curl https://nexishare.com/api/v1/links \ -H "Authorization: Bearer ob_your_key"
Errors and limits
Failures return a non-2xx status and a body shaped like this:
{ "error": { "message": "Validation failed.", "fields": { "slug": "That short name is already taken." } } }Each key gets a fixed number of requests per minute (the server owner sets it; the default is 60). Past that you get 429 with a Retry-After header.
GET/links
Your links, newest first. Query: q (search), page, limit (max 100).
curl "https://nexishare.com/api/v1/links?q=launch&limit=10" -H "Authorization: Bearer ob_your_key"
{
"data": [{
"id": 12,
"slug": "launch",
"short_url": "https://nexishare.com/launch",
"target_url": "https://example.com/launch-day",
"title": "Launch day",
"password_protected": false,
"enabled": true,
"starts_at": null,
"expires_at": null,
"created_at": "2026-03-02T09:14:00.000Z"
}],
"meta": { "total": 1, "page": 1, "limit": 10 }
}POST/links
Only target_url is required. Leave slug out to get a random one.
curl -X POST https://nexishare.com/api/v1/links \
-H "Authorization: Bearer ob_your_key" \
-H "Content-Type: application/json" \
-d '{
"target_url": "https://example.com/launch-day",
"slug": "launch",
"title": "Launch day",
"password": "optional",
"starts_at": "2026-03-01T00:00:00Z",
"expires_at": "2026-04-01T00:00:00Z"
}'Returns 201 with the link. A taken slug or a blocked destination returns 422.
GET/links/{id}
One link by numeric id.
PATCH/links/{id}
Send only the fields to change. Set password to an empty string to remove protection, or expires_at to null to clear the expiry. enabled: false pauses the link.
curl -X PATCH https://nexishare.com/api/v1/links/12 \
-H "Authorization: Bearer ob_your_key" \
-H "Content-Type: application/json" \
-d '{ "enabled": false }'DELETE/links/{id}
Deletes the link and its click history. Returns 204.
GET/links/{id}/stats
Totals, a daily series and breakdowns for one link. Query: days (1 to 365, default 30).
{
"data": {
"total": 214,
"unique": 171,
"series": [{ "day": "2026-03-02", "total": 9, "unique": 7 }],
"countries": [{ "label": "DE", "n": 80 }],
"devices": [{ "label": "Mobile", "n": 150 }],
"browsers": [{ "label": "Safari", "n": 90 }],
"referrers": [{ "label": "Direct", "n": 120 }],
"campaigns": [{ "label": "No campaign", "n": 214 }]
}
}GET/stats
The same shape, across everything you own. Query: days, and kind set to clicks (default) or views for bio page visits.
GET/page
Your bio page settings and its blocks. PATCH /page accepts the same profile fields as the editor: display_name, bio, theme, published.