Documentation menu

Reference

API reference

Every endpoint, plus the conventions they share: pagination and safe retries.

Basics

  • Base URL: https://api.atlasinfra.cloud
  • Requests and responses are JSON. Timestamps are ISO 8601 in UTC.
  • Authenticate with Authorization: Bearer <key>. See API keys.
  • The full OpenAPI spec is at /openapi.json. Import it into Postman or a client generator.

Runtime (publishable key)

POST
/v1/runtime/activateActivate a device.
POST
/v1/runtime/validateCheck a license, optionally for a device.
POST
/v1/runtime/deactivateRelease a device.
POST
/v1/runtime/leaseGet an offline lease for an activated device.
GET
/v1/runtime/keyThe public key for verifying responses.
POST /v1/runtime/validate
// Request
{
  "license_key": "ATLAS-7Q4M-...",
  "product_id": "prod_...",
  "device": { "id": "install_9f2c" },   // optional
  "nonce": "b1f0c7d2e9a4"              // optional, echoed back
}

// Response
{
  "kid": "sig_2026_01",
  "signature": "base64...",
  "data": {
    "valid": true,
    "code": "valid",
    "in_grace": false,
    "issued_at": "2026-10-24T09:00:00.000Z",
    "expires_at": "2026-10-24T09:05:00.000Z",
    "nonce": "b1f0c7d2e9a4",
    "license": {
      "id": "lic_...",
      "status": "active",
      "license_type": "timed",
      "expires_at": "2027-10-24T00:00:00.000Z",
      "entitlements": { "plan": "pro" },
      "activation_limit": 3,
      "active_activation_count": 1
    },
    "activation": { "id": "act_...", "device_id": "install_9f2c", "status": "active" }
  }
}

Activate takes the same body with device required. Deactivate takes license_key, product_id, and device_id. Lease takes the activate body plus an optional ttl_seconds.

Licenses (secret key)

GET
/v1/licensesList. Filter by status, product_id, customer_id, environment.
POST
/v1/licensesIssue a license. The full key is returned only here.
GET
/v1/licenses/:idRetrieve a license.
PATCH
/v1/licenses/:idEdit entitlements, metadata, or activation_limit.
POST
/v1/licenses/:id/suspendSuspend.
POST
/v1/licenses/:id/reinstateReinstate a suspended license.
POST
/v1/licenses/:id/renewSet a new expires_at.
POST
/v1/licenses/:id/revokeRevoke permanently. Requires a reason.
GET
/v1/licenses/:id/activationsList the license's devices.
DELETE
/v1/licenses/:id/activations/:activationIdDeactivate a device.
GET
/v1/licenses/:id/eventsThe license's history.
GET
/v1/activationsList devices across all licenses.
POST /v1/licenses
{
  "product_id": "prod_...",
  "policy_id": "pol_...",                 // optional: copy its terms
  "customer": { "external_id": "cus_123", "email": "jo@example.com" },
  "expires_at": "2027-10-24T00:00:00Z",   // optional: override the policy
  "activation_limit": 3,                  // optional
  "entitlements": { "plan": "pro" },      // optional
  "metadata": { "order_id": "1042" }      // optional, for your own use
}

Revoke reasons: chargeback, fraud, abuse, customer_request, non_payment, security, and other, with an optional note.

Products and policies (secret key)

GET
/v1/productsList products. Add include_archived=true for archived ones.
POST
/v1/productsCreate a product.
GET
/v1/products/:idRetrieve a product.
PATCH
/v1/products/:idRename or archive a product.
GET
/v1/policiesList policies. Filter by product_id.
POST
/v1/policiesCreate a policy.
GET
/v1/policies/:idRetrieve a policy.
PATCH
/v1/policies/:idEdit or archive a policy.

Webhooks and integrations (secret key)

GET
/v1/webhooksList endpoints.
POST
/v1/webhooksCreate an endpoint. The secret is returned only here.
PATCH
/v1/webhooks/:idChange the URL, events, or status.
DELETE
/v1/webhooks/:idDelete an endpoint.
POST
/v1/webhooks/:id/rotateReplace the signing secret.
GET
/v1/webhooks/:id/deliveriesList delivery attempts.
POST
/v1/webhooks/:id/deliveries/:deliveryId/replayResend a delivery.
GET
/v1/integrationsList storefront integrations.
POST
/v1/integrationsCreate an integration.
PATCH
/v1/integrations/:idChange mappings, name, or status.
DELETE
/v1/integrations/:idDelete an integration.

Pagination

List endpoints return up to limit items (default 25, max 100). When has_more is true, pass next_cursor as starting_after to get the next page.

json
{ "data": [ ... ], "has_more": true, "next_cursor": "MjAyNi0xMC0y..." }

Safe retries

Send an Idempotency-Key header (8–128 characters) on create and update requests. If the same request arrives again with the same key within 24 hours, you get the original response back instead of a duplicate. The SDK does this automatically.

A repeated license creation returns the same license with key: null, because the full key is only ever returned once.

Rate limits

Each IP address can make 600 requests per minute. Above that you'll get 429 rate_limited; wait for the number of seconds in the Retry-After header and try again.