Public API Integration

Use LimeLink's public server-to-server API to automate Projects, Applications, Custom Domains, and Links with an Organization API credential.

Swagger/OpenAPI is the authority for exact parameters, request and response schemas, examples, and operation-specific errors. This guide explains authentication, scopes, ownership, and safe integration workflows.

Authentication

Create a credential from the Organization workspace under API credentials, select only the scopes your integration needs, and copy the secret from its one-time reveal. Store it in a server-side secret manager or environment variable.

export LIMELINK_API_KEY='replace-with-the-one-time-secret'

Send it with every request:

X-API-KEY: your_api_key

Never put the credential in browser JavaScript, a mobile app, source control, logs, screenshots, or public AI prompts. Native and cross-platform SDKs use a public Project UUID instead; they do not use this Organization secret.

Scopes

Read and Write scopes are independent. Write access does not imply Read access.

ResourceReadWrite
Projectsprojects:readprojects:write
Applicationsapplications:readapplications:write
Custom Domainsdomains:readdomains:write
Linkslinks:readlinks:write

A missing required scope returns 403. Credentials are Organization-scoped: referenced Projects and their Applications, Custom Domains, and Links must belong to that Organization. Missing and outside-Organization resources return a non-disclosing 404.

Public operation inventory

The filtered public OpenAPI contract contains these 28 API-key operations. Bearer-only console, authentication, billing, attachment, webhook, Stats, Deferred, Device, and Universal Link routes are not part of this contract.

API Credentials

MethodPathScope
GET/api/v2/api-credentials/currentNone; valid API key required
MethodPathScope
POST/api/v2/core/linklinks:write
GET/api/v2/core/link/availabilitylinks:read

Projects

MethodPathScope
POST/api/v2/organizations/{organization_id}/projectsprojects:write
GET/api/v2/organizations/{organization_id}/projectsprojects:read
GET/api/v2/organizations/{organization_id}/projects/name-availabilityprojects:read
GET/api/v2/organizations/{organization_id}/projects/{project_id}projects:read
PATCH/api/v2/organizations/{organization_id}/projects/{project_id}projects:write
DELETE/api/v2/organizations/{organization_id}/projects/{project_id}projects:write

Applications

MethodPathScope
POST/api/v2/organizations/{organization_id}/projects/{project_id}/applicationsapplications:write
GET/api/v2/organizations/{organization_id}/projects/{project_id}/applicationsapplications:read
GET/api/v2/applications/{application_id}applications:read
PATCH/api/v2/applications/{application_id}applications:write
DELETE/api/v2/applications/{application_id}applications:write

Custom Domains

MethodPathScope
POST/api/v2/organizations/{organization_id}/projects/{project_id}/custom-domainsdomains:write
GET/api/v2/organizations/{organization_id}/projects/{project_id}/custom-domainsdomains:read
GET/api/v2/custom-domains/{custom_domain_id}domains:read
POST/api/v2/custom-domains/{custom_domain_id}/retrydomains:write
DELETE/api/v2/custom-domains/{custom_domain_id}domains:write
MethodPathScope
POST/api/v2/organizations/{organization_id}/projects/{project_id}/linkslinks:write
GET/api/v2/organizations/{organization_id}/projects/{project_id}/linkslinks:read
POST/api/v2/custom-domains/{custom_domain_id}/linkslinks:write
GET/api/v2/custom-domains/{custom_domain_id}/linkslinks:read
POST/api/v2/linkslinks:write
GET/api/v2/links/resolve?url={canonical_url}links:read
GET/api/v2/links/{link_id}links:read
PATCH/api/v2/links/{link_id}links:write
DELETE/api/v2/links/{link_id}links:write

First request

Use an Organization ID available to the credential and consult Swagger for the current parameters and response:

curl 'https://api.limelink.org/api/v2/organizations/22222222-2222-4222-8222-222222222222/projects' \
  --header "X-API-KEY: $LIMELINK_API_KEY"

A common automation flow is:

  1. List or create a Project.
  2. Create the iOS or Android Application records required by Link routing.
  3. Optionally create a Custom Domain and wait for its lifecycle to become active.
  4. Create a default-domain or Custom Domain Link.
  5. Use list and get operations to reconcile local state.

Lists that expose next_cursor use opaque cursor pagination; pass the returned cursor unchanged. Resolve an existing Link from its full canonical short URL with GET /api/v2/links/resolve; send the required url query value unchanged rather than parsing a suffix locally. Link readiness is represented by nullable short_url: non-null is ready, while null is not ready yet.

Core Link creation can infer compatible active platform Applications. Do not invent platform identifiers; follow the current Swagger request contract. The availability result is advisory and does not reserve a suffix—creation remains authoritative.

Custom Domain and error handling

New Custom Domains and Custom Domain Links require the owning Project's active Pro entitlement and valid domain lifecycle state. Default-domain Links remain available on Free. Provisioning and retry are asynchronous workflows; read the returned lifecycle fields rather than assuming immediate activation.

Handle failures by status and the current Swagger error schema:

Use timeouts and bounded retries, validate user-controlled input, and avoid logging secrets or sensitive payloads. Swagger is reference-only: it does not persist authorization and interactive request submission is disabled.