Skip to main content

Developer docs

Omni Links REST API

Create scoped API keys in the product dashboard, then call the REST API with a Bearer token. API keys are workspace-scoped and can be revoked at any time. Link mutations enforce the workspace UTM policy.

Authentication

curl https://your-domain.com/api/v1/links \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY"

Create a link

curl https://your-domain.com/api/v1/links \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "destinationUrl": "https://example.com/landing",
    "slug": "launch",
    "title": "Launch campaign",
    "password": "at-least-8-characters",
    "tags": ["launch", "paid"],
    "utmParameters": {
      "utm_source": "newsletter",
      "utm_medium": "email"
    }
  }'

Passwords are write-only and must be 8–128 characters. Link responses expose only passwordProtected; password hashes are never returned or included in workspace exports. If you provide a slug, it must contain at least two URL-safe characters. Omit the field to generate one automatically.

Bulk create links

curl https://your-domain.com/api/v1/links/bulk \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "links": [
      {
        "destinationUrl": "https://example.com/launch",
        "slug": "launch",
        "title": "Launch campaign"
      }
    ]
  }'

Create a webhook

curl https://your-domain.com/api/v1/webhook-endpoints \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/webhooks/omni-links",
    "events": ["link.created", "link.clicked"]
  }'

Export analytics

curl "https://your-domain.com/api/v1/exports/analytics?format=csv&days=30" \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY"

Create a scheduled report

curl https://your-domain.com/api/v1/reports/analytics \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Weekly growth report",
    "frequency": "weekly",
    "format": "csv",
    "rangeDays": 30,
    "recipients": ["growth@example.com"],
    "webhookUrl": "https://example.com/omni-reports"
  }'

Create a route rule

curl https://your-domain.com/api/v1/links/link_uuid/route-rules \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "country",
    "operator": "equals",
    "matchValue": "DE",
    "destinationUrl": "https://example.com/de",
    "priority": 10
  }'

Create a QR code

curl https://your-domain.com/api/v1/qr-codes \
  -H "Authorization: Bearer $OMNI_LINKS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "linkId": "link_uuid",
    "name": "Launch poster",
    "customization": {
      "foregroundColor": "#111827",
      "backgroundColor": "#ffffff",
      "errorCorrectionLevel": "H",
      "margin": 3,
      "patternStyle": "rounded"
    }
  }'

Endpoints

GET
/api/v1/links

List links in the API key workspace.

links:read
POST
/api/v1/links

Create a short link.

links:write
GET
/api/v1/links/{id}

Fetch one link.

links:read
PATCH
/api/v1/links/{id}

Update destination, slug, status, UTMs, metadata, or domain.

links:write
DELETE
/api/v1/links/{id}

Delete a link.

links:write
POST
/api/v1/links/bulk

Create up to 100 links with per-row success and error details.

links:write
PATCH
/api/v1/links/bulk

Bulk update status, campaign, or tags for up to 100 links.

links:write
DELETE
/api/v1/links/bulk

Bulk delete up to 100 links.

links:write
GET
/api/v1/links/{id}/clicks

Export recent click events for a link.

analytics:read
GET
/api/v1/links/{id}/route-rules

List dynamic routing rules for a link.

route_rules:read
POST
/api/v1/links/{id}/route-rules

Create a device, geo, referrer, language, OS, or split rule.

route_rules:write
GET
/api/v1/links/{id}/route-rules/{ruleId}

Fetch one route rule.

route_rules:read
PATCH
/api/v1/links/{id}/route-rules/{ruleId}

Update a route rule.

route_rules:write
DELETE
/api/v1/links/{id}/route-rules/{ruleId}

Delete a route rule.

route_rules:write
GET
/api/v1/domains

List branded domains.

domains:read
POST
/api/v1/domains

Register a branded domain.

domains:write
GET
/api/v1/domains/{id}

Fetch one branded domain.

domains:read
PATCH
/api/v1/domains/{id}

Set default, enable, or disable a domain.

domains:write
DELETE
/api/v1/domains/{id}

Delete a domain.

domains:write
POST
/api/v1/domains/{id}/verify

Check the required TXT verification record.

domains:write
GET
/api/v1/bio-pages

List bio pages.

bio_pages:read
POST
/api/v1/bio-pages

Create a bio page.

bio_pages:write
GET
/api/v1/bio-pages/{id}

Fetch one bio page.

bio_pages:read
PATCH
/api/v1/bio-pages/{id}

Update page metadata, theme, domain, or publish state.

bio_pages:write
DELETE
/api/v1/bio-pages/{id}

Delete a bio page.

bio_pages:write
GET
/api/v1/bio-pages/{id}/items

List bio page items.

bio_pages:read
POST
/api/v1/bio-pages/{id}/items

Create a bio page item.

bio_pages:write
PATCH
/api/v1/bio-pages/{id}/items/{itemId}

Update item content, type, position, or visibility.

bio_pages:write
DELETE
/api/v1/bio-pages/{id}/items/{itemId}

Delete a bio page item.

bio_pages:write
GET
/api/v1/utm-templates

List UTM templates.

utm_templates:read
POST
/api/v1/utm-templates

Create a UTM template with workspace policy validation.

utm_templates:write
GET
/api/v1/utm-templates/{id}

Fetch one UTM template.

utm_templates:read
PATCH
/api/v1/utm-templates/{id}

Update a UTM template.

utm_templates:write
DELETE
/api/v1/utm-templates/{id}

Delete a UTM template.

utm_templates:write
GET
/api/v1/webhook-endpoints

List webhook endpoints.

webhooks:read
POST
/api/v1/webhook-endpoints

Create a webhook endpoint and return its signing secret once.

webhooks:write
GET
/api/v1/webhook-endpoints/{id}

Fetch one webhook endpoint.

webhooks:read
PATCH
/api/v1/webhook-endpoints/{id}

Update webhook URL, events, or active state.

webhooks:write
DELETE
/api/v1/webhook-endpoints/{id}

Delete a webhook endpoint.

webhooks:write
GET
/api/v1/webhook-deliveries

List webhook delivery attempts.

webhooks:read
POST
/api/v1/webhook-deliveries/{id}/retry

Retry a failed or pending webhook delivery.

webhooks:write
GET
/api/v1/analytics

Fetch workspace-level analytics groupings.

analytics:read
GET
/api/v1/reports/analytics

List scheduled analytics reports.

reports:read
POST
/api/v1/reports/analytics

Create a scheduled analytics report.

reports:write
GET
/api/v1/reports/analytics/{id}

Fetch one scheduled analytics report.

reports:read
PATCH
/api/v1/reports/analytics/{id}

Update a scheduled analytics report.

reports:write
DELETE
/api/v1/reports/analytics/{id}

Delete a scheduled analytics report.

reports:write
GET
/api/v1/reports/analytics/{id}/runs

List generated report runs.

reports:read
POST
/api/v1/reports/analytics/{id}/runs

Generate a scheduled analytics report immediately.

reports:write
GET
/api/v1/exports/analytics

Export enriched click analytics as JSON or CSV.

exports:read
GET
/api/v1/exports/workspace

Download a redacted full workspace JSON export.

exports:read
POST
/api/v1/qr-codes

Create a QR code for an existing link.

qr_codes:write

Webhooks

Create webhook endpoints in the Developers dashboard. Omni Links queues deliveries for link lifecycle events, link clicks, QR scans, and bio page item clicks.

Signature header

omni-signature: t=...,v1=...

Signing base

HMAC_SHA256(secret, timestamp + "." + rawBody)
link.createdlink.updatedlink.deletedlink.clickedqr.scannedbio_page.clicked