Skip to content
Power301/API
Sign inGet API key
Links · links.store
POST/linkslinks.store

Store

POST /links is part of the Links group. Its parameters and response shape below are generated from the live OpenAPI document. The payload comes back inside a data array.

Base URL
https://api.power301.com/v1
Auth
Bearer token
Idempotent
No
Returns
application/json

The request

Send a JSON body to POST /links. Required fields: handler, host.

# Store
curl -X POST "https://api.power301.com/v1/links" \
  -H "Authorization: Bearer $POWER301_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "handler": "short-url",
    "host": "go.acme.com",
    "title": "Spring Sale 2026",
    "type": "link",
    "description": "Landing page for the spring campaign"
  }'

Body parameters

FieldDescription
handlerRequiredstringWhat a record was created as. The value is stored in record.handler. Only two runtime behaviours sit behind the four values: short links (short-url, qr) resolve on a short link hostname, redirects (redirect, migration) resolve on the redirected hostname. The edge only ever sees that split, see ClusterSyncCore. short-urlqrredirectmigration
hostRequiredstring · max 100
titleoptionalstring · max 250
typeoptionalstring
descriptionoptionalstring · max 300
forward_pathoptionalboolean | null
forward_queryoptionalboolean | null
utmoptionalarray<string>
destinationoptionalstring | null
destinationsoptionalarray<string> | null
pluginsoptionalarray<string> | null
is_notifyoptionalboolean
is_switch_unbroken_destinationoptionalboolean
expiresoptionalstring
passwordoptionalstring | null · max 128 · min 4Visitors enter it before the edge redirects them; null removes it. Write-only.
destination_routingoptionalstring
statusoptionalinteger
tagsoptionalarray<string>
qroptionalobject
aliasoptionalstring · max 30
urloptionalstring

The response

A 200 carries the payload inside a data array — the same shape the list endpoints return, so one parser handles both.

{
  "data": [
    {
      "id": "9f2a7c31-4b8e-4a02-9d1f-0c6b7e5a1d44",
      "handler": "string",
      "host": "go.acme.com",
      "alias": "spring-sale",
      "url": "https://go.acme.com/spring-sale",
      "https": true,
      "file": null,
      "destination": "https://acme.com/campaigns/spring",
      "destinations": [
        "https://acme.com/campaigns/spring"
      ],
      "destination_routing": "weighted",
      "plugins": [
        "analytics"
      ],
      "has_password": true,
      "total_clicks": 1,
      "type": "link",
      "title": "Spring Sale 2026",
      "description": "Landing page for the spring campaign",
      "status": "301",
      "paused_by": "user",
      "forward_path": true,
      "forward_query": true,
      "utm": {
        "source": "string",
        "medium": "string",
        "campaign": "string",
        "term": "string",
        "content": "string"
      },
      "qr": {
        "theme": "string",
        "color": "string",
        "logo": true,
        "show_url": true,
        "margin": "string"
      },
      "monitor": "false",
      "is_notify": false,
      "is_switch_unbroken_destination": false,
      "tags": [
        "campaign",
        "q2"
      ],
      "created_by": "user@acme.com",
      "creator": {
        "id": "9f2a7c31-4b8e-4a02-9d1f-0c6b7e5a1d44",
        "name": "Acme"
      },
      "created_via": "api",
      "created_at": "2026-08-01T09:14:22Z",
      "updated_at": "2026-08-01T09:14:22Z",
      "expired_at": null
    }
  ]
}

Status codes

200
SuccessThe records created by this request. The payload is always a collection, even for a single record.
401
UnauthenticatedUnauthenticated
422
Validation failedA field was rejected. errors lists every field with its reason.
429
Too many requestsToo many requests
482
Bad requestThe action would exceed a plan limit of the current workspace.
484
Bad requestThe workspace role of the authenticated user is too low for this action.