Reference
Every endpoint, plus the conventions they share: pagination and safe retries.
https://api.atlasinfra.cloudAuthorization: Bearer <key>. See API keys./openapi.json. Import it into Postman or a client generator./v1/runtime/activateActivate a device./v1/runtime/validateCheck a license, optionally for a device./v1/runtime/deactivateRelease a device./v1/runtime/leaseGet an offline lease for an activated device./v1/runtime/keyThe public key for verifying responses.// 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.
/v1/licensesList. Filter by status, product_id, customer_id, environment./v1/licensesIssue a license. The full key is returned only here./v1/licenses/:idRetrieve a license./v1/licenses/:idEdit entitlements, metadata, or activation_limit./v1/licenses/:id/suspendSuspend./v1/licenses/:id/reinstateReinstate a suspended license./v1/licenses/:id/renewSet a new expires_at./v1/licenses/:id/revokeRevoke permanently. Requires a reason./v1/licenses/:id/activationsList the license's devices./v1/licenses/:id/activations/:activationIdDeactivate a device./v1/licenses/:id/eventsThe license's history./v1/activationsList devices across all 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.
/v1/productsList products. Add include_archived=true for archived ones./v1/productsCreate a product./v1/products/:idRetrieve a product./v1/products/:idRename or archive a product./v1/policiesList policies. Filter by product_id./v1/policiesCreate a policy./v1/policies/:idRetrieve a policy./v1/policies/:idEdit or archive a policy./v1/webhooksList endpoints./v1/webhooksCreate an endpoint. The secret is returned only here./v1/webhooks/:idChange the URL, events, or status./v1/webhooks/:idDelete an endpoint./v1/webhooks/:id/rotateReplace the signing secret./v1/webhooks/:id/deliveriesList delivery attempts./v1/webhooks/:id/deliveries/:deliveryId/replayResend a delivery./v1/integrationsList storefront integrations./v1/integrationsCreate an integration./v1/integrations/:idChange mappings, name, or status./v1/integrations/:idDelete an integration.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.
{ "data": [ ... ], "has_more": true, "next_cursor": "MjAyNi0xMC0y..." }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.
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.