API docs

Create, update and delete short links and read their click stats from your own code. Every request goes to:

https://api.links.arusa.co.in/v1

The API is available on paid plans. Each plan allows a number of requests per minute, shared by all keys in the workspace:

PlanAPI accessRequests / min
FreeNo—
ProYes60
BusinessYes600

Quickstart

  1. Create a key in Settings → API keys. Copy it now: it is shown only once.
  2. Store it in an environment variable called API_KEY. Every example on this page reads it from there.
  3. Check the key works:
curl -X GET 'https://api.links.arusa.co.in/v1/me' \
  -H "Authorization: Bearer $API_KEY"

Then create your first short link:

curl -X POST 'https://api.links.arusa.co.in/v1/links' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "url": "https://example.com/blog/launch?utm_source=newsletter",
  "alias": "launch",
  "title": "Launch post",
  "tags": [
    "newsletter"
  ]
}'

Authentication

Send your key in the Authorization header on every request:

Authorization: Bearer sk_live_…

A key belongs to one workspace and acts as the member who created it. It can read and change every link in that workspace, so keep it on your server and never ship it to a browser or app. If a key leaks, revoke it in Settings → API keys and create a new one. A missing, wrong or revoked key gets a 401.

Rate limits

Limits are per workspace, per minute (see the table above). Every request with a valid key gets these headers back:

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59

Over the limit you get 429 with type rate_limited and a Retry-After header in seconds. Wait that long, then retry.

Errors

Errors use the application/problem+json format. Branch on type, not on the human-readable title or detail.

{
  "type": "validation_failed",
  "title": "Unprocessable Content",
  "status": 422,
  "detail": "The url field must be a valid URL.",
  "errors": { "url": ["The url field must be a valid URL."] }
}
StatusTypeMeaning
401unauthenticatedThe key is missing, wrong or revoked.
402limit_exceededYour plan’s monthly link limit is used up. Upgrade or wait for the next period.
403plan_feature_requiredThe request uses a feature your plan doesn’t include (the API itself, custom aliases, expiry).
403workspace_suspendedThe workspace is suspended. Contact support.
404not_foundNo such link in this workspace.
409idempotency_in_progressA request with this Idempotency-Key is still running. Retry shortly.
409qr_unavailableThis link was flagged or disabled for abuse, so it has no QR code.
422validation_failedThe input is invalid; see errors for each field.
422idempotency_key_reusedThis Idempotency-Key was already used with a different body.
429rate_limitedToo many requests this minute. Wait for Retry-After seconds.
405http_errorAny other HTTP error, such as a wrong method. Check status.
500server_errorSomething broke on our side. Safe to retry with the same Idempotency-Key.

Pagination

GET /links returns one page, newest first, plus a next_cursor. Pass it back as ?cursor= to get the next page. When next_cursor is null, you have them all.

curl -X GET 'https://api.links.arusa.co.in/v1/links?cursor=eyJpZCI6MTIzNCwiX3BvaW50c1RvTmV4dEl0ZW1zIjp0cnVlfQ' \
  -H "Authorization: Bearer $API_KEY"

Idempotency

Networks fail. To retry POST /links safely, send an Idempotency-Key header (any unique string up to 255 characters, such as a UUID). If the same key comes back with the same body within 24 hours, you get the first response again, marked Idempotent-Replayed: true, and no second link is created. The same key with a different body gets 422 idempotency_key_reused.

curl -X POST 'https://api.links.arusa.co.in/v1/links' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 3f1c2a9e-7b6d-4c1e-9a8f-2d5e6b7c8d9e' \
  -d '{
  "url": "https://example.com/blog/launch?utm_source=newsletter",
  "alias": "launch",
  "title": "Launch post",
  "tags": [
    "newsletter"
  ]
}'

Endpoints

GET/me

The key's workspace, plan and current usage

Errors: 401, 403, 429

curl -X GET 'https://api.links.arusa.co.in/v1/me' \
  -H "Authorization: Bearer $API_KEY"

200 OK

{
  "data": {
    "workspace": {
      "id": 42,
      "name": "Acme"
    },
    "plan": "Pro",
    "links": {
      "used": 120,
      "limit": 2000
    },
    "clicks": {
      "tracked": 5310,
      "untracked": 0,
      "limit": 100000
    },
    "seats": {
      "used": 3,
      "limit": 5
    }
  }
}

POST/links

Create a link

Parameters

Idempotency-Keyheader · string
Repeating a key with the same body within 24 hours replays the first response (with an Idempotent-Replayed: true header) instead of creating another link.

Body (JSON)

urlstring (uri)Required
aliasstring | null
Paid plans only
titlestring | null
tagsstring[] | null
expires_atstring | null (date-time)
Paid plans only

Errors: 401, 402, 403, 409, 422, 429

curl -X POST 'https://api.links.arusa.co.in/v1/links' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
  "url": "https://example.com/blog/launch?utm_source=newsletter",
  "alias": "launch",
  "title": "Launch post",
  "tags": [
    "newsletter"
  ]
}'

201 Created

{
  "data": {
    "id": 1234,
    "code": "launch",
    "short_url": "https://go.example.com/launch",
    "target_url": "https://example.com/blog/launch?utm_source=newsletter",
    "title": "Launch post",
    "is_custom": true,
    "expires_at": null,
    "tags": [
      "newsletter"
    ],
    "clicks_count": 87,
    "created_at": "2026-11-03T10:15:00+00:00"
  }
}