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
| Field | Description |
|---|---|
| handlerRequiredstring | What 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 4 | Visitors 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.
