API reference
POSTCreate a connect link
POST /v1/partner/connect_links: A single-use link (7 days at most) a contractor's owner opens to approve your access.
POST
https://api.light-ai.app/v1/partner/connect_linksA single-use link (7 days at most) a contractor's owner opens to approve your access. The owner signs in (or signs up), sees your verified legal name, domain and every scope, and approves. Never email API keys: send connect links. The url is returned only here (and on an Idempotency-Key replay).
| Credential | Partner API key (a key of a partner account). |
|---|---|
| Test mode | Live keys only (answers 400 test_mode_unsupported to a test key). |
| Idempotency | Idempotency-Key supported. See Idempotency. |
Headers#
Pin a dated API version (defaults to the key's version). One of:
2026-11-01.Retry-safe writes: the same key and body replay the first response for 24 hours (
Idempotent-Replayed: true). 8–128 characters.Request body#
One of:
leads:read, leads:write, clients:read, clients:write, projects:read, projects:write, quotes:read, quotes:write, quotes:share_link, quotes:asset_links, webhooks:manage, events:read, mockups:read, mockups:write, forms:read, forms:write. 1–16 items.Bind the link to one organization (when you already know its id). Id prefix
org_.Required for unbound links: who you are connecting (shown to you on confirmation). 1–120 characters.
1–255 characters.
https URL on your verified domain to return to after consent. Light AI appends
connect_link (cl_…), grant (grant_…), organization (org_…) and grant_status (active, or pending when an unbound link still needs POST /v1/partner/grants/{grant_id}/confirm); your own query parameters are kept, so one redirect_uri can serve every contractor. At most 2048 characters.Default 168 (7 days). 1–168.
Response 201#
The link (with its url).
Id prefix
cl_.Always
connect_link.One of:
leads:read, leads:write, clients:read, clients:write, projects:read, projects:write, quotes:read, quotes:write, quotes:share_link, quotes:asset_links, webhooks:manage, events:read, mockups:read, mockups:write, forms:read, forms:write.Id prefix
org_.One of:
open, consumed, expired, revoked.Id prefix
grant_.RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
The link to send to the contractor. Returned only when created.
Errors#
| Status | Meaning |
|---|---|
400 | Bad request. bad_request, test_mode_mismatch, test_mode_unsupported, unsupported_api_version |
401 | Missing or invalid credential. authentication_required, invalid_api_key, api_key_revoked, api_key_expired, api_key_suspended |
403 | Not allowed. insufficient_scope, plan_upgrade_required, organization_paused, organization_off_season, api_disabled, api_access_not_enabled, ip_not_allowed, forbidden |
404 | Not found (also for objects of other organizations and for organizations without an active grant). |
409 | Conflict. stale_state, conflict, idempotency_in_progress, idempotency_scope_mismatch, quote_already_decided, quote_not_current, billing_review_required |
413 | Request bodies are limited to 256 KB. |
415 | The body is not JSON: send Content-Type: application/json. unsupported_media_type |
422 | Validation failed. idempotency_key_reused |
429 | Rate limited or daily cap reached. See Retry-After and the RateLimit headers. rate_limited, daily_cap_reached |
500 | Unexpected server error. Safe to retry with exponential backoff; quote the Request-Id to support. internal_error |
503 | Temporarily unavailable. Retry with exponential backoff. service_unavailable |