Admin API
Shorty Link exposes its admin API from the same Worker under /api/admin/*.
Authentication works with:
- Better Auth session cookies
- Better Auth API keys in
x-api-keyorAuthorization
Passkey registration and sign-in stay under /api/auth/* because they rely on Better Auth’s WebAuthn flows.
Endpoints
Health check
GET /api/health(experimental)
Returns service status:
{ "ok": true, "service": "shorty-link" }
Bootstrap and onboarding
GET /api/admin/bootstrapPOST /api/admin/onboarding/bootstrapGET /api/admin/invites/:tokenPOST /api/admin/onboarding/invite
Dashboard and profile
GET /api/admin/dashboardGET /api/admin/profilePATCH /api/admin/profile
Links
GET /api/admin/linksPOST /api/admin/linksGET /api/admin/links/:idPATCH /api/admin/links/:idDELETE /api/admin/links/:idGET /api/admin/links/:id/statsGET /api/admin/suggest-slug?targetUrl=<url>(experimental)
The suggest-slug endpoint returns an AI-generated or fallback slug for a target URL. Requires Cloudflare AI binding for AI-backed suggestions.
Supported redirect status codes for link create, update, and filtering are 301, 302, 303, 307, and 308. If statusCode is omitted when creating a link, Shorty Link defaults it to 302.
Domains
GET /api/admin/domainsPOST /api/admin/domainsGET /api/admin/domains/:idPATCH /api/admin/domains/:idDELETE /api/admin/domains/:id
Users and invites
GET /api/admin/usersPATCH /api/admin/users/:idDELETE /api/admin/users/:idGET /api/admin/invitesPOST /api/admin/invitesDELETE /api/admin/inviteswith body{ "id": "invite-id" }
Sessions
GET /api/admin/sessionsPOST /api/admin/sessions/revokewith body{ "token": "..." }POST /api/admin/sessions/revoke-otherDELETE /api/admin/sessions/current
API keys
GET /api/admin/api-keysPOST /api/admin/api-keysPATCH /api/admin/api-keys/:idDELETE /api/admin/api-keys/:id
Examples
Create an API key:
curl -X POST http://localhost:3000/api/admin/api-keys \
-H 'content-type: application/json' \
-H 'x-api-key: sl_your_key_here' \
-d '{"name":"CI","expiresInDays":30}'
Revoke one session:
curl -X POST http://localhost:3000/api/admin/sessions/revoke \
-H 'content-type: application/json' \
-H 'x-api-key: sl_your_key_here' \
-d '{"token":"session-token"}'
List links:
curl 'http://localhost:3000/api/admin/links?page=1&pageSize=25&active=all' \
-H 'x-api-key: sl_your_key_here'
Create a link with an explicit redirect status code:
curl -X POST http://localhost:3000/api/admin/links \
-H 'content-type: application/json' \
-H 'x-api-key: sl_your_key_here' \
-d '{"slug":"pricing","targetUrl":"https://example.com/pricing","statusCode":308}'