{
  "version": "2026.07.21",
  "gateway_base_url": "https://cloud.projexlight.com",
  "auth": {
    "model": "Four principals, each with its own credential: PLATFORM OPERATOR (ADMIN_OPS_TOKEN, /admin/* only, rejects tenant JWTs); TENANT ADMIN (human, password -> JWT); TENANT APPLICATION (machine, pk_live_/pk_test_ API key); APP END USER (human, password -> JWT scoped to an app_id). The gateway is DEFAULT-DENY: every path needs a valid tenant JWT unless explicitly public.",
    "critical": [
      "The API key and the JWT use the SAME header: 'Authorization: Bearer <value>'. The gateway distinguishes them by the pk_live_/pk_test_ prefix. There is NO X-API-Key header.",
      "POST /api/auth/signup-tenant provisions an ENTIRE TENANT (org + app + tenant + membership). NEVER call it to register an end user of an app — use /api/auth/register.",
      "Credential-management routes (/api/applications, /api/api-keys) require a HUMAN JWT and reject an API key by design: a key that can mint another key cannot be contained.",
      "Do NOT build your own users/roles/sessions tables. identity + persona + tenant + rebac + policy already own that; a parallel table breaks tenant isolation and the audit chain.",
      "A human JWT carries NO scopes. Authority is resolved from the persona and its grants at request time, so a revoked role takes effect immediately rather than at token expiry.",
      "A MACHINE credential is different: its token DOES carry scopes and the gate enforces them. Scopes are <domain>.<resource>.<action> — THREE DOT-SEPARATED PARTS, derived from the request path (action = read for GET/HEAD else write, both segments singularised): GET /api/crm/contacts needs crm.contact.read; POST /api/sla/clocks needs sla.clock.write; GET /api/sequences needs sequence.sequence.read (a domain with no sub-segment doubles as its own resource). Tail wildcards work and are usually what you want: crm.* covers every CRM resource and action. THE VALIDATOR ACCEPTS ANY NON-EMPTY STRING ARRAY, so ['crm'] or ['crm:read'] is stored happily and then satisfies NOTHING — every call 403s. If a key 403s everywhere, read the body first: it names required_scopes and granted_scopes.",
      "A machine credential is ALSO bound to a synthetic persona (created with the key, in the same transaction) so machine traffic is attributable as actor {kind: service} instead of borrowing a human's. It starts with NO role grants. Routes that authorize on tenant + scope — most reads — work immediately. A route that consults ReBAC or a role template 403s WITHOUT naming a scope; that is the case that needs POST /api/role-assignments {persona_id, role_template_id}.",
      "POST /api/auth/token: client_id is OPTIONAL and the client_secret alone identifies the key, so omitting it is safest. If sent it must be the APPLICATION's slug or application_id — NOT the tenant's app_id, which is a different row. A mismatch is a hard 401 invalid_client, not a warning.",
      "Everything downstream keys on persona_id (L4), not on person_id and not on a user_id."
    ],
    "flows": {
      "tenant_signup": [
        "POST /api/auth/signup-tenant  -> person + alias + credential + org + app + tenant + tenant_membership + app_identity + profile band (one transaction)",
        "POST /api/auth/send-verification-email  -> purpose-scoped short-lived token",
        "POST /api/auth/verify-email",
        "POST /api/auth/login  (optional tenant_id selects the membership)  -> six-layer JWT"
      ],
      "register_an_application_and_key": [
        "POST /api/applications                        (human JWT) -> application_id",
        "POST /api/applications/{application_id}/keys  (human JWT) -> pk_live_/pk_test_",
        "POST /api/auth/token                          (public, client_credentials) -> short-lived token",
        "rotate: POST /api/api-keys/{key_id}/rotate | revoke: POST /api/api-keys/{key_id}/revoke",
        "POST /api/role-assignments {persona_id, role_template_id}   <- REQUIRED. The key's synthetic persona has no grants until you add them, so every call 403s no matter how valid the key is. persona_id is the key's synthetic_persona_id from the issue call; role_template_id names a tenant.role_template, whose app_id is an app_id and NOT the application_id above.",
        "environment (live|test) is a property of the APPLICATION, not the key, so a test app can never mint a credential that reaches production data.",
        "app_id IS NOT application_id. app_id is TEXT (e.g. 'leadflow-dev-af4bd2'), the PK of tenant.app; tenant.tenant.app_id and tenant.role_template.app_id both REFERENCE it, and persona.app_identity.app_id carries the same value. application_id is a UUID, the PK of api_keys.application - the API-KEY CLIENT REGISTRATION, whose slug is the client_id for client_credentials. Passing an application_id where an app_id belongs is refused by role_template_app_id_fkey, whose message names neither concept. app_id answers 'which of your products is this?'; application_id answers 'which of your machines is calling?'."
      ],
      "app_end_user_signup": [
        "POST /api/auth/register                       -> identity.person (+ alias, credential)",
        "POST /api/app-identities                      -> app_identity, UNIQUE (person_id, app_id)",
        "POST /api/app-identities/{id}/memberships     -> tenant + bu_id + starting role_template_id",
        "POST /api/personas                            -> persona_id  (the acting identity)",
        "POST /api/auth/login                          -> end-user JWT",
        "One human in two of your apps is ONE person_id with TWO app_identities and TWO personas — not two accounts. Delete at persona level so other apps are unaffected."
      ],
      "person_joins_another_tenant": [
        "SUPPORTED, and it needs no new person. identity.alias has UNIQUE (kind, value_hash), so one email is one identity.person GLOBALLY — a human who is already a tenant admin somewhere is the same person_id when they join a different tenant's app.",
        "POST /api/memberships                        -> tenant_membership for the OTHER tenant",
        "POST /api/app-identities                     -> app_identity for that tenant's app_id",
        "POST /api/memberships/{membership_id}/personas -> a SECOND persona, independent roles",
        "Their existing personas are untouched. Login with tenant_id selects which membership the JWT is minted against; omit it to get a person-level token and let them choose.",
        "DO NOT call /api/auth/register again for this person — it will fail on the unique alias, and that failure is the constraint doing its job."
      ],
      "app_user_becomes_a_provider": [
        "RESOLVED (EP-328). POST /api/auth/signup-tenant now REUSES the existing person when the caller sends a verified token for THAT SAME person; anonymous callers still get PersonExistsError. A second identity.person for one human would split their audit trail across two ids that nothing can reconcile, so reuse is the only safe repair.",
        "Compose it instead, from an authorised caller:",
        "POST /api/tenants                            -> the new tenant (+ its tenant.app row)",
        "POST /api/memberships                        -> bind the EXISTING person_id to it",
        "POST /api/memberships/{membership_id}/personas -> owner persona + owner role_template",
        "POST /api/applications                       -> their application, then keys",
        "Correct fix if you need self-service: make signup-tenant reuse the existing person_id when the alias matches AND the caller proves control of it (verified session or re-auth), rather than refusing. Creating a second person for the same human would break MDM convergence and split their audit trail."
      ],
      "single_login_many_providers": [
        "SUPPORTED. A person has ONE identity.credential, so one password works across every provider's app they belong to. Which app they enter is chosen at LOGIN, not signup.",
        "POST /api/auth/login {email,password}                  -> person-level token (no tenant claims)",
        "GET  /api/memberships                                  -> every tenant+app they are subscribed to",
        "POST /api/auth/login {email,password,tenant_id,app_id} -> scoped token; app_identity auto-mints",
        "Subscription is PROVIDER-controlled: login with a tenant_id returns 403 NoMembership unless a membership exists, so nobody self-joins by guessing an id. The provider admits them via POST /api/memberships.",
        "CAVEAT: the credential is global, so a provider collecting the password on their own page holds one that works at other providers too. For mutually-untrusting providers, host login centrally and redirect. There is no OIDC authorize endpoint yet."
      ],
      "get_an_api_key": [
        "An API key belongs to an APPLICATION, which belongs to a TENANT. Order matters.",
        "POST /api/auth/login {email,password,tenant_id}        -> human JWT (steps below need it)",
        "POST /api/applications {name,slug,environment}         -> application_id",
        "POST /api/applications/{application_id}/keys           -> pk_live_/pk_test_ (SHOWN ONCE)",
        "call:  Authorization: Bearer pk_live_...   (same header as a JWT)",
        "POST /api/auth/token (client_credentials)              -> short-lived token, preferred when the credential would otherwise sit on a device or in a browser",
        "rotate POST /api/api-keys/{key_id}/rotate | revoke POST /api/api-keys/{key_id}/revoke | kill all POST /api/applications/{application_id}/disable",
        "environment (live|test) is fixed on the APPLICATION and cannot be flipped; the prefix derives from it, so a test app can never mint a credential that reaches production.",
        "The secret is returned ONCE — only a hash is stored, so there is no 'show it again' call.",
        "Mint ONE KEY PER CONSUMER (web backend, mobile BFF, each CI pipeline) so revocation is about one consumer rather than an outage for all of them."
      ],
      "roles_and_access": [
        "RBAC  tenant.role_template keyed (tenant_id, app_id, name); tenant_id NULL = a platform default for the app, tenant_id set = that tenant's override of the same role name. parent_role_template_id gives inheritance.",
        "POST /api/role-assignments {persona_id, role_template_id}  -> grant beyond the starting template",
        "GET  /api/personas/{persona_id}/roles         -> LIST what a persona holds (read-only; there is no POST on this path)",
        "POST /api/role-assignments/{assignment_id}/revoke          -> withdraw a grant",
        "ReBAC (sdk-rebac)  'may THIS persona act on THAT record' — owner/delegate/account team relationships, with trust state and evidence. Use when authority comes from a relationship rather than from a role.",
        "ABAC (sdk-policy)  'do the attributes permit it right now' — region, consent, time, record state. Use when the decision does not depend on identity.",
        "They compose RBAC -> ReBAC -> ABAC."
      ]
    },
    "multi_app_caveat": "tenant.tenant.app_id is NOT NULL, so a tenant row belongs to exactly ONE app, while tenant.app_pool_index (jsonb app->pool) assumes several. To model one tenant owning several apps today, use the tenant hierarchy (parent_tenant_id / root_tenant_id): a root tenant per customer and a child tenant per app. Do not assume one tenant row can span apps.",
    "guide": "docs/v3.1/developer-hub/authentication.html"
  },
  "api_reference": "https://cloud.projexlight.com/workspace/docs/api/index.html",
  "sdk_count": 77,
  "api_count": 639,
  "groups": [
    {
      "name": "Platform & Multi-Tenancy",
      "sdk_count": 15,
      "api_count": 90,
      "sdks": [
        {
          "sdk": "registry-mcp",
          "group": "Platform & Multi-Tenancy",
          "summary": "MCP server registry: tool registration, discovery and invocation brokering",
          "reuse_when": [
            "mcp",
            "tool registry",
            "server registration",
            "tool discovery",
            "agent tools"
          ],
          "api_count": 1,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-registry-mcp",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/mcp/v1/call",
              "requiresAuth": true,
              "summary": "Invoke a read tool and receive an MCP content envelope",
              "payload_shape": [
                "arguments",
                "name"
              ],
              "fieldEnums": {
                "isError": [
                  true,
                  false
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-asset",
          "group": "Platform & Multi-Tenancy",
          "summary": "Digital asset records and lifecycle",
          "reuse_when": [
            "asset",
            "file",
            "attachment",
            "resource"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-asset",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/assets",
              "requiresAuth": true,
              "summary": "Register a humanoid with a component/sensor tree",
              "payload_shape": [
                "bu_id",
                "components",
                "device_uuid",
                "display_name",
                "model",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assets/:asset_id/commands",
              "requiresAuth": true,
              "summary": "List commands for an asset",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assets/:asset_id/credentials",
              "requiresAuth": true,
              "summary": "Mint a credential scoped to the robot",
              "payload_shape": [
                "expires_at",
                "rate_limit_rpm"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assets/:asset_id/readings",
              "requiresAuth": true,
              "summary": "Query minute-bucketed readings for an asset",
              "payload_shape": [],
              "fieldEnums": {
                "bucket": [
                  "second",
                  "minute",
                  "hour",
                  "day"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assets/:asset_id/twin",
              "requiresAuth": true,
              "summary": "Read the full nested twin",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-assignment",
          "group": "Platform & Multi-Tenancy",
          "summary": "Generic assignment of work/records to owners",
          "reuse_when": [
            "assignment",
            "assign",
            "owner",
            "allocation"
          ],
          "api_count": 16,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-assignment",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/assignment/assign-by-task",
              "requiresAuth": true,
              "summary": "Round-robin assign among three eligible, skilled personas",
              "payload_shape": [
                "candidate_persona_ids",
                "location",
                "pool_key",
                "required_skills",
                "strategy",
                "task_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "strategy": [
                  "default",
                  "round_robin",
                  "fair_share"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assignment/decisions",
              "requiresAuth": true,
              "summary": "Read one recorded decision by id",
              "payload_shape": [],
              "fieldEnums": {
                "outcome": [
                  "ASSIGNED",
                  "FALLBACK",
                  "REVIEW",
                  "UNROUTABLE"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignment/route"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assignment/rotation",
              "requiresAuth": true,
              "summary": "Read the rotation cursors",
              "payload_shape": [],
              "fieldEnums": {
                "strategy": [
                  "default",
                  "round_robin",
                  "fair_share"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignment/route",
              "requiresAuth": true,
              "summary": "Route a subject through the pipeline",
              "payload_shape": [
                "candidate_persona_ids",
                "dry_run",
                "persona_specialties",
                "rule_set_name",
                "subject",
                "subject_ref",
                "tenant_id"
              ],
              "fieldEnums": {
                "dry_run": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignment/routes"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assignment/routes",
              "requiresAuth": true,
              "summary": "List rule versions",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignment/routes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignment/routes",
              "requiresAuth": true,
              "summary": "Publish a rule set and make it active",
              "payload_shape": [
                "activate",
                "name",
                "published_by",
                "rules",
                "tenant_id"
              ],
              "fieldEnums": {
                "activate": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignment/simulate",
              "requiresAuth": true,
              "summary": "Simulate a candidate rule version",
              "payload_shape": [
                "candidate_persona_ids",
                "candidate_version",
                "limit",
                "persona_specialties",
                "rule_set_name",
                "skew_tolerance",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignment/routes",
                "POST /api/assignment/route"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assignment/simulations",
              "requiresAuth": true,
              "summary": "The tenant's runs come back newest first",
              "payload_shape": [],
              "fieldEnums": {
                "limit": [
                  "1",
                  "50",
                  "500"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/coverage/schedules",
                "POST /api/assignment/routes",
                "POST /api/assignment/route",
                "POST /api/assignment/simulate"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assignment/simulations/:simulation_id",
              "requiresAuth": true,
              "summary": "A cited simulation resolves to the report it produced",
              "payload_shape": [],
              "fieldEnums": {
                "outcome": [
                  "ASSIGNED",
                  "FALLBACK",
                  "REVIEW",
                  "UNROUTABLE"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/coverage/schedules",
                "POST /api/assignment/routes",
                "POST /api/assignment/route",
                "POST /api/assignment/simulate"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/assignment/workload/:persona_id",
              "requiresAuth": true,
              "summary": "Upsert a persona workload profile",
              "payload_shape": [
                "available_from",
                "available_to",
                "capacity_per_day",
                "skills"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignments",
              "requiresAuth": true,
              "summary": "Offer a subject with a backup and a manager",
              "payload_shape": [
                "acceptance_window_minutes",
                "actor",
                "backup_persona_id",
                "manager_persona_id",
                "metadata",
                "primary_persona_id",
                "routing_decision_id",
                "source_timestamp",
                "subject_ref",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/assignments/:record_id",
              "requiresAuth": true,
              "summary": "Read an assignment with its history",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignments/:record_id/accept",
              "requiresAuth": true,
              "summary": "Accept an offered assignment",
              "payload_shape": [
                "actor",
                "persona_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignments/:record_id/decline",
              "requiresAuth": true,
              "summary": "Decline with a reason",
              "payload_shape": [
                "actor",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignments/:record_id/reassign",
              "requiresAuth": true,
              "summary": "Reassign with a reason",
              "payload_shape": [
                "actor",
                "reason",
                "tenant_id",
                "to_persona_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignments",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/assignments/sweep",
              "requiresAuth": true,
              "summary": "Sweep expired offers",
              "payload_shape": [
                "limit",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assignments"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-command",
          "group": "Platform & Multi-Tenancy",
          "summary": "Command bus / imperative operation dispatch",
          "reuse_when": [
            "command",
            "action",
            "dispatch",
            "operation"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-command",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/commands",
              "requiresAuth": true,
              "summary": "Issue a low-risk move command",
              "payload_shape": [
                "params",
                "risk_class",
                "target_asset_id",
                "target_component_id",
                "tenant_id",
                "type"
              ],
              "fieldEnums": {
                "risk_class": [
                  "low",
                  "medium",
                  "high",
                  "critical"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/commands/:command_id",
              "requiresAuth": true,
              "summary": "Read command status",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/commands"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/commands/:command_id/ack",
              "requiresAuth": true,
              "summary": "Robot acks a dispatched command",
              "payload_shape": [
                "code",
                "data",
                "message",
                "ok"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/assets/:asset_id/credentials",
                "POST /api/commands"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/commands/:command_id/decision",
              "requiresAuth": true,
              "summary": "Approve a pending risky command",
              "payload_shape": [
                "approved",
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/commands"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/commands/stream/:asset_id",
              "requiresAuth": false,
              "summary": "Edge agent subscribes to its asset's command stream",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-config",
          "group": "Platform & Multi-Tenancy",
          "summary": "Tenant-scoped configuration values and typed settings resolution",
          "reuse_when": [
            "config",
            "setting",
            "tenant configuration",
            "preference",
            "parameter",
            "feature configuration"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-config",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/config",
              "requiresAuth": true,
              "summary": "List tenant-scoped config",
              "payload_shape": [],
              "fieldEnums": {
                "scope": [
                  "platform",
                  "tenant",
                  "app",
                  "app_user"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/config"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/config",
              "requiresAuth": true,
              "summary": "Set a tenant-scoped config value",
              "payload_shape": [
                "key",
                "scope",
                "scope_id",
                "value"
              ],
              "fieldEnums": {
                "scope": [
                  "platform",
                  "tenant",
                  "app",
                  "app_user"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/config/resolve",
              "requiresAuth": true,
              "summary": "Resolve a key set at tenant scope",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/config"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/config/revoke",
              "requiresAuth": true,
              "summary": "Revoke a tenant config value",
              "payload_shape": [
                "key",
                "scope",
                "scope_id"
              ],
              "fieldEnums": {
                "scope": [
                  "platform",
                  "tenant",
                  "app",
                  "app_user"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/config/rotate",
              "requiresAuth": true,
              "summary": "Rotate a tenant secret config value",
              "payload_shape": [
                "key",
                "scope",
                "scope_id",
                "secret_ref"
              ],
              "fieldEnums": {
                "scope": [
                  "platform",
                  "tenant",
                  "app",
                  "app_user"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/config/value",
              "requiresAuth": true,
              "summary": "Get one tenant config row",
              "payload_shape": [],
              "fieldEnums": {
                "scope": [
                  "platform",
                  "tenant",
                  "app",
                  "app_user"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/config"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-device",
          "group": "Platform & Multi-Tenancy",
          "summary": "Device registry, posture, and management",
          "reuse_when": [
            "device",
            "hardware",
            "posture",
            "registration",
            "mobile device"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-device",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/devices",
              "requiresAuth": true,
              "summary": "Register iOS device",
              "payload_shape": [
                "app_version",
                "device_key_ref",
                "device_uuid",
                "os_version",
                "platform"
              ],
              "fieldEnums": {
                "platform": [
                  "ios",
                  "android",
                  "web",
                  "desktop"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/devices/:device_uuid",
              "requiresAuth": true,
              "summary": "Get device",
              "payload_shape": [],
              "fieldEnums": {
                "platform": [
                  "ios",
                  "android",
                  "web",
                  "desktop"
                ],
                "status": [
                  "active",
                  "revoked",
                  "stolen"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/devices/:device_uuid/attest",
              "requiresAuth": true,
              "summary": "Attest via secure-enclave",
              "payload_shape": [
                "expires_at",
                "method",
                "signature_envelope",
                "verified"
              ],
              "fieldEnums": {
                "method": [
                  "secure-enclave",
                  "key-attestation",
                  "safetynet",
                  "play-integrity"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/devices/:device_uuid/link-person",
              "requiresAuth": true,
              "summary": "Link person to device",
              "payload_shape": [
                "person_id"
              ],
              "fieldEnums": {
                "status": [
                  "active",
                  "suspended",
                  "revoked"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/devices/:device_uuid/persons",
              "requiresAuth": true,
              "summary": "List persons for device",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "active",
                  "suspended",
                  "revoked"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/devices/:device_uuid/revoke",
              "requiresAuth": true,
              "summary": "Revoke device",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {
                "reason": [
                  "revoked",
                  "stolen"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-diagnostic-telemetry",
          "group": "Platform & Multi-Tenancy",
          "summary": "Diagnostic telemetry ingestion and health signals",
          "reuse_when": [
            "diagnostic",
            "telemetry",
            "health",
            "metrics",
            "signal"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-diagnostic-telemetry",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/diagnostic/crash",
              "requiresAuth": true,
              "summary": "List crashes for a registered device",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/diagnostic/crash",
              "requiresAuth": true,
              "summary": "Record a crash snapshot for a registered device",
              "payload_shape": [
                "app_version",
                "device_uuid",
                "occurred_at",
                "os_version",
                "person_id",
                "stack_envelope",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/devices",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/diagnostic/crash/:id",
              "requiresAuth": true,
              "summary": "Fetch a crash by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/diagnostic/crash"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/diagnostic/health",
              "requiresAuth": false,
              "summary": "Fetch the latest health snapshot for a registered device",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices",
                "POST /api/diagnostic/health"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/diagnostic/health",
              "requiresAuth": false,
              "summary": "Record a health snapshot for a registered device",
              "payload_shape": [
                "battery_pct",
                "captured_at",
                "device_uuid",
                "permissions",
                "sensor_state",
                "tenant_id",
                "wifi_state"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/devices"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/diagnostic/session-replay",
              "requiresAuth": true,
              "summary": "Record a sanitized session-replay event for a registered device",
              "payload_shape": [
                "device_uuid",
                "occurred_at",
                "payload",
                "sanitized_event_kind"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/devices"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-dispatch",
          "group": "Platform & Multi-Tenancy",
          "summary": "Dispatch/queue of jobs to workers",
          "reuse_when": [
            "dispatch",
            "queue",
            "job",
            "worker",
            "routing"
          ],
          "api_count": 2,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-dispatch",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/dispatch/routes/optimize",
              "requiresAuth": true,
              "summary": "Optimize a dispatcher route from queued tasks",
              "payload_shape": [
                "persona_id",
                "start_task_id",
                "task_ids"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/dispatch/ws/:persona_id",
              "requiresAuth": false,
              "summary": "Subscribe to live dispatch events for a persona",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-feature-flags",
          "group": "Platform & Multi-Tenancy",
          "summary": "Feature flags, targeting, and rollout",
          "reuse_when": [
            "feature flag",
            "toggle",
            "rollout",
            "experiment",
            "targeting"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-feature-flags",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/flags",
              "requiresAuth": true,
              "summary": "List flags",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/flags",
              "requiresAuth": true,
              "summary": "Upsert agent kill-switch flag",
              "payload_shape": [
                "default_value",
                "description",
                "flag_id",
                "kill_switch",
                "kind",
                "schema_ref"
              ],
              "fieldEnums": {
                "kind": [
                  "boolean",
                  "variant",
                  "numeric",
                  "json"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/flags/:flag_id",
              "requiresAuth": true,
              "summary": "Get flag",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "PUT /api/flags"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/flags/:flag_id/evaluate",
              "requiresAuth": true,
              "summary": "Evaluate flag for a tenant",
              "payload_shape": [
                "attributes",
                "bu_id",
                "persona_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "PUT /api/flags"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/flags/:flag_id/kill-switch",
              "requiresAuth": true,
              "summary": "Engage kill switch",
              "payload_shape": [
                "engaged"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "PUT /api/flags"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/flags/:flag_id/rollouts",
              "requiresAuth": true,
              "summary": "Tenant-scoped rollout",
              "payload_shape": [
                "active",
                "predicate",
                "priority",
                "tenant_id",
                "value"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "PUT /api/flags"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-geo",
          "group": "Platform & Multi-Tenancy",
          "summary": "Geospatial: geocoding, regions, distance, merge",
          "reuse_when": [
            "geo",
            "location",
            "geocode",
            "address",
            "distance",
            "region",
            "map"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-geo",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/geo/addresses/:address_id",
              "requiresAuth": true,
              "summary": "Read by canonical id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/geo/canonicalize"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/geo/bbox-query",
              "requiresAuth": true,
              "summary": "Query bbox around SF",
              "payload_shape": [
                "limit",
                "max_lat",
                "max_lng",
                "min_lat",
                "min_lng"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/geo/canonicalize",
              "requiresAuth": true,
              "summary": "Canonicalize a US address",
              "payload_shape": [
                "city",
                "country",
                "geo_node_id",
                "lat",
                "lng",
                "postal_code",
                "provider_refs",
                "raw_input",
                "region",
                "street"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/geo-nodes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/geo/geocode",
              "requiresAuth": true,
              "summary": "Geocode raw input",
              "payload_shape": [
                "raw_input"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/geo/merge",
              "requiresAuth": true,
              "summary": "Merge two addresses",
              "payload_shape": [
                "loser_address_id",
                "operator_id",
                "winner_address_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/geo/reverse-geocode",
              "requiresAuth": true,
              "summary": "Reverse-geocode SF",
              "payload_shape": [
                "lat",
                "lng"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-media",
          "group": "Platform & Multi-Tenancy",
          "summary": "Media storage and transcoding (blob service)",
          "reuse_when": [
            "media",
            "image",
            "video",
            "upload",
            "blob",
            "storage",
            "transcode"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-media",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/media/:blob_id/playback-url",
              "requiresAuth": true,
              "summary": "Issue 10min playback URL for the uploaded blob",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/media/upload-url"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/media/:blob_id/ready",
              "requiresAuth": true,
              "summary": "Commit an uploaded blob with its SHA-256 checksum",
              "payload_shape": [
                "checksum_hex"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/media/upload-url"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/media/:blob_id/transcode",
              "requiresAuth": true,
              "summary": "Enqueue image-optimize pipeline",
              "payload_shape": [
                "pipeline"
              ],
              "fieldEnums": {
                "pipeline": [
                  "video-mp4-hls",
                  "image-optimize",
                  "pdf-thumbnail"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/media/upload-url"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/media/transcode-jobs/:job_id",
              "requiresAuth": true,
              "summary": "Poll a transcode job by id",
              "payload_shape": [],
              "fieldEnums": {
                "pipeline": [
                  "video-mp4-hls",
                  "image-optimize",
                  "pdf-thumbnail"
                ],
                "status": [
                  "queued",
                  "running",
                  "succeeded",
                  "failed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/media/upload-url",
                "POST /api/media/:blob_id/transcode"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/media/upload-url",
              "requiresAuth": true,
              "summary": "Issue upload URL for a 1MB JPEG",
              "payload_shape": [
                "byte_size",
                "content_type",
                "persona_id",
                "tenant_id",
                "ttl_seconds"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-tenant",
          "group": "Platform & Multi-Tenancy",
          "summary": "Tenant records, settings, and membership",
          "reuse_when": [
            "tenant",
            "organization",
            "workspace",
            "account",
            "multi-tenant",
            "tenant signup",
            "onboarding",
            "provisioning",
            "business unit",
            "role template",
            "tenant admin",
            "isolation tier",
            "parent tenant",
            "become a provider",
            "sub tenant"
          ],
          "api_count": 10,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-tenant",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/geo-nodes",
              "requiresAuth": true,
              "summary": "Create a US region geo node",
              "payload_shape": [
                "code",
                "kind",
                "name",
                "residency_class"
              ],
              "fieldEnums": {
                "kind": [
                  "region",
                  "country",
                  "state",
                  "city",
                  "locality"
                ],
                "residency_class": [
                  "open",
                  "regulated",
                  "sovereign"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/resellers",
              "requiresAuth": true,
              "summary": "Create a reseller with brand + commission rules",
              "payload_shape": [
                "brand_name",
                "cname_host",
                "commission_rules",
                "invoice_aggregation",
                "org_id",
                "support_contact"
              ],
              "fieldEnums": {
                "invoice_aggregation": [
                  "per-tenant",
                  "consolidated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/role-templates",
              "requiresAuth": true,
              "summary": "List role templates for an app",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenants",
              "requiresAuth": true,
              "summary": "Create a root tenant under the self-serve app",
              "payload_shape": [
                "admin_pool_index",
                "app_id",
                "app_pool_index",
                "brand_domain",
                "display_name",
                "isolation_tier",
                "module_subscriptions",
                "region"
              ],
              "fieldEnums": {
                "isolation_tier": [
                  "S",
                  "P",
                  "G"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/tenants/:tenant_id",
              "requiresAuth": true,
              "summary": "Fetch the self-serve tenant by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenants/:tenant_id/bus",
              "requiresAuth": true,
              "summary": "Create a Region root BU",
              "payload_shape": [
                "kind",
                "name"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/tenants/:tenant_id/contact",
              "requiresAuth": false,
              "summary": "Resolve the founding member as the tenant contact",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenants/:tenant_id/fiscal-calendar",
              "requiresAuth": true,
              "summary": "Set fiscal year starting in April with USD",
              "payload_shape": [
                "base_currency",
                "period_kind",
                "year_start_month"
              ],
              "fieldEnums": {
                "period_kind": [
                  "year",
                  "quarter",
                  "month",
                  "week"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenants/:tenant_id/reseller-attach",
              "requiresAuth": true,
              "summary": "Attach a reseller to a tenant with custom commission",
              "payload_shape": [
                "commission_rules",
                "reseller_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/resellers"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenants/:tenant_id/sub-tenants",
              "requiresAuth": true,
              "summary": "Create a sub-tenant that shares parent pool",
              "payload_shape": [
                "app_id",
                "brand_domain",
                "display_name",
                "isolation_tier",
                "placement",
                "region"
              ],
              "fieldEnums": {
                "placement": [
                  "share",
                  "tier-p",
                  "tier-g"
                ],
                "isolation_tier": [
                  "S",
                  "P",
                  "G"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-tenant-lifecycle",
          "group": "Platform & Multi-Tenancy",
          "summary": "Tenant provisioning, suspension, and offboarding lifecycle",
          "reuse_when": [
            "tenant lifecycle",
            "provisioning",
            "onboarding",
            "suspend",
            "offboard"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-tenant-lifecycle",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/tenant-lifecycle/:tenant_id/offboard",
              "requiresAuth": true,
              "summary": "Begin offboarding (active -> offboarding)",
              "payload_shape": [
                "deadline_at"
              ],
              "fieldEnums": {
                "current_state": [
                  "active",
                  "suspended",
                  "offboarding",
                  "offboarded",
                  "sandbox"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenant-lifecycle/:tenant_id/reinstate",
              "requiresAuth": true,
              "summary": "Reinstate tenant (suspended -> active)",
              "payload_shape": [],
              "fieldEnums": {
                "current_state": [
                  "active",
                  "suspended",
                  "offboarding",
                  "offboarded",
                  "sandbox"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/tenant-lifecycle/:tenant_id/suspend"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/tenant-lifecycle/:tenant_id/state",
              "requiresAuth": true,
              "summary": "Read state after a transition",
              "payload_shape": [],
              "fieldEnums": {
                "current_state": [
                  "active",
                  "suspended",
                  "offboarding",
                  "offboarded",
                  "sandbox"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/tenant-lifecycle/:tenant_id/suspend"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenant-lifecycle/:tenant_id/suspend",
              "requiresAuth": true,
              "summary": "Suspend tenant (active -> suspended)",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {
                "current_state": [
                  "active",
                  "suspended",
                  "offboarding",
                  "offboarded",
                  "sandbox"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/tenant-lifecycle/sandbox",
              "requiresAuth": true,
              "summary": "Create sandbox sub-tenant from caller's tenant_id",
              "payload_shape": [
                "expires_at",
                "sanitization_policy"
              ],
              "fieldEnums": {
                "current_state": [
                  "active",
                  "suspended",
                  "offboarding",
                  "offboarded",
                  "sandbox"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-webhook",
          "group": "Platform & Multi-Tenancy",
          "summary": "Outbound webhooks: endpoints, deliveries, signing",
          "reuse_when": [
            "webhook",
            "callback",
            "event delivery",
            "subscription",
            "signature"
          ],
          "api_count": 7,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-webhook",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/webhooks/deliveries",
              "requiresAuth": true,
              "summary": "List DLQ for tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/webhooks/deliveries/:delivery_id/replay",
              "requiresAuth": true,
              "summary": "Replay a single DLQ delivery",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/webhooks/dlq",
              "requiresAuth": true,
              "summary": "List DLQ deliveries for tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/webhooks/endpoints",
              "requiresAuth": true,
              "summary": "List endpoints for tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/webhooks/endpoints",
              "requiresAuth": true,
              "summary": "Register HTTPS endpoint",
              "payload_shape": [
                "mtls_client_cert_ref",
                "signing_algo",
                "signing_key_ref",
                "tenant_id",
                "url"
              ],
              "fieldEnums": {
                "signing_algo": [
                  "hmac-sha256",
                  "hmac-sha512"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/webhooks/endpoints/:endpoint_id/subscribe",
              "requiresAuth": true,
              "summary": "Subscribe to billing.invoice.finalized.v1",
              "payload_shape": [
                "event_type",
                "filter_predicate"
              ],
              "fieldEnums": {
                "event_type": [
                  "billing.invoice.finalized.v1",
                  "billing.invoice.paid.v1",
                  "billing.dunning.advanced.v1",
                  "billing.reprice.dry-run.completed.v1"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/webhooks/endpoints"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/webhooks/publish",
              "requiresAuth": true,
              "summary": "Publish billing.invoice.finalized.v1 for tenant",
              "payload_shape": [
                "event_id",
                "event_type",
                "payload",
                "tenant_id"
              ],
              "fieldEnums": {
                "event_type": [
                  "billing.invoice.finalized.v1",
                  "billing.invoice.paid.v1",
                  "billing.dunning.advanced.v1",
                  "billing.reprice.dry-run.completed.v1"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-workflow",
          "group": "Platform & Multi-Tenancy",
          "summary": "Durable workflow/saga orchestration",
          "reuse_when": [
            "workflow",
            "saga",
            "orchestration",
            "state machine",
            "process",
            "steps"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-workflow",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/workflows/:run_id",
              "requiresAuth": true,
              "summary": "Query run state",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/workflows/definitions",
                "POST /api/workflows/start"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/workflows/:run_id/signal",
              "requiresAuth": true,
              "summary": "Send approval signal to a run",
              "payload_shape": [
                "payload",
                "signal_name"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/workflows/definitions",
                "POST /api/workflows/start"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/workflows/definitions",
              "requiresAuth": true,
              "summary": "Register a 2-step workflow using boot-registered step handlers",
              "payload_shape": [
                "name",
                "namespace",
                "step_specs",
                "version"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/workflows/start",
              "requiresAuth": true,
              "summary": "Start qa-workflow-demo run (platform-scoped)",
              "payload_shape": [
                "envelope",
                "input",
                "name",
                "namespace",
                "version"
              ],
              "fieldEnums": {
                "envelope.actor.kind": [
                  "human",
                  "service",
                  "agent",
                  "support_impersonator"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/personas",
                "POST /policy/:id/evaluate",
                "POST /scim/v2/Users",
                "POST /api/workflows/definitions"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Outreach & Communication",
      "sdk_count": 9,
      "api_count": 125,
      "sdks": [
        {
          "sdk": "connector-twilio-voice",
          "group": "Outreach & Communication",
          "summary": "Twilio programmable voice: calls, IVR, recordings, consent-aware dialing",
          "reuse_when": [
            "voice",
            "call",
            "phone",
            "twilio",
            "ivr",
            "dial",
            "telephony",
            "recording"
          ],
          "api_count": 8,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-connector-twilio-voice",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/voice/calls",
              "requiresAuth": true,
              "summary": "List outbound calls for the tenant",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "queued",
                  "initiated",
                  "ringing",
                  "in-progress",
                  "completed",
                  "busy",
                  "no-answer",
                  "canceled",
                  "failed"
                ],
                "direction": [
                  "inbound",
                  "outbound"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers",
                "POST /api/voice/calls"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/voice/calls",
              "requiresAuth": true,
              "summary": "Place a recorded call from the provisioned tracking number",
              "payload_shape": [
                "from_number",
                "initiated_by_persona_id",
                "install_id",
                "machine_detection",
                "metadata",
                "record",
                "subject_persona_id",
                "tenant_id",
                "to_number",
                "tracking_number_id"
              ],
              "fieldEnums": {
                "status": [
                  "queued",
                  "initiated",
                  "ringing",
                  "in-progress",
                  "completed",
                  "busy",
                  "no-answer",
                  "canceled",
                  "failed"
                ],
                "direction": [
                  "inbound",
                  "outbound"
                ],
                "recording_withheld_reason": [
                  "consent_denied",
                  "consent_unknown",
                  "not_requested"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/voice/calls/:voice_call_id",
              "requiresAuth": true,
              "summary": "Fetch the placed call",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "queued",
                  "initiated",
                  "ringing",
                  "in-progress",
                  "completed",
                  "busy",
                  "no-answer",
                  "canceled",
                  "failed"
                ],
                "answered_by": [
                  "human",
                  "machine_start",
                  "machine_end_beep",
                  "machine_end_silence",
                  "machine_end_other",
                  "fax",
                  "unknown"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers",
                "POST /api/voice/calls"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/voice/tracking-numbers",
              "requiresAuth": true,
              "summary": "List active tracking numbers for the tenant",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "active",
                  "released",
                  "deleted-upstream"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/voice/tracking-numbers",
              "requiresAuth": true,
              "summary": "Provision a tracking number for the signup tenant",
              "payload_shape": [
                "area_code",
                "assigned_persona_id",
                "friendly_name",
                "install_id",
                "purpose",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "active",
                  "released",
                  "deleted-upstream"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/voice/tracking-numbers/:tracking_number_id/release",
              "requiresAuth": true,
              "summary": "Release the provisioned tracking number",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "active",
                  "released",
                  "deleted-upstream"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers",
                "POST /api/voice/calls"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/voice/webhooks/twilio/recording",
              "requiresAuth": false,
              "summary": "Recording ready for the placed call",
              "payload_shape": [
                "CallSid",
                "RecordingDuration",
                "RecordingSid",
                "RecordingUrl"
              ],
              "fieldEnums": {
                "recording_withheld_reason": [
                  "consent_denied",
                  "consent_unknown",
                  "not_requested"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers",
                "POST /api/voice/calls"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/voice/webhooks/twilio/status",
              "requiresAuth": false,
              "summary": "Voicemail reached: completed call answered by a machine",
              "payload_shape": [
                "AnsweredBy",
                "CallDuration",
                "CallSid",
                "CallStatus",
                "ErrorCode"
              ],
              "fieldEnums": {
                "CallStatus": [
                  "queued",
                  "initiated",
                  "ringing",
                  "in-progress",
                  "completed",
                  "busy",
                  "no-answer",
                  "canceled",
                  "failed"
                ],
                "AnsweredBy": [
                  "human",
                  "machine_start",
                  "machine_end_beep",
                  "machine_end_silence",
                  "machine_end_other",
                  "fax",
                  "unknown"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/voice/tracking-numbers",
                "POST /api/voice/calls"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-conversation",
          "group": "Outreach & Communication",
          "summary": "Omnichannel threading: unified inbox, reply detection, internal notes and compose guardrails",
          "reuse_when": [
            "conversation",
            "thread",
            "omnichannel",
            "inbox",
            "transcript",
            "internal note",
            "reply detection",
            "compose guardrail",
            "message history"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-conversation",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/conversations/compose-guardrail",
              "requiresAuth": true,
              "summary": "Opt-out outranks quiet hours in the reason list",
              "payload_shape": [
                "channel_facts",
                "channels",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/conversations/inbox",
              "requiresAuth": true,
              "summary": "Unfiltered inbox returns the tenant's open threads",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/conversations/threads",
                "POST /api/conversations/messages"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/conversations/messages",
              "requiresAuth": true,
              "summary": "Record an outbound SMS on the thread",
              "payload_shape": [
                "actor",
                "body_preview",
                "body_ref",
                "channel",
                "direction",
                "occurred_at",
                "provider_message_key",
                "tenant_id",
                "thread_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/conversations/threads"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/conversations/threads",
              "requiresAuth": true,
              "summary": "Open a thread with purpose and an eligibility snapshot",
              "payload_shape": [
                "eligibility_snapshot",
                "metadata",
                "purpose",
                "related_object_ref",
                "sender_identity_ref",
                "subject_kind",
                "subject_ref",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/conversations/threads/:id",
              "requiresAuth": true,
              "summary": "Fetch the thread and its messages",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/conversations/threads",
                "POST /api/conversations/messages"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-deliverability",
          "group": "Outreach & Communication",
          "summary": "Email/SMS deliverability: domains, warmup, suppression, bounce/complaint handling",
          "reuse_when": [
            "deliverability",
            "email",
            "domain",
            "warmup",
            "suppression",
            "bounce",
            "spam",
            "dkim",
            "spf"
          ],
          "api_count": 18,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-deliverability",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/deliverability/bounce-events",
              "requiresAuth": true,
              "summary": "List bounce events",
              "payload_shape": [],
              "fieldEnums": {
                "classification": [
                  "hard_bounce",
                  "soft_bounce",
                  "complaint",
                  "delivered",
                  "other"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/webhooks/:provider"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/check",
              "requiresAuth": true,
              "summary": "Check a fresh address (not suppressed)",
              "payload_shape": [
                "address",
                "channel",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "all"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/check/bulk",
              "requiresAuth": true,
              "summary": "Mixed email and sms recipients in one call, plus one invalid channel",
              "payload_shape": [
                "items"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "all"
                ],
                "error_code": [
                  "VALIDATION_ERROR"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/deliverability/mailboxes",
              "requiresAuth": true,
              "summary": "List mailboxes",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/mailboxes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/mailboxes",
              "requiresAuth": true,
              "summary": "Register an inbox",
              "payload_shape": [
                "folder",
                "imap_host",
                "imap_port",
                "secret_ref",
                "tenant_id",
                "use_tls",
                "username"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/mailboxes/:mailbox_id/replies",
              "requiresAuth": true,
              "summary": "Ingest a human reply",
              "payload_shape": [
                "from_address",
                "headers",
                "in_reply_to",
                "message_id",
                "references",
                "snippet",
                "subject",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/mailboxes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/mailboxes/:mailbox_id/sync",
              "requiresAuth": true,
              "summary": "Sync the mailbox",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/mailboxes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/optout-tokens",
              "requiresAuth": true,
              "summary": "Issue an unsubscribe token",
              "payload_shape": [
                "address",
                "channel",
                "purpose",
                "scope",
                "tenant_id",
                "ttl_seconds"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "all"
                ],
                "purpose": [
                  "unsubscribe",
                  "resubscribe",
                  "preferences"
                ],
                "scope": [
                  "tenant",
                  "global"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/optout/redeem",
              "requiresAuth": true,
              "summary": "Redeem the opt-out token",
              "payload_shape": [
                "feedback",
                "token"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/optout-tokens"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/deliverability/reply-events",
              "requiresAuth": true,
              "summary": "List reply events",
              "payload_shape": [],
              "fieldEnums": {
                "classification": [
                  "human",
                  "auto_reply",
                  "ooo",
                  "bounce",
                  "other"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/mailboxes/:mailbox_id/replies"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/deliverability/reputation",
              "requiresAuth": true,
              "summary": "Get email reputation",
              "payload_shape": [],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms"
                ],
                "status": [
                  "good",
                  "watch",
                  "paused"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/reputation/record"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/reputation/record",
              "requiresAuth": true,
              "summary": "Record a healthy batch (2% bounce -> good)",
              "payload_shape": [
                "bounced",
                "channel",
                "complained",
                "delivered",
                "sent",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/reputation/resume",
              "requiresAuth": true,
              "summary": "Resume the email channel",
              "payload_shape": [
                "channel",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/reputation/record"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/deliverability/suppressions",
              "requiresAuth": true,
              "summary": "List suppressions",
              "payload_shape": [],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "all"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/deliverability/suppressions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/suppressions",
              "requiresAuth": true,
              "summary": "Suppress an email (manual)",
              "payload_shape": [
                "address",
                "channel",
                "reason",
                "reason_detail",
                "scope",
                "source",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "all"
                ],
                "reason": [
                  "manual",
                  "optout",
                  "hard_bounce",
                  "soft_bounce",
                  "complaint",
                  "dnc",
                  "list_unsubscribe"
                ],
                "scope": [
                  "tenant",
                  "global"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/suppressions/remove",
              "requiresAuth": true,
              "summary": "Remove a suppression",
              "payload_shape": [
                "address",
                "channel",
                "scope",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "all"
                ],
                "scope": [
                  "tenant",
                  "global"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/webhook-secrets",
              "requiresAuth": true,
              "summary": "Register a SendGrid signing secret",
              "payload_shape": [
                "algo",
                "provider",
                "signing_secret",
                "tenant_id"
              ],
              "fieldEnums": {
                "provider": [
                  "ses",
                  "sendgrid",
                  "mailgun",
                  "postmark",
                  "twilio"
                ],
                "algo": [
                  "sha1",
                  "sha256"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/deliverability/webhooks/:provider",
              "requiresAuth": false,
              "summary": "Deliver a hard-bounce notification (no secret configured -> accepted, auto-suppress)",
              "payload_shape": [
                "address",
                "event_type",
                "message_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-handoff",
          "group": "Outreach & Communication",
          "summary": "Human/agent handoff sagas — route, accept, resolve work",
          "reuse_when": [
            "handoff",
            "escalation",
            "transfer",
            "routing",
            "assignment",
            "agent handoff"
          ],
          "api_count": 9,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-handoff",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/handoffs",
              "requiresAuth": true,
              "summary": "List handoffs for the signup tenant",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "draft",
                  "pending",
                  "accepted",
                  "rejected",
                  "completed",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/handoffs",
              "requiresAuth": true,
              "summary": "Create a draft handoff for the signup tenant",
              "payload_shape": [
                "from_persona_id",
                "kickoff_ref",
                "promises",
                "risks",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/handoffs/:handoff_id",
              "requiresAuth": true,
              "summary": "Get the created handoff",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/handoffs/:handoff_id",
              "requiresAuth": true,
              "summary": "Enrich the draft handoff (owner + milestones)",
              "payload_shape": [
                "cs_owner_persona_id",
                "metadata",
                "milestones",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/handoffs/:handoff_id/approval/decision",
              "requiresAuth": true,
              "summary": "CS approves the handoff (pending -> accepted)",
              "payload_shape": [
                "decision",
                "reject_reason",
                "tenant_id"
              ],
              "fieldEnums": {
                "decision": [
                  "approved",
                  "rejected"
                ],
                "status": [
                  "draft",
                  "pending",
                  "accepted",
                  "rejected",
                  "completed",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs",
                "PATCH /api/handoffs/:handoff_id",
                "POST /api/handoffs/:handoff_id/transition",
                "POST /api/handoffs/:handoff_id/approval/request"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/handoffs/:handoff_id/approval/request",
              "requiresAuth": true,
              "summary": "File the CS approval for the submitted handoff",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "pending",
                  "accepted",
                  "rejected",
                  "completed",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs",
                "PATCH /api/handoffs/:handoff_id",
                "POST /api/handoffs/:handoff_id/transition"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/handoffs/:handoff_id/saga",
              "requiresAuth": true,
              "summary": "Read the saga projection after starting it",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs",
                "POST /api/handoffs/:handoff_id/saga/start"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/handoffs/:handoff_id/saga/start",
              "requiresAuth": true,
              "summary": "Start the saga for the created handoff",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/handoffs/:handoff_id/transition",
              "requiresAuth": true,
              "summary": "Submit the draft handoff (draft -> pending)",
              "payload_shape": [
                "status",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "pending",
                  "accepted",
                  "rejected",
                  "completed",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/handoffs"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-incident",
          "group": "Outreach & Communication",
          "summary": "Incident tickets: create, triage, assign, status transitions, audit",
          "reuse_when": [
            "incident",
            "ticket",
            "triage",
            "outage",
            "on-call",
            "alerting"
          ],
          "api_count": 8,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-incident",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/incidents",
              "requiresAuth": true,
              "summary": "List incidents for the signup tenant",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "open",
                  "investigating",
                  "mitigated",
                  "resolved",
                  "closed",
                  "cancelled"
                ],
                "severity": [
                  "low",
                  "medium",
                  "high",
                  "critical"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/incidents",
              "requiresAuth": true,
              "summary": "Open a high-severity data-quality incident",
              "payload_shape": [
                "affected_records",
                "incident_type",
                "reported_by_persona_id",
                "severity",
                "tenant_id",
                "title"
              ],
              "fieldEnums": {
                "severity": [
                  "low",
                  "medium",
                  "high",
                  "critical"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/incidents/:incident_id",
              "requiresAuth": true,
              "summary": "Get the created incident",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/incidents"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/incidents/:incident_id",
              "requiresAuth": true,
              "summary": "Assign an owner + record root cause",
              "payload_shape": [
                "owner_persona_id",
                "root_cause",
                "severity",
                "tenant_id"
              ],
              "fieldEnums": {
                "severity": [
                  "low",
                  "medium",
                  "high",
                  "critical"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/incidents"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/incidents/:incident_id/evidence",
              "requiresAuth": true,
              "summary": "Read the timeline for the incident that has evidence",
              "payload_shape": [],
              "fieldEnums": {
                "kind": [
                  "detected",
                  "root_cause",
                  "recovery",
                  "verification",
                  "note"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/incidents",
                "POST /api/incidents/:incident_id/evidence"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/incidents/:incident_id/evidence",
              "requiresAuth": true,
              "summary": "Record the detection evidence for the created incident",
              "payload_shape": [
                "body",
                "evidence_ref",
                "kind",
                "metadata",
                "occurred_at",
                "recorded_by_persona_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "kind": [
                  "detected",
                  "root_cause",
                  "recovery",
                  "verification",
                  "note"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/incidents"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/incidents/:incident_id/transition",
              "requiresAuth": true,
              "summary": "Start investigating (open -> investigating)",
              "payload_shape": [
                "status",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "open",
                  "investigating",
                  "mitigated",
                  "resolved",
                  "closed",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/incidents"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/incidents/sla-breaches",
              "requiresAuth": true,
              "summary": "Scan SLA breaches for the signup tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-notification",
          "group": "Outreach & Communication",
          "summary": "Multi-channel notifications (email/SMS/push/in-app) + provider adapters + templates",
          "reuse_when": [
            "notification",
            "email",
            "sms",
            "push",
            "in-app",
            "alert",
            "message",
            "template",
            "provider",
            "frequency cap",
            "dedup",
            "quiet hours",
            "send throttle",
            "no answer retry",
            "do not contact too often"
          ],
          "api_count": 21,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-notification",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/notifications/delivery-receipts",
              "requiresAuth": true,
              "summary": "List delivery receipts",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "queued",
                  "sent",
                  "delivered",
                  "failed",
                  "bounced",
                  "undelivered",
                  "complaint"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/webhooks/delivery/:provider"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/dispatch",
              "requiresAuth": true,
              "summary": "Dispatch an email through the unified transport",
              "payload_shape": [
                "body",
                "channel",
                "destination",
                "metadata",
                "respect_quiet_hours",
                "subject",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "whatsapp",
                  "push",
                  "slack"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/notifications/frequency-policy",
              "requiresAuth": true,
              "summary": "List all policies for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "PUT /api/notifications/frequency-policy"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/notifications/frequency-policy",
              "requiresAuth": true,
              "summary": "Cap marketing SMS at 5 a day with a 15-minute dedup window",
              "payload_shape": [
                "channel",
                "dedup_window_seconds",
                "max_per_day",
                "purpose",
                "tenant_id",
                "updated_by"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/notifications/providers",
              "requiresAuth": true,
              "summary": "List the tenant's email providers (metadata only)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/providers"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/providers",
              "requiresAuth": true,
              "summary": "Configure a SendGrid email provider for the tenant",
              "payload_shape": [
                "config",
                "credential",
                "fallback_on_error",
                "from_address",
                "kind"
              ],
              "fieldEnums": {
                "kind": [
                  "smtp",
                  "sendgrid",
                  "ses"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "DELETE",
              "endpoint": "/api/notifications/providers/:provider_id",
              "requiresAuth": true,
              "summary": "Revoke the tenant's email provider",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/providers"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/notifications/providers/:provider_id",
              "requiresAuth": true,
              "summary": "Rotate the tenant's email provider credential",
              "payload_shape": [
                "credential"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/providers"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/providers/:provider_id/verify",
              "requiresAuth": true,
              "summary": "Verify the configured email provider with a test send",
              "payload_shape": [
                "to"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/providers"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/quiet-hours",
              "requiresAuth": true,
              "summary": "Set nightly 22:00-06:00 PT quiet window",
              "payload_shape": [
                "dnd",
                "persona_id",
                "windows"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/send",
              "requiresAuth": true,
              "summary": "Send email notification with rendered body",
              "payload_shape": [
                "app_identity_id",
                "channel",
                "destination",
                "enforce_consent",
                "honor_quiet_hours",
                "locale",
                "payload",
                "person_id",
                "scheduled_at",
                "template_code",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "whatsapp",
                  "push",
                  "slack"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/templates"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/send-to-audience",
              "requiresAuth": true,
              "summary": "Send to a role audience under a delegated decision",
              "payload_shape": [
                "audience",
                "authorization",
                "body",
                "channels",
                "subject",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/send-window",
              "requiresAuth": true,
              "summary": "Ask whether an email send is open for a tenant and purpose",
              "payload_shape": [
                "channel",
                "purpose",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "whatsapp",
                  "push",
                  "slack"
                ],
                "policy_source": [
                  "tenant",
                  "platform",
                  "builtin"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/send-window/bulk",
              "requiresAuth": true,
              "summary": "Two channels for one tenant, plus one item with an unsupported channel",
              "payload_shape": [
                "items"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "whatsapp",
                  "push",
                  "slack"
                ],
                "policy_source": [
                  "tenant",
                  "platform",
                  "builtin"
                ],
                "error_code": [
                  "VALIDATION_ERROR"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/notifications/sms-consent",
              "requiresAuth": true,
              "summary": "List consent states",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "opted_in",
                  "opted_out"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/sms-consent"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/sms-consent",
              "requiresAuth": true,
              "summary": "Opt a number out (STOP)",
              "payload_shape": [
                "action",
                "phone",
                "purpose",
                "source",
                "tenant_id"
              ],
              "fieldEnums": {
                "action": [
                  "opt_out",
                  "opt_in"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/notifications/sms-inbound",
              "requiresAuth": true,
              "summary": "List inbound SMS",
              "payload_shape": [],
              "fieldEnums": {
                "intent": [
                  "opt_out",
                  "opt_in",
                  "help",
                  "none"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/notifications/webhooks/sms/inbound"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/sms-settings",
              "requiresAuth": true,
              "summary": "Set the HELP auto-reply",
              "payload_shape": [
                "help_reply",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/templates",
              "requiresAuth": true,
              "summary": "Register a tenant-scoped email template",
              "payload_shape": [
                "channel",
                "code",
                "locale_bundles",
                "required_consent_purpose",
                "version"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "whatsapp",
                  "push",
                  "slack"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/webhooks/delivery/:provider",
              "requiresAuth": false,
              "summary": "Twilio delivered callback (unmatched id handled gracefully)",
              "payload_shape": [
                "MessageSid",
                "MessageStatus",
                "To"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/notifications/webhooks/sms/inbound",
              "requiresAuth": false,
              "summary": "Inbound STOP opts the number out",
              "payload_shape": [
                "Body",
                "From",
                "MessageSid",
                "To"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-offer-catalog",
          "group": "Outreach & Communication",
          "summary": "Offers, quotes, pricing, feature-status matrix, publish gating",
          "reuse_when": [
            "offer",
            "quote",
            "pricing",
            "catalog",
            "proposal",
            "package",
            "plan"
          ],
          "api_count": 13,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-offer-catalog",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/offers",
              "requiresAuth": true,
              "summary": "Create an offer",
              "payload_shape": [
                "description",
                "name",
                "slug",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/offers/:offer_id",
              "requiresAuth": true,
              "summary": "Fetch the offer just created",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/offers/:offer_id/check-reference",
              "requiresAuth": true,
              "summary": "Current reference is not stale",
              "payload_shape": [
                "offer_version_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/offers/:offer_id/current",
              "requiresAuth": true,
              "summary": "Resolve current (live after activate)",
              "payload_shape": [],
              "fieldEnums": {
                "source": [
                  "live",
                  "beta",
                  "draft",
                  "none"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions/:version_id/activate"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/offers/:offer_id/version-stamp",
              "requiresAuth": true,
              "summary": "Stamp the current version",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/offers/:offer_id/versions",
              "requiresAuth": true,
              "summary": "List the versions of the offer just created",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/offers/:offer_id/versions",
              "requiresAuth": true,
              "summary": "Create a draft version",
              "payload_shape": [
                "body",
                "currency",
                "price",
                "tenant_id",
                "title",
                "version"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/offers/:offer_id/versions/:version_id",
              "requiresAuth": true,
              "summary": "Fetch the version just created",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/offers/:offer_id/versions/:version_id/activate",
              "requiresAuth": true,
              "summary": "Activate the draft version",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/offers/:offer_id/versions/:version_id/features",
              "requiresAuth": true,
              "summary": "List the feature matrix",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "included",
                  "excluded",
                  "beta",
                  "roadmap",
                  "add_on",
                  "deprecated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions",
                "POST /api/offers/:offer_id/versions/:version_id/features"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/offers/:offer_id/versions/:version_id/features",
              "requiresAuth": true,
              "summary": "Mark a feature included",
              "payload_shape": [
                "feature_key",
                "name",
                "sort_order",
                "status",
                "tenant_id",
                "value"
              ],
              "fieldEnums": {
                "status": [
                  "included",
                  "excluded",
                  "beta",
                  "roadmap",
                  "add_on",
                  "deprecated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/offers/:offer_id/versions/:version_id/publish-decision",
              "requiresAuth": true,
              "summary": "Approve the publish request",
              "payload_shape": [
                "decision",
                "tenant_id"
              ],
              "fieldEnums": {
                "decision": [
                  "approved",
                  "rejected"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions",
                "POST /api/offers/:offer_id/versions/:version_id/publish-request"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/offers/:offer_id/versions/:version_id/publish-request",
              "requiresAuth": true,
              "summary": "Request publish approval",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/offers",
                "POST /api/offers/:offer_id/versions"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-scheduling",
          "group": "Outreach & Communication",
          "summary": "Calendar, appointments, availability, booking, no-show, public booking links",
          "reuse_when": [
            "scheduling",
            "appointment",
            "booking",
            "calendar",
            "availability",
            "meeting",
            "no-show",
            "reschedule"
          ],
          "api_count": 31,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-scheduling",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/scheduling/appointments",
              "requiresAuth": true,
              "summary": "List appointments for a host",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "pending",
                  "confirmed",
                  "cancelled",
                  "completed",
                  "no_show"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments",
              "requiresAuth": true,
              "summary": "Book a 30-minute confirmed appointment",
              "payload_shape": [
                "attendees",
                "description",
                "end_time",
                "entity_ref",
                "host_persona_id",
                "location_detail",
                "location_type",
                "meeting_type_id",
                "meeting_url",
                "notes",
                "source",
                "start_time",
                "subject_persona_id",
                "tenant_id",
                "timezone",
                "title"
              ],
              "fieldEnums": {
                "status": [
                  "pending",
                  "confirmed",
                  "cancelled",
                  "completed",
                  "no_show"
                ],
                "location_type": [
                  "video",
                  "phone",
                  "in_person",
                  "custom"
                ],
                "source": [
                  "internal",
                  "public_link",
                  "sequence",
                  "import",
                  "provider_sync"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/appointments/:appointment_id",
              "requiresAuth": true,
              "summary": "Get a booked appointment by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments/:appointment_id/calendar-push",
              "requiresAuth": true,
              "summary": "Push appointment to Google",
              "payload_shape": [
                "connection_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments",
                "POST /api/scheduling/calendar-connections"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments/:appointment_id/cancel",
              "requiresAuth": true,
              "summary": "Cancel the appointment",
              "payload_shape": [
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments/:appointment_id/confirm",
              "requiresAuth": true,
              "summary": "Confirm the appointment",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/appointments/:appointment_id/events",
              "requiresAuth": true,
              "summary": "List booking events",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/appointments/:appointment_id/ics",
              "requiresAuth": true,
              "summary": "Download the ICS invite",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments/:appointment_id/rebook",
              "requiresAuth": true,
              "summary": "Rebook 3h later",
              "payload_shape": [
                "end_time",
                "start_time",
                "tenant_id",
                "timezone"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/appointments/:appointment_id/reminders",
              "requiresAuth": true,
              "summary": "List reminders",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments/:appointment_id/reminders",
              "requiresAuth": true,
              "summary": "Schedule 24h/2h/15m reminders",
              "payload_shape": [
                "offsets_minutes",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/appointments/:appointment_id/reschedule",
              "requiresAuth": true,
              "summary": "Reschedule 2h later",
              "payload_shape": [
                "end_time",
                "start_time",
                "tenant_id",
                "timezone"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/appointments"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/availability",
              "requiresAuth": true,
              "summary": "Get availability for a host on a date for a meeting type",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/availability-rules"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/availability-rules",
              "requiresAuth": true,
              "summary": "List the availability rules for the host just configured",
              "payload_shape": [],
              "fieldEnums": {
                "weekday": [
                  "0",
                  "1",
                  "2",
                  "3",
                  "4",
                  "5",
                  "6"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/availability-rules"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/availability-rules",
              "requiresAuth": true,
              "summary": "Set Monday 09:00-17:00 America/New_York availability",
              "payload_shape": [
                "end_time",
                "host_persona_id",
                "is_active",
                "slot_interval_minutes",
                "start_time",
                "tenant_id",
                "timezone",
                "weekday"
              ],
              "fieldEnums": {
                "weekday": [
                  0,
                  1,
                  2,
                  3,
                  4,
                  5,
                  6
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/calendar-connections",
              "requiresAuth": true,
              "summary": "List connections",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/calendar-connections"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/calendar-connections",
              "requiresAuth": true,
              "summary": "Connect a Google calendar",
              "payload_shape": [
                "connector_install_id",
                "direction",
                "external_calendar_id",
                "host_persona_id",
                "metadata",
                "provider",
                "tenant_id"
              ],
              "fieldEnums": {
                "provider": [
                  "google",
                  "microsoft",
                  "caldav"
                ],
                "direction": [
                  "inbound",
                  "outbound",
                  "both"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/calendar-connections/:connection_id",
              "requiresAuth": true,
              "summary": "Get a connection by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/calendar-connections"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/calendar-connections/:connection_id/sync",
              "requiresAuth": true,
              "summary": "Sync the connection",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/calendar-connections"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/meeting-types",
              "requiresAuth": true,
              "summary": "List meeting types for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/meeting-types"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/meeting-types",
              "requiresAuth": true,
              "summary": "Create a 30-minute discovery call meeting type",
              "payload_shape": [
                "buffer_after_minutes",
                "buffer_before_minutes",
                "description",
                "duration_minutes",
                "host_persona_id",
                "location_detail",
                "location_type",
                "metadata",
                "name",
                "slug",
                "tenant_id"
              ],
              "fieldEnums": {
                "location_type": [
                  "video",
                  "phone",
                  "in_person",
                  "custom"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/no-show/scan",
              "requiresAuth": true,
              "summary": "Run a no-show scan",
              "payload_shape": [
                "batch_size",
                "grace_minutes"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/public/appointments/:public_token/cancel",
              "requiresAuth": false,
              "summary": "Invitee cancels their booking with their token",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {
                "status": [
                  "pending",
                  "confirmed",
                  "cancelled",
                  "completed",
                  "no_show"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/scheduling-links",
                "POST /api/scheduling/public/links/:slug/book",
                "POST /api/scheduling/public/appointments/:public_token/confirm"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/public/appointments/:public_token/confirm",
              "requiresAuth": false,
              "summary": "Invitee confirms the pending booking with their token",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "pending",
                  "confirmed",
                  "cancelled",
                  "completed",
                  "no_show"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/scheduling-links",
                "POST /api/scheduling/public/links/:slug/book"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/public/links/:slug",
              "requiresAuth": false,
              "summary": "Anonymous visitor loads the booking page for a live link",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/scheduling-links"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/public/links/:slug/availability",
              "requiresAuth": false,
              "summary": "Anonymous visitor lists open slots for a date inside the window",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/availability-rules",
                "POST /api/scheduling/scheduling-links"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/public/links/:slug/book",
              "requiresAuth": false,
              "summary": "Prospect books a slot through the public link",
              "payload_shape": [
                "end_time",
                "invitee_email",
                "invitee_name",
                "notes",
                "start_time",
                "timezone"
              ],
              "fieldEnums": {
                "status": [
                  "pending",
                  "confirmed",
                  "cancelled",
                  "completed",
                  "no_show"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/meeting-types",
                "POST /api/scheduling/scheduling-links"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/reminders/tick",
              "requiresAuth": true,
              "summary": "Run a reminder tick",
              "payload_shape": [
                "batch_size"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/scheduling-links",
              "requiresAuth": true,
              "summary": "List scheduling links",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/scheduling-links"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/scheduling/scheduling-links",
              "requiresAuth": true,
              "summary": "Create a booking link",
              "payload_shape": [
                "description",
                "expires_at",
                "host_persona_id",
                "max_days_ahead",
                "meeting_type_id",
                "min_notice_minutes",
                "slug",
                "tenant_id",
                "title"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/scheduling/meeting-types"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/scheduling/scheduling-links/:link_id",
              "requiresAuth": true,
              "summary": "Get a booking link by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/scheduling/scheduling-links"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-sequence",
          "group": "Outreach & Communication",
          "summary": "Multi-touch outreach sequences/cadences: steps, enrollment, advancement",
          "reuse_when": [
            "sequence",
            "cadence",
            "drip",
            "outreach",
            "follow-up",
            "multi-touch",
            "enrollment"
          ],
          "api_count": 12,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-sequence",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/sequence-templates",
              "requiresAuth": true,
              "summary": "Create an email welcome template",
              "payload_shape": [
                "body",
                "category",
                "channel",
                "name",
                "subject",
                "tenant_id",
                "variables"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "call",
                  "linkedin",
                  "task"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sequences",
              "requiresAuth": true,
              "summary": "List every sequence in the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sequences"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences",
              "requiresAuth": true,
              "summary": "Create a lead welcome cadence",
              "payload_shape": [
                "description",
                "is_default",
                "metadata",
                "name",
                "sequence_type",
                "tenant_id"
              ],
              "fieldEnums": {
                "sequence_type": [
                  "lead",
                  "customer",
                  "onboarding",
                  "nurture",
                  "custom"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sequences/:sequence_id",
              "requiresAuth": true,
              "summary": "Get the created sequence",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sequences"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/:sequence_id/enroll",
              "requiresAuth": true,
              "summary": "Enroll a persona into the sequence",
              "payload_shape": [
                "event_type",
                "subject_persona_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "event_type": [
                  "form_submit",
                  "reply",
                  "stage_change",
                  "manual",
                  "booking",
                  "tag_added"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/sequences",
                "POST /api/sequences/:sequence_id/steps"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/:sequence_id/steps",
              "requiresAuth": true,
              "summary": "Add step 1 (email, 60s delay)",
              "payload_shape": [
                "action",
                "body",
                "channel",
                "delay_seconds",
                "schedule_mode",
                "send_mode",
                "step_number",
                "subject",
                "template_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "channel": [
                  "email",
                  "sms",
                  "call",
                  "linkedin",
                  "task",
                  "wait"
                ],
                "action": [
                  "send",
                  "wait",
                  "book",
                  "task",
                  "branch"
                ],
                "schedule_mode": [
                  "delay",
                  "absolute",
                  "immediate"
                ],
                "send_mode": [
                  "individual",
                  "bulk"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sequences",
                "POST /api/sequence-templates"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/:sequence_id/triggers",
              "requiresAuth": true,
              "summary": "Enroll on form submission",
              "payload_shape": [
                "condition_json",
                "enabled",
                "event_type",
                "tenant_id",
                "trigger_on"
              ],
              "fieldEnums": {
                "event_type": [
                  "form_submit",
                  "reply",
                  "stage_change",
                  "manual",
                  "booking",
                  "tag_added"
                ],
                "trigger_on": [
                  "enter",
                  "exit"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sequences"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/enrollments/:enrollment_id/control",
              "requiresAuth": true,
              "summary": "Pause the enrollment on inbound reply",
              "payload_shape": [
                "action",
                "event",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {
                "action": [
                  "pause",
                  "resume",
                  "stop",
                  "replace_cta"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/sequences",
                "POST /api/sequences/:sequence_id/steps",
                "POST /api/sequences/:sequence_id/enroll"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/guards/check",
              "requiresAuth": true,
              "summary": "Fresh subject is allowed",
              "payload_shape": [
                "channel",
                "subject_persona_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sequences/guards/log",
              "requiresAuth": true,
              "summary": "List the tenant's guard log (empty is valid)",
              "payload_shape": [],
              "fieldEnums": {
                "decision": [
                  "allow",
                  "block"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/guards/outcome",
              "requiresAuth": true,
              "summary": "Record a successful send (breaker stays closed)",
              "payload_shape": [
                "channel",
                "success",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sequences/tick",
              "requiresAuth": true,
              "summary": "Run a tick (nothing due -> zero counts)",
              "payload_shape": [
                "batch_size"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "CRM & Engagement",
      "sdk_count": 10,
      "api_count": 119,
      "sdks": [
        {
          "sdk": "sdk-campaign",
          "group": "CRM & Engagement",
          "summary": "Marketing campaigns and membership",
          "reuse_when": [
            "campaign",
            "marketing",
            "blast",
            "audience",
            "segment"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-campaign",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/campaigns",
              "requiresAuth": true,
              "summary": "Create a marketing campaign for the signed-up tenant",
              "payload_shape": [
                "name",
                "tenant_id",
                "variant_flag_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "PUT /api/flags"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/campaigns/:campaign_id/journeys",
              "requiresAuth": true,
              "summary": "Define a two-step journey (delay then notification)",
              "payload_shape": [
                "steps"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/campaigns"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/campaigns/:campaign_id/segments",
              "requiresAuth": true,
              "summary": "Upsert a segment whose DSL targets the tenant population",
              "payload_shape": [
                "dsl"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/campaigns"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/campaigns/journeys/:journey_id/runs",
              "requiresAuth": true,
              "summary": "Start a journey run for a subject persona",
              "payload_shape": [
                "subject_persona_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/campaigns",
                "POST /api/campaigns/:campaign_id/journeys",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/campaigns/runs/:run_id/advance",
              "requiresAuth": true,
              "summary": "Advance a journey run by one step",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/campaigns",
                "POST /api/campaigns/:campaign_id/journeys",
                "POST /api/personas",
                "POST /api/campaigns/journeys/:journey_id/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/campaigns/segments/:segment_id/compute",
              "requiresAuth": true,
              "summary": "Recompute a segment's population estimate",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/campaigns",
                "POST /api/campaigns/:campaign_id/segments"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-content",
          "group": "CRM & Engagement",
          "summary": "Content items, templates, and rendering",
          "reuse_when": [
            "content",
            "template",
            "cms",
            "copy"
          ],
          "api_count": 7,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-content",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/content/items",
              "requiresAuth": true,
              "summary": "Create a draft article content item",
              "payload_shape": [
                "owner_persona_id",
                "slug",
                "tenant_id",
                "type_code"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "published",
                  "archived"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/content/items/:item_id",
              "requiresAuth": true,
              "summary": "Fetch a content item by id",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "draft",
                  "published",
                  "archived"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/content/items"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/content/items/:item_id/archive",
              "requiresAuth": true,
              "summary": "Archive a draft content item",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "draft",
                  "published",
                  "archived"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/content/items"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/content/items/:item_id/versions",
              "requiresAuth": true,
              "summary": "List versions for a content item",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/content/items"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/content/items/:item_id/versions",
              "requiresAuth": true,
              "summary": "Create a content version with body, media and tags",
              "payload_shape": [
                "media_refs",
                "payload",
                "taxonomy_tags"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/content/items"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/content/items/:item_id/versions/:version_id/publish",
              "requiresAuth": true,
              "summary": "Publish a version on behalf of the signed-up user",
              "payload_shape": [
                "published_by"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "published",
                  "archived"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/content/items",
                "POST /api/content/items/:item_id/versions"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/content/taxonomies",
              "requiresAuth": true,
              "summary": "Upsert a tenant taxonomy with a small structure tree",
              "payload_shape": [
                "name",
                "structure",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-coverage",
          "group": "CRM & Engagement",
          "summary": "Who is available to take work: schedules, PTO, holidays, on-call and capacity",
          "reuse_when": [
            "coverage",
            "availability",
            "pto",
            "on-call",
            "capacity",
            "who is working",
            "holiday",
            "out of office",
            "shift"
          ],
          "api_count": 16,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-coverage",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/coverage/backup-designations",
              "requiresAuth": true,
              "summary": "List every backup designation in the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/backup-designations"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/coverage/backup-designations",
              "requiresAuth": true,
              "summary": "A backup with a five-minute acceptance window",
              "payload_shape": [
                "acceptance_window_minutes",
                "backup_persona_id",
                "primary_persona_id",
                "scope",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/capacity-policies",
              "requiresAuth": true,
              "summary": "List every capacity policy in the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/capacity-policies"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/coverage/capacity-policies",
              "requiresAuth": true,
              "summary": "Per-band limits with a reserved-headroom threshold",
              "payload_shape": [
                "daily_cap",
                "freeze_threshold",
                "freeze_threshold_by_band",
                "max_concurrent_by_band",
                "persona_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/eligible",
              "requiresAuth": true,
              "summary": "Ask who can act now, with reasons for those who cannot",
              "payload_shape": [],
              "fieldEnums": {
                "include_ineligible": [
                  "true",
                  "false"
                ],
                "ignore_presence": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/schedules",
                "PUT /api/coverage/presence"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/gaps",
              "requiresAuth": true,
              "summary": "Look ahead over the next week for tier 1",
              "payload_shape": [],
              "fieldEnums": {
                "tier": [
                  "1",
                  "2",
                  "3"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/on-call"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/holiday-calendars",
              "requiresAuth": true,
              "summary": "List every holiday calendar in the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/holiday-calendars"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/coverage/holiday-calendars",
              "requiresAuth": true,
              "summary": "A regional list with named owner",
              "payload_shape": [
                "dates",
                "maintained_by",
                "name",
                "region",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/on-call",
              "requiresAuth": true,
              "summary": "List every roster entry in the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/on-call"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/coverage/on-call",
              "requiresAuth": true,
              "summary": "Tier 1 for the coming week",
              "payload_shape": [
                "ends_at",
                "persona_id",
                "rotation_ref",
                "starts_at",
                "tenant_id",
                "tier"
              ],
              "fieldEnums": {
                "tier": [
                  "1",
                  "2",
                  "3"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/on-call/current",
              "requiresAuth": true,
              "summary": "Resolve the current audience for a rotation",
              "payload_shape": [],
              "fieldEnums": {
                "tier": [
                  "1",
                  "2",
                  "3"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/on-call"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/coverage/presence",
              "requiresAuth": true,
              "summary": "A manual claim of being available",
              "payload_shape": [
                "manual_hold_minutes",
                "persona_id",
                "source",
                "status",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "AVAILABLE",
                  "MEETING",
                  "OFFLINE",
                  "PTO",
                  "ON_CALL"
                ],
                "source": [
                  "MANUAL",
                  "CALENDAR",
                  "SYSTEM"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/schedules",
              "requiresAuth": true,
              "summary": "List every schedule in the tenant",
              "payload_shape": [],
              "fieldEnums": {
                "weekday": [
                  "0",
                  "1",
                  "2",
                  "3",
                  "4",
                  "5",
                  "6"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/schedules"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/coverage/schedules",
              "requiresAuth": true,
              "summary": "A weekday schedule in the persona own timezone",
              "payload_shape": [
                "iana_timezone",
                "persona_id",
                "tenant_id",
                "weekly_windows"
              ],
              "fieldEnums": {
                "weekday": [
                  "0",
                  "1",
                  "2",
                  "3",
                  "4",
                  "5",
                  "6"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/coverage/time-off",
              "requiresAuth": true,
              "summary": "List every time-off record in the tenant",
              "payload_shape": [],
              "fieldEnums": {
                "kind": [
                  "PTO",
                  "MEETING",
                  "OUTAGE",
                  "HOLIDAY"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/coverage/time-off"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/coverage/time-off",
              "requiresAuth": true,
              "summary": "A day of PTO",
              "payload_shape": [
                "ends_at",
                "kind",
                "persona_id",
                "reason",
                "starts_at",
                "tenant_id"
              ],
              "fieldEnums": {
                "kind": [
                  "PTO",
                  "MEETING",
                  "OUTAGE",
                  "HOLIDAY"
                ],
                "source": [
                  "MANUAL",
                  "CALENDAR",
                  "SYSTEM"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-crm",
          "group": "CRM & Engagement",
          "summary": "Contacts, deals, pipelines, and activities (canonical CRM)",
          "reuse_when": [
            "crm",
            "contact",
            "deal",
            "lead",
            "pipeline",
            "opportunity",
            "account",
            "activity"
          ],
          "api_count": 28,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-crm",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/crm/activities",
              "requiresAuth": true,
              "summary": "Log an activity inside an encounter (encounter_id + kind + actor_persona_id required)",
              "payload_shape": [
                "actor_persona_id",
                "encounter_id",
                "kind",
                "occurred_at",
                "summary"
              ],
              "fieldEnums": {
                "kind": [
                  "call",
                  "email",
                  "meeting",
                  "note",
                  "task",
                  "voicemail"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/vault/keys",
                "POST /api/encounters"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/activities/call",
              "requiresAuth": true,
              "summary": "Log an answered outbound call with recording consent",
              "payload_shape": [
                "actor_persona_id",
                "call_direction",
                "call_disposition",
                "call_duration_seconds",
                "encounter_id",
                "external_call_id",
                "occurred_at",
                "phone_number",
                "recording_consent",
                "recording_url",
                "summary"
              ],
              "fieldEnums": {
                "call_direction": [
                  "inbound",
                  "outbound"
                ],
                "call_disposition": [
                  "answered",
                  "no_answer",
                  "busy",
                  "failed",
                  "voicemail",
                  "left_message"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/vault/keys",
                "POST /api/encounters"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/activities/calls",
              "requiresAuth": true,
              "summary": "Read the call timeline for the encounter",
              "payload_shape": [],
              "fieldEnums": {
                "kind": [
                  "call",
                  "voicemail"
                ],
                "call_disposition": [
                  "answered",
                  "no_answer",
                  "busy",
                  "failed",
                  "voicemail",
                  "left_message"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/crm/activities/call"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/activities/voicemail",
              "requiresAuth": true,
              "summary": "Log an outbound voicemail with transcript",
              "payload_shape": [
                "actor_persona_id",
                "call_direction",
                "call_disposition",
                "call_duration_seconds",
                "encounter_id",
                "external_call_id",
                "occurred_at",
                "phone_number",
                "recording_consent",
                "recording_url",
                "summary",
                "voicemail_transcript"
              ],
              "fieldEnums": {
                "call_direction": [
                  "inbound",
                  "outbound"
                ],
                "call_disposition": [
                  "voicemail",
                  "left_message"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/vault/keys",
                "POST /api/encounters"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/close-reasons",
              "requiresAuth": true,
              "summary": "Define a competitive-loss reason that demands a competitor and a learning note",
              "payload_shape": [
                "code",
                "label",
                "outcome_class",
                "reactivation_after_days",
                "reactivation_allowed",
                "requires_competitor",
                "requires_learning_note",
                "sort_order",
                "tenant_id"
              ],
              "fieldEnums": {
                "outcome_class": [
                  "won",
                  "lost",
                  "disqualified",
                  "paused"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/contacts",
              "requiresAuth": true,
              "summary": "Create persona-keyed contact (tenant_id + persona_id required)",
              "payload_shape": [
                "custom_fields",
                "external_refs",
                "lifecycle_stage",
                "owner_persona_id",
                "persona_id",
                "source",
                "tenant_id"
              ],
              "fieldEnums": {
                "lifecycle_stage": [
                  "lead",
                  "prospect",
                  "customer",
                  "churned",
                  "former"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/contacts/:contact_id",
              "requiresAuth": true,
              "summary": "Fetch an existing contact by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/crm/contacts"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/crm/contacts/:contact_id",
              "requiresAuth": true,
              "summary": "Update contact lifecycle_stage on an existing contact",
              "payload_shape": [
                "custom_fields",
                "external_refs",
                "lifecycle_stage",
                "owner_persona_id"
              ],
              "fieldEnums": {
                "lifecycle_stage": [
                  "lead",
                  "prospect",
                  "customer",
                  "churned",
                  "former"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/crm/contacts"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/deals",
              "requiresAuth": true,
              "summary": "List deals for a tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/deals",
              "requiresAuth": true,
              "summary": "Create deal on an encounter (tenant_id + encounter_id + name required)",
              "payload_shape": [
                "amount",
                "close_probability",
                "contact_id",
                "currency",
                "custom_fields",
                "encounter_id",
                "external_refs",
                "name",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/crm/contacts",
                "POST /api/vault/keys",
                "POST /api/encounters"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/deals/:deal_id",
              "requiresAuth": true,
              "summary": "Get the created deal",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/crm/contacts",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/crm/deals"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/crm/deals/:deal_id",
              "requiresAuth": true,
              "summary": "Enrich the deal (priority/fit/forecast)",
              "payload_shape": [
                "close_probability",
                "fit",
                "forecast",
                "impact",
                "outcome",
                "pain",
                "priority",
                "stakeholders",
                "tenant_id"
              ],
              "fieldEnums": {
                "priority": [
                  "low",
                  "medium",
                  "high",
                  "critical"
                ],
                "fit": [
                  "poor",
                  "moderate",
                  "strong",
                  "ideal"
                ],
                "forecast": [
                  "omitted",
                  "pipeline",
                  "best_case",
                  "commit",
                  "closed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/crm/contacts",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/crm/deals"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/deals/:deal_id/next-action",
              "requiresAuth": true,
              "summary": "Get the open next action",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/crm/deals",
                "POST /api/crm/deals/:deal_id/next-action"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/deals/:deal_id/next-action",
              "requiresAuth": true,
              "summary": "Set a follow-up call as the next action",
              "payload_shape": [
                "action_type",
                "due_at",
                "owner_persona_id",
                "purpose",
                "tenant_id"
              ],
              "fieldEnums": {
                "action_type": [
                  "call",
                  "email",
                  "meeting",
                  "task",
                  "linkedin",
                  "sms",
                  "proposal",
                  "other"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/crm/deals"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/deals/:deal_id/next-action/complete",
              "requiresAuth": true,
              "summary": "Complete the next action",
              "payload_shape": [
                "outcome",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/crm/deals",
                "POST /api/crm/deals/:deal_id/next-action",
                "GET /api/crm/deals/:deal_id/next-action"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/deals/:deal_id/save-gate",
              "requiresAuth": true,
              "summary": "Save-gate allows (open next action present)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/crm/deals",
                "POST /api/crm/deals/:deal_id/next-action"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/deals/:deal_id/stage-guard",
              "requiresAuth": true,
              "summary": "Guard allows qualifying -> proposal",
              "payload_shape": [],
              "fieldEnums": {
                "to_stage": [
                  "qualifying",
                  "proposal",
                  "negotiation",
                  "closed-won",
                  "closed-lost"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/crm/deals"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/deals/:deal_id/transition",
              "requiresAuth": true,
              "summary": "Transition an existing deal to a valid stage",
              "payload_shape": [
                "stage"
              ],
              "fieldEnums": {
                "stage": [
                  "qualifying",
                  "proposal",
                  "negotiation",
                  "closed-won",
                  "closed-lost"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/crm/contacts",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/crm/deals"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/funnel-stages",
              "requiresAuth": true,
              "summary": "List funnel stages",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/funnel-stages",
              "requiresAuth": true,
              "summary": "Create a Discovery stage",
              "payload_shape": [
                "criteria",
                "description",
                "is_default",
                "is_terminal",
                "is_won",
                "name",
                "probability",
                "sort_order",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/next-actions/:id/reschedule",
              "requiresAuth": true,
              "summary": "Push the date with a reason on the record",
              "payload_shape": [
                "approved_by",
                "new_due_at",
                "pushed_by",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/crm/subjects/:subject_ref/next-action"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/next-actions/overdue",
              "requiresAuth": true,
              "summary": "Read the overdue queue for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/crm/subjects/:subject_ref/next-action"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/pipeline/aging",
              "requiresAuth": true,
              "summary": "Read the aging report for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/pipeline/board",
              "requiresAuth": true,
              "summary": "Get the pipeline board",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/pipeline/stale",
              "requiresAuth": true,
              "summary": "List stale deals",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/subjects/:subject_ref/next-action",
              "requiresAuth": true,
              "summary": "Read the action just committed",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/crm/subjects/:subject_ref/next-action"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/crm/subjects/:subject_ref/next-action",
              "requiresAuth": true,
              "summary": "Commit a call with all five elements of the commitment",
              "payload_shape": [
                "action_type",
                "due_at",
                "intended_outcome",
                "owner_persona_id",
                "purpose",
                "tenant_id"
              ],
              "fieldEnums": {
                "action_type": [
                  "call",
                  "email",
                  "meeting",
                  "task",
                  "linkedin",
                  "sms",
                  "proposal",
                  "other"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/crm/subjects/:subject_ref/save-gate",
              "requiresAuth": true,
              "summary": "Allowed once a complete action is committed",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/crm/subjects/:subject_ref/next-action"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-engagement",
          "group": "CRM & Engagement",
          "summary": "Engagement events/timeline across channels",
          "reuse_when": [
            "engagement",
            "timeline",
            "interaction",
            "activity",
            "touchpoint"
          ],
          "api_count": 10,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-engagement",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/encounters",
              "requiresAuth": true,
              "summary": "Open an encounter (issues per-encounter Vault key)",
              "payload_shape": [
                "address_id",
                "billing_ref",
                "kind",
                "parent_encounter_id",
                "parent_key_id",
                "region",
                "retention_policy",
                "tenant_id"
              ],
              "fieldEnums": {
                "kind": [
                  "visit",
                  "order",
                  "deal",
                  "session",
                  "capital-call",
                  "support"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/encounters/:encounter_id",
              "requiresAuth": true,
              "summary": "Fetch an encounter by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/encounters/:encounter_id/grants",
              "requiresAuth": true,
              "summary": "List active grants for an encounter",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/encounters/:encounter_id/grants",
              "requiresAuth": true,
              "summary": "Issue a scope-bounded encounter grant",
              "payload_shape": [
                "capability_token_ref",
                "grantee_persona_id",
                "issuer_persona_id",
                "scope",
                "ttl_ms"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/encounters/:encounter_id/grants/check",
              "requiresAuth": true,
              "summary": "Check whether a grantee may call a method",
              "payload_shape": [
                "grantee_persona_id",
                "method"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/encounters/:encounter_id/participants",
              "requiresAuth": true,
              "summary": "List participants for an encounter",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/encounters/:encounter_id/participants",
              "requiresAuth": true,
              "summary": "Add a participant persona to the encounter",
              "payload_shape": [
                "persona_id",
                "required",
                "role"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/encounters/:encounter_id/transition",
              "requiresAuth": true,
              "summary": "Transition the encounter open -> in-progress",
              "payload_shape": [
                "actor_id",
                "to"
              ],
              "fieldEnums": {
                "to": [
                  "open",
                  "in-progress",
                  "closed",
                  "sealed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/grants/:grant_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke an active encounter grant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/personas",
                "POST /api/encounters/:encounter_id/grants"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/participants/:participant_id/leave",
              "requiresAuth": true,
              "summary": "A participant leaves the encounter (sets left_at)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys",
                "POST /api/personas",
                "POST /api/encounters",
                "POST /api/encounters/:encounter_id/participants"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-event",
          "group": "CRM & Engagement",
          "summary": "Domain event store / event sourcing",
          "reuse_when": [
            "event",
            "event store",
            "domain event",
            "stream"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-event",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/events/checkin",
              "requiresAuth": true,
              "summary": "Check in an issued ticket via its qr_token",
              "payload_shape": [
                "checked_in_by_persona_id",
                "device_uuid",
                "qr_token"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/events/sessions",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/events/tickets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/events/sessions",
              "requiresAuth": true,
              "summary": "Create an event session under an encounter",
              "payload_shape": [
                "address_id",
                "capacity",
                "encounter_id",
                "ends_at",
                "starts_at",
                "tenant_id",
                "title"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys",
                "POST /api/encounters"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/events/sessions/:session_id",
              "requiresAuth": true,
              "summary": "Fetch a session by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/events/sessions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/events/tickets",
              "requiresAuth": true,
              "summary": "Issue a ticket for a session",
              "payload_shape": [
                "holder_persona_id",
                "price",
                "session_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys",
                "POST /api/encounters",
                "POST /api/events/sessions",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-lead-scoring",
          "group": "CRM & Engagement",
          "summary": "Lead scoring models, scoring, and next-best-action",
          "reuse_when": [
            "lead scoring",
            "score",
            "ml model",
            "next best action",
            "prioritize",
            "ranking",
            "firmographic",
            "intent signal",
            "company size",
            "b2b features",
            "prioritise leads"
          ],
          "api_count": 9,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-lead-scoring",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/lead-scoring/models",
              "requiresAuth": true,
              "summary": "Create an active lead-scoring model for (tenant, vertical)",
              "payload_shape": [
                "activate",
                "feature_set",
                "tenant_id",
                "vertical",
                "weights"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/lead-scoring/models/:id",
              "requiresAuth": true,
              "summary": "Fetch a model by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/lead-scoring/models/:id/activate",
              "requiresAuth": true,
              "summary": "Activate a model (flip status to active)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/lead-scoring/models/:id/retire",
              "requiresAuth": true,
              "summary": "Retire a model (flip status to retired)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/lead-scoring/models/:id/weights",
              "requiresAuth": true,
              "summary": "List feature weights for a model",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/lead-scoring/models/:id/weights/:feature",
              "requiresAuth": true,
              "summary": "Tune one feature weight (upsert)",
              "payload_shape": [
                "weight"
              ],
              "fieldEnums": {
                "feature": [
                  "proximity",
                  "expertise",
                  "intent",
                  "storm_impact"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/lead-scoring/models/active",
              "requiresAuth": true,
              "summary": "Look up the active model for (tenant, vertical)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models",
                "POST /api/lead-scoring/models/:id/activate"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/lead-scoring/next-best-action",
              "requiresAuth": true,
              "summary": "Score + recommend next best action against the active model",
              "payload_shape": [
                "contact_id",
                "expertise",
                "intent",
                "proximity",
                "storm_impact",
                "tenant_id",
                "trace_id",
                "vertical"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models",
                "POST /api/lead-scoring/models/:id/activate"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/lead-scoring/score",
              "requiresAuth": true,
              "summary": "Score a contact against the active model (happy path)",
              "payload_shape": [
                "contact_id",
                "expertise",
                "intent",
                "proximity",
                "storm_impact",
                "tenant_id",
                "trace_id",
                "vertical"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/lead-scoring/models",
                "POST /api/lead-scoring/models/:id/activate"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-service-request",
          "group": "CRM & Engagement",
          "summary": "Service requests / support tickets",
          "reuse_when": [
            "service request",
            "ticket",
            "support",
            "case",
            "request"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-service-request",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/service-request/queues",
              "requiresAuth": true,
              "summary": "Create a service-request queue (tenant_id + name required)",
              "payload_shape": [
                "name",
                "priority",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/service-request/tickets",
              "requiresAuth": true,
              "summary": "Open a ticket (tenant_id + encounter_id + requester_persona_id required)",
              "payload_shape": [
                "encounter_id",
                "external_refs",
                "priority",
                "queue_id",
                "requester_persona_id",
                "severity",
                "tenant_id"
              ],
              "fieldEnums": {
                "priority": [
                  "low",
                  "normal",
                  "high",
                  "urgent"
                ],
                "severity": [
                  "trivial",
                  "minor",
                  "major",
                  "critical"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/encounters",
                "POST /api/service-request/queues"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/service-request/tickets/:ticket_id",
              "requiresAuth": true,
              "summary": "Fetch a ticket by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/service-request/tickets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/service-request/tickets/:ticket_id/assign",
              "requiresAuth": true,
              "summary": "Assign an existing ticket to a persona (assignee_persona_id required)",
              "payload_shape": [
                "assignee_persona_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/service-request/tickets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/service-request/tickets/:ticket_id/transition",
              "requiresAuth": true,
              "summary": "Transition a new ticket to in-progress (valid transition from default status 'new')",
              "payload_shape": [
                "to"
              ],
              "fieldEnums": {
                "to": [
                  "new",
                  "in-progress",
                  "awaiting-customer",
                  "resolved",
                  "closed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/service-request/tickets"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-sla",
          "group": "CRM & Engagement",
          "summary": "Service-level clocks: targets, business hours, pause/resume, breach and escalation",
          "reuse_when": [
            "sla",
            "response time",
            "escalation",
            "business hours",
            "breach",
            "time to first response",
            "due by",
            "overdue"
          ],
          "api_count": 30,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-sla",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/sla/at-risk",
              "requiresAuth": true,
              "summary": "Everything due within two hours, overdue included",
              "payload_shape": [],
              "fieldEnums": {
                "severity": [
                  "info",
                  "warning",
                  "urgent",
                  "critical"
                ],
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ],
                "include_overdue": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/attainment",
              "requiresAuth": true,
              "summary": "Attainment for the last thirty days across every dimension",
              "payload_shape": [],
              "fieldEnums": {
                "dimensions": [
                  "source",
                  "owner",
                  "day",
                  "hour",
                  "reason",
                  "policy"
                ],
                "reason_code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ],
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/satisfy"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/breach-reasons",
              "requiresAuth": true,
              "summary": "Read the taxonomy",
              "payload_shape": [],
              "fieldEnums": {
                "code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ],
                "category": [
                  "capacity",
                  "process",
                  "external"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/breach-reasons"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/breach-reasons",
              "requiresAuth": true,
              "summary": "Give the auto-registered code a label and a category",
              "payload_shape": [
                "category",
                "code",
                "label",
                "tenant_id"
              ],
              "fieldEnums": {
                "code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ],
                "category": [
                  "capacity",
                  "process",
                  "external"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/breach-scan",
              "requiresAuth": true,
              "summary": "Scan the tenant — the ten-day-old clock is well past due",
              "payload_shape": [
                "actor_id",
                "limit",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "GET /api/sla/at-risk"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/breaches",
              "requiresAuth": true,
              "summary": "List every recorded miss for this tenant",
              "payload_shape": [],
              "fieldEnums": {
                "reason_code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ],
                "unrecovered_only": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/breach"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/breaches/:breach_id",
              "requiresAuth": true,
              "summary": "Read the breach recorded above",
              "payload_shape": [],
              "fieldEnums": {
                "reason_code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/breach"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/breaches/:breach_id/recovery",
              "requiresAuth": true,
              "summary": "The backup answered the next morning",
              "payload_shape": [
                "recovered_by",
                "recovery_action",
                "tenant_id"
              ],
              "fieldEnums": {
                "reason_code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/breach"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/calendars",
              "requiresAuth": true,
              "summary": "List the active calendars for this tenant",
              "payload_shape": [],
              "fieldEnums": {
                "weekend_rule": [
                  "saturday_sunday",
                  "friday_saturday",
                  "sunday_only",
                  "none"
                ],
                "is_active": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/calendars"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/calendars",
              "requiresAuth": true,
              "summary": "A Monday-to-Friday calendar in a named zone with a late-coverage extension",
              "payload_shape": [
                "description",
                "holiday_dates",
                "late_coverage_extension_minutes",
                "metadata",
                "name",
                "slug",
                "tenant_id",
                "timezone",
                "weekend_rule",
                "working_windows"
              ],
              "fieldEnums": {
                "weekend_rule": [
                  "saturday_sunday",
                  "friday_saturday",
                  "sunday_only",
                  "none"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/calendars/:calendar_id",
              "requiresAuth": true,
              "summary": "Read the calendar created above",
              "payload_shape": [],
              "fieldEnums": {
                "weekend_rule": [
                  "saturday_sunday",
                  "friday_saturday",
                  "sunday_only",
                  "none"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/calendars"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/clocks",
              "requiresAuth": true,
              "summary": "List the running clocks for this tenant",
              "payload_shape": [],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks",
              "requiresAuth": true,
              "summary": "A signal that arrived ten days ago — long past its two-hour promise",
              "payload_shape": [
                "actor_id",
                "metadata",
                "owner_ref",
                "policy_id",
                "source_timestamp",
                "subject_ref",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/policies"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/clocks/:clock_id",
              "requiresAuth": true,
              "summary": "Read the overdue clock created above",
              "payload_shape": [],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/:clock_id/breach",
              "requiresAuth": true,
              "summary": "Explain the miss: nobody was available on the roster",
              "payload_shape": [
                "actor_id",
                "is_systemic",
                "metadata",
                "reason_code",
                "reason_detail",
                "recorded_by",
                "source_ref",
                "tenant_id"
              ],
              "fieldEnums": {
                "reason_code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ],
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/breach-scan"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/:clock_id/cancel",
              "requiresAuth": true,
              "summary": "Cancel because the subject withdrew",
              "payload_shape": [
                "actor_id",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/clocks/:clock_id/firings",
              "requiresAuth": true,
              "summary": "Read the ledger for the ticked clock",
              "payload_shape": [],
              "fieldEnums": {
                "firing_state": [
                  "claimed",
                  "fired",
                  "failed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/tick"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/:clock_id/pause",
              "requiresAuth": true,
              "summary": "Pause on the one reason this policy allows",
              "payload_shape": [
                "actor_id",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ],
                "pause_reason": [
                  "awaiting_subject_reply"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/reassign"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/:clock_id/reassign",
              "requiresAuth": true,
              "summary": "Hand the overdue request to the backup owner",
              "payload_shape": [
                "actor_id",
                "owner_ref",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/:clock_id/resume",
              "requiresAuth": true,
              "summary": "Resume the paused clock",
              "payload_shape": [
                "actor_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/pause"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/:clock_id/satisfy",
              "requiresAuth": true,
              "summary": "Satisfy with an accepted evidence kind, a reference and a named actor",
              "payload_shape": [
                "actor_id",
                "evidence_count",
                "evidence_kind",
                "evidence_ref",
                "satisfied_by",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ],
                "evidence_kind": [
                  "outbound_reply",
                  "resolution"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/breaches/:breach_id/recovery"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/clocks/merge",
              "requiresAuth": true,
              "summary": "Merge the duplicate request into the original",
              "payload_shape": [
                "actor_id",
                "merged_clock_id",
                "surviving_clock_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "state": [
                  "running",
                  "paused",
                  "satisfied",
                  "breached",
                  "cancelled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/policies",
              "requiresAuth": true,
              "summary": "List active request policies",
              "payload_shape": [],
              "fieldEnums": {
                "is_active": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/policies"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/policies",
              "requiresAuth": true,
              "summary": "A two-hour response promise with one legal pause and a real satisfaction contract",
              "payload_shape": [
                "calendar_id",
                "description",
                "duration_minutes",
                "metadata",
                "name",
                "pause_conditions",
                "qualifying_predicate",
                "satisfaction_contract",
                "slug",
                "subject_kind",
                "tenant_id"
              ],
              "fieldEnums": {
                "predicate_op": [
                  "eq",
                  "ne",
                  "in",
                  "not_in",
                  "gte",
                  "lte",
                  "exists"
                ],
                "accepted_kinds": [
                  "outbound_reply",
                  "resolution"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/calendars"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/policies/:policy_id",
              "requiresAuth": true,
              "summary": "Read the policy created above",
              "payload_shape": [],
              "fieldEnums": {
                "predicate_op": [
                  "eq",
                  "ne",
                  "in",
                  "not_in",
                  "gte",
                  "lte",
                  "exists"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/policies"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/sla/policies/:policy_id/rungs",
              "requiresAuth": true,
              "summary": "Read the ladder including retired rungs",
              "payload_shape": [],
              "fieldEnums": {
                "severity": [
                  "info",
                  "warning",
                  "urgent",
                  "critical"
                ],
                "audience_kind": [
                  "owner",
                  "refs",
                  "on_call"
                ],
                "include_inactive": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/policies/:policy_id/rungs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/policies/:policy_id/rungs",
              "requiresAuth": true,
              "summary": "Warn the owner thirty business minutes before the deadline",
              "payload_shape": [
                "action",
                "action_config",
                "audience",
                "label",
                "metadata",
                "minutes_before_due",
                "remediation_hint",
                "rung_index",
                "severity",
                "tenant_id"
              ],
              "fieldEnums": {
                "severity": [
                  "info",
                  "warning",
                  "urgent",
                  "critical"
                ],
                "audience_kind": [
                  "owner",
                  "refs",
                  "on_call"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/policies"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/sla/rungs/:rung_id",
              "requiresAuth": true,
              "summary": "Restore the rung (idempotent when it is already active)",
              "payload_shape": [
                "is_active",
                "tenant_id"
              ],
              "fieldEnums": {
                "severity": [
                  "info",
                  "warning",
                  "urgent",
                  "critical"
                ],
                "is_active": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/policies/:policy_id/rungs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/systemic-incidents/open-pending",
              "requiresAuth": true,
              "summary": "Drain the pending queue (zero when every group already opened)",
              "payload_shape": [
                "limit",
                "tenant_id"
              ],
              "fieldEnums": {
                "reason_code": [
                  "awaiting_capacity",
                  "no_capacity",
                  "missed_handoff",
                  "upstream_outage",
                  "provider_down",
                  "process_gap",
                  "cause_not_recorded"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/breach"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/sla/tick",
              "requiresAuth": true,
              "summary": "Tick the tenant — the overdue clock has a rung waiting",
              "payload_shape": [
                "actor_id",
                "limit",
                "tenant_id"
              ],
              "fieldEnums": {
                "severity": [
                  "info",
                  "warning",
                  "urgent",
                  "critical"
                ],
                "firing_state": [
                  "claimed",
                  "fired",
                  "failed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/sla/clocks/:clock_id/resume"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-social",
          "group": "CRM & Engagement",
          "summary": "Social profiles and posting",
          "reuse_when": [
            "social",
            "post",
            "profile",
            "social media"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-social",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/identity/social/:provider/callback",
              "requiresAuth": false,
              "summary": "Google callback with verified id_token claims",
              "payload_shape": [
                "tenant_id",
                "verified_claims"
              ],
              "fieldEnums": {
                "provider": [
                  "google",
                  "apple",
                  "microsoft"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/social/handles",
              "requiresAuth": true,
              "summary": "Authorize a social handle for a tenant",
              "payload_shape": [
                "authorized_persona_id",
                "external_handle_id",
                "network",
                "tenant_id"
              ],
              "fieldEnums": {
                "network": [
                  "twitter",
                  "linkedin",
                  "instagram",
                  "facebook",
                  "tiktok"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/social/interactions",
              "requiresAuth": true,
              "summary": "Ingest an inbound social interaction",
              "payload_shape": [
                "author_external_id",
                "author_persona_id",
                "body",
                "handle_id",
                "kind"
              ],
              "fieldEnums": {
                "kind": [
                  "dm",
                  "comment",
                  "mention",
                  "review"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/social/handles"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/social/interactions/:interaction_id/capture-lead",
              "requiresAuth": true,
              "summary": "Capture an interaction as a CRM lead",
              "payload_shape": [
                "contact_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/social/interactions"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Data Provenance & Ingest",
      "sdk_count": 4,
      "api_count": 34,
      "sdks": [
        {
          "sdk": "sdk-import",
          "group": "Data Provenance & Ingest",
          "summary": "Governed bulk import: column mapping templates, dry run, commit and rollback",
          "reuse_when": [
            "import",
            "mapping",
            "csv",
            "dry run",
            "rollback",
            "bulk upload",
            "column mapping",
            "spreadsheet",
            "data migration"
          ],
          "api_count": 14,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-import",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/imports/mapping-templates",
              "requiresAuth": true,
              "summary": "List the tenant's mapping templates",
              "payload_shape": [],
              "fieldEnums": {
                "kind": [
                  "certified",
                  "custom"
                ],
                "crosswalk_strategy": [
                  "preserve_existing",
                  "add_alias",
                  "reject_conflict"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/mapping-templates"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/mapping-templates",
              "requiresAuth": true,
              "summary": "Create a custom mapping template",
              "payload_shape": [
                "created_by",
                "crosswalk_strategy",
                "description",
                "field_map",
                "kind",
                "metadata",
                "name",
                "slug",
                "tenant_id",
                "transforms",
                "value_crosswalks"
              ],
              "fieldEnums": {
                "kind": [
                  "certified",
                  "custom"
                ],
                "crosswalk_strategy": [
                  "preserve_existing",
                  "add_alias",
                  "reject_conflict"
                ],
                "target": [
                  "person.given_name",
                  "person.family_name",
                  "person.full_name",
                  "person.date_of_birth",
                  "contact.email",
                  "contact.phone",
                  "contact.handle",
                  "org.name",
                  "org.domain",
                  "org.size",
                  "place.address_line1",
                  "place.address_line2",
                  "place.locality",
                  "place.region",
                  "place.postal_code",
                  "place.country",
                  "external.id",
                  "attribute.custom",
                  "unmapped"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/mapping-templates/:template_id/version",
              "requiresAuth": true,
              "summary": "Publish version 2 of the template",
              "payload_shape": [
                "created_by",
                "crosswalk_strategy",
                "description",
                "field_map",
                "name",
                "tenant_id",
                "transforms",
                "value_crosswalks"
              ],
              "fieldEnums": {
                "crosswalk_strategy": [
                  "preserve_existing",
                  "add_alias",
                  "reject_conflict"
                ],
                "target": [
                  "person.given_name",
                  "person.family_name",
                  "person.full_name",
                  "person.date_of_birth",
                  "contact.email",
                  "contact.phone",
                  "contact.handle",
                  "org.name",
                  "org.domain",
                  "org.size",
                  "place.address_line1",
                  "place.address_line2",
                  "place.locality",
                  "place.region",
                  "place.postal_code",
                  "place.country",
                  "external.id",
                  "attribute.custom",
                  "unmapped"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/mapping-templates"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/imports/runs",
              "requiresAuth": true,
              "summary": "List runs for the tenant",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs",
              "requiresAuth": true,
              "summary": "Open a run for an uploaded delimited file",
              "payload_shape": [
                "attestation_id",
                "file_fingerprint",
                "file_name",
                "metadata",
                "rollback_window_hours",
                "row_count",
                "source_kind",
                "source_ref",
                "started_by",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/imports/runs/:run_id",
              "requiresAuth": true,
              "summary": "Read the run created by the producer",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ],
                "action": [
                  "created",
                  "linked",
                  "updated",
                  "asserted",
                  "reversed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs/:run_id/commit",
              "requiresAuth": true,
              "summary": "Commit the dry-run-verified rows",
              "payload_shape": [
                "actor_id",
                "consent",
                "rows",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview",
                "PUT /api/imports/runs/:run_id/mapping",
                "POST /api/imports/runs/:run_id/transform-plan",
                "POST /api/imports/runs/:run_id/dry-run"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs/:run_id/dry-run",
              "requiresAuth": true,
              "summary": "Dry-run the mapped rows",
              "payload_shape": [
                "rows",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview",
                "PUT /api/imports/runs/:run_id/mapping",
                "POST /api/imports/runs/:run_id/transform-plan"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/imports/runs/:run_id/exceptions",
              "requiresAuth": true,
              "summary": "Download the exception file for the committed run",
              "payload_shape": [],
              "fieldEnums": {
                "reason_code": [
                  "INVALID_VALUE",
                  "NEEDS_REVIEW",
                  "CONSENT_NOT_EVIDENCED"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview",
                "PUT /api/imports/runs/:run_id/mapping",
                "POST /api/imports/runs/:run_id/transform-plan",
                "POST /api/imports/runs/:run_id/commit"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/imports/runs/:run_id/mapping",
              "requiresAuth": true,
              "summary": "Confirm every proposed column mapping",
              "payload_shape": [
                "confirmations",
                "mapping_template_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "target": [
                  "person.given_name",
                  "person.family_name",
                  "person.full_name",
                  "person.date_of_birth",
                  "contact.email",
                  "contact.phone",
                  "contact.handle",
                  "org.name",
                  "org.domain",
                  "org.size",
                  "place.address_line1",
                  "place.address_line2",
                  "place.locality",
                  "place.region",
                  "place.postal_code",
                  "place.country",
                  "external.id",
                  "attribute.custom",
                  "unmapped"
                ],
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs/:run_id/mapping-suggestions",
              "requiresAuth": true,
              "summary": "Ask for mapping suggestions on the previewed run",
              "payload_shape": [
                "tenant_id"
              ],
              "fieldEnums": {
                "target": [
                  "person.given_name",
                  "person.family_name",
                  "person.full_name",
                  "person.date_of_birth",
                  "contact.email",
                  "contact.phone",
                  "contact.handle",
                  "org.name",
                  "org.domain",
                  "org.size",
                  "place.address_line1",
                  "place.address_line2",
                  "place.locality",
                  "place.region",
                  "place.postal_code",
                  "place.country",
                  "external.id",
                  "attribute.custom",
                  "unmapped"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs/:run_id/preview",
              "requiresAuth": true,
              "summary": "Preview the uploaded delimited content",
              "payload_shape": [
                "content",
                "delimiter",
                "encoding",
                "has_header_row",
                "sample_size",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs/:run_id/rollback",
              "requiresAuth": true,
              "summary": "Roll the committed run back inside its window",
              "payload_shape": [
                "actor_id",
                "reason",
                "tenant_id"
              ],
              "fieldEnums": {
                "status": [
                  "draft",
                  "previewing",
                  "mapping",
                  "dry_run",
                  "committing",
                  "complete",
                  "quarantined",
                  "rolled_back"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview",
                "PUT /api/imports/runs/:run_id/mapping",
                "POST /api/imports/runs/:run_id/transform-plan",
                "POST /api/imports/runs/:run_id/dry-run",
                "POST /api/imports/runs/:run_id/commit"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/imports/runs/:run_id/transform-plan",
              "requiresAuth": true,
              "summary": "Build the transform plan for the confirmed mapping",
              "payload_shape": [
                "default_calling_region",
                "default_country",
                "enable_source_state_mapping",
                "tenant_id"
              ],
              "fieldEnums": {
                "target": [
                  "person.given_name",
                  "person.family_name",
                  "person.full_name",
                  "person.date_of_birth",
                  "contact.email",
                  "contact.phone",
                  "contact.handle",
                  "org.name",
                  "org.domain",
                  "org.size",
                  "place.address_line1",
                  "place.address_line2",
                  "place.locality",
                  "place.region",
                  "place.postal_code",
                  "place.country",
                  "external.id",
                  "attribute.custom",
                  "unmapped"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/imports/runs",
                "POST /api/imports/runs/:run_id/preview",
                "PUT /api/imports/runs/:run_id/mapping"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-parsing",
          "group": "Data Provenance & Ingest",
          "summary": "Contact extraction from unstructured text; proposes candidates with evidence spans and persists nothing",
          "reuse_when": [
            "contact extraction",
            "smart paste",
            "business card",
            "vcard",
            "email signature",
            "ocr",
            "parse contact",
            "extract from text"
          ],
          "api_count": 3,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-parsing",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/parsing/contact/extract",
              "requiresAuth": true,
              "summary": "Email signature yields multiple qualified handles",
              "payload_shape": [
                "raw",
                "source_kind",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/parsing/contact/extract-batch",
              "requiresAuth": true,
              "summary": "Two valid captures both extract",
              "payload_shape": [
                "items",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/parsing/contact/schemas",
              "requiresAuth": true,
              "summary": "Resolve the contact schema for a tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-projection",
          "group": "Data Provenance & Ingest",
          "summary": "Attribute-level survivorship: which asserted value wins, with an explainable reason and deterministic replay",
          "reuse_when": [
            "survivorship",
            "which value wins",
            "explain projection",
            "attribute conflict",
            "losing assertion",
            "conflicting data",
            "replay",
            "why is this field wrong"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-projection",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/projection/replay",
              "requiresAuth": true,
              "summary": "Replay a single subject",
              "payload_shape": [
                "reason",
                "subject_ref",
                "tenant_id",
                "trigger"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/projection/subject/:subject_ref/explained",
              "requiresAuth": true,
              "summary": "Explained projection for a subject",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "PUT /api/projection/survivorship-rules"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/projection/survivorship-rules",
              "requiresAuth": true,
              "summary": "List rule sets for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "PUT /api/projection/survivorship-rules"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/projection/survivorship-rules",
              "requiresAuth": true,
              "summary": "Set a catch-all precedence for the tenant",
              "payload_shape": [
                "attribute",
                "criteria",
                "tenant_id",
                "updated_by"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-source-record",
          "group": "Data Provenance & Ingest",
          "summary": "Provenance capture: immutable source records, origin class, raw evidence and chain of custody",
          "reuse_when": [
            "provenance",
            "source record",
            "origin",
            "attestation",
            "chain of custody",
            "where did this come from",
            "audit trail of a value",
            "who told us this"
          ],
          "api_count": 13,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-source-record",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/source-assertions",
              "requiresAuth": true,
              "summary": "List every coexisting claim for the subject and attribute",
              "payload_shape": [],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "status": [
                  "SURVIVES",
                  "ASSERTION",
                  "SUPERSEDED",
                  "PRIMARY"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records",
                "POST /api/source-assertions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-assertions",
              "requiresAuth": true,
              "summary": "Write a licensed third-party email claim",
              "payload_shape": [
                "actor_id",
                "attribute",
                "capture_id",
                "causation_id",
                "confidence",
                "effective_from",
                "effective_to",
                "evidence_ref",
                "is_pii",
                "metadata",
                "origin_class",
                "purpose",
                "retrieved_at",
                "status",
                "subject_ref",
                "tenant_id",
                "value"
              ],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "status": [
                  "SURVIVES",
                  "ASSERTION",
                  "SUPERSEDED",
                  "PRIMARY"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-assertions/:assertion_id/supersede",
              "requiresAuth": true,
              "summary": "Supersede the licensed claim with a corrected one",
              "payload_shape": [
                "actor_id",
                "attribute",
                "capture_id",
                "causation_id",
                "confidence",
                "effective_from",
                "effective_to",
                "evidence_ref",
                "is_pii",
                "metadata",
                "origin_class",
                "purpose",
                "reason",
                "retrieved_at",
                "status",
                "subject_ref",
                "tenant_id",
                "value"
              ],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "status": [
                  "SURVIVES",
                  "ASSERTION",
                  "SUPERSEDED",
                  "PRIMARY"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records",
                "POST /api/source-assertions"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/source-records",
              "requiresAuth": true,
              "summary": "List captures for the tenant",
              "payload_shape": [],
              "fieldEnums": {
                "trust_state": [
                  "P0_CAPTURED",
                  "P1_NORMALIZED",
                  "P2_CANDIDATE",
                  "P3_LINKED",
                  "P4_DIRECT"
                ],
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-records",
              "requiresAuth": true,
              "summary": "Capture a public-record payload at P0_CAPTURED",
              "payload_shape": [
                "actor_id",
                "causation_id",
                "evidence_kind",
                "evidence_ref",
                "fingerprint",
                "metadata",
                "origin_class",
                "purpose",
                "raw_evidence",
                "retrieved_at",
                "source_external_id",
                "source_system",
                "subject_ref",
                "tenant_id"
              ],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "evidence_kind": [
                  "RAW_PAYLOAD",
                  "API_RESPONSE",
                  "DOCUMENT",
                  "SCREENSHOT",
                  "LICENSE_TERMS",
                  "CONSENT_RECEIPT",
                  "SIGNATURE",
                  "OTHER"
                ],
                "trust_state": [
                  "P0_CAPTURED",
                  "P1_NORMALIZED",
                  "P2_CANDIDATE",
                  "P3_LINKED",
                  "P4_DIRECT"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/source-records/:capture_id",
              "requiresAuth": true,
              "summary": "Read the capture created by the producer",
              "payload_shape": [],
              "fieldEnums": {
                "trust_state": [
                  "P0_CAPTURED",
                  "P1_NORMALIZED",
                  "P2_CANDIDATE",
                  "P3_LINKED",
                  "P4_DIRECT"
                ],
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-records/:capture_id/crosswalks",
              "requiresAuth": true,
              "summary": "Link the capture to its external system identifier",
              "payload_shape": [
                "actor_id",
                "causation_id",
                "external_id",
                "external_system",
                "metadata",
                "purpose",
                "subject_ref",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-records/:capture_id/normalize",
              "requiresAuth": true,
              "summary": "Normalize the capture to P1_NORMALIZED",
              "payload_shape": [
                "actor_id",
                "causation_id",
                "purpose",
                "tenant_id"
              ],
              "fieldEnums": {
                "trust_state": [
                  "P0_CAPTURED",
                  "P1_NORMALIZED",
                  "P2_CANDIDATE",
                  "P3_LINKED",
                  "P4_DIRECT"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-records/:capture_id/promote",
              "requiresAuth": true,
              "summary": "Promote the normalized capture to P2_CANDIDATE",
              "payload_shape": [
                "actor_id",
                "causation_id",
                "decision_ref",
                "evidence_origin_class",
                "evidence_ref",
                "purpose",
                "subject_ref",
                "tenant_id",
                "to_state"
              ],
              "fieldEnums": {
                "to_state": [
                  "P0_CAPTURED",
                  "P1_NORMALIZED",
                  "P2_CANDIDATE",
                  "P3_LINKED",
                  "P4_DIRECT"
                ],
                "evidence_origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "trust_state": [
                  "P0_CAPTURED",
                  "P1_NORMALIZED",
                  "P2_CANDIDATE",
                  "P3_LINKED",
                  "P4_DIRECT"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records",
                "POST /api/source-records/:capture_id/normalize"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/source-rights/attestations",
              "requiresAuth": true,
              "summary": "List attestations for the capture",
              "payload_shape": [],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records",
                "POST /api/source-rights/attestations"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/source-rights/attestations",
              "requiresAuth": true,
              "summary": "Sign a licensed-source attestation with its licence evidence",
              "payload_shape": [
                "attestor_principal",
                "capture_id",
                "causation_id",
                "collection_period_end",
                "collection_period_start",
                "evidence_blob_ref",
                "evidence_kind",
                "jurisdiction",
                "license_ref",
                "mapping_version",
                "metadata",
                "origin_class",
                "permitted_uses",
                "purpose",
                "source_fingerprint",
                "tenant_id"
              ],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "evidence_kind": [
                  "RAW_PAYLOAD",
                  "API_RESPONSE",
                  "DOCUMENT",
                  "SCREENSHOT",
                  "LICENSE_TERMS",
                  "CONSENT_RECEIPT",
                  "SIGNATURE",
                  "OTHER"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/source-rights/attestations/:attestation_id",
              "requiresAuth": true,
              "summary": "Read the attestation just signed",
              "payload_shape": [],
              "fieldEnums": {
                "origin_class": [
                  "USER_PROVIDED",
                  "FIRST_PARTY_DIRECT",
                  "TENANT_FIRST_PARTY_CRM",
                  "USER_AUTHORIZED_CONTACT_STORE",
                  "PUBLIC_RECORD",
                  "LICENSED_THIRD_PARTY",
                  "PARTNER_PROVIDED",
                  "UNKNOWN_QUARANTINED"
                ],
                "evidence_kind": [
                  "RAW_PAYLOAD",
                  "API_RESPONSE",
                  "DOCUMENT",
                  "SCREENSHOT",
                  "LICENSE_TERMS",
                  "CONSENT_RECEIPT",
                  "SIGNATURE",
                  "OTHER"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records",
                "POST /api/source-rights/attestations"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/source-rights/permitted-use",
              "requiresAuth": true,
              "summary": "Check an attested purpose against the signed rights",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/source-records",
                "POST /api/source-rights/attestations"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Governance, Consent & Security",
      "sdk_count": 10,
      "api_count": 70,
      "sdks": [
        {
          "sdk": "sdk-approval",
          "group": "Governance, Consent & Security",
          "summary": "Approval workflows, multi-step sign-off, audited break-glass",
          "reuse_when": [
            "approval",
            "sign-off",
            "review",
            "break-glass",
            "gate",
            "authorization workflow"
          ],
          "api_count": 11,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-approval",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/approvals/requests",
              "requiresAuth": true,
              "summary": "List pending requests for tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/approvals/requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/approvals/requests",
              "requiresAuth": true,
              "summary": "Submit refund approval request",
              "payload_shape": [
                "initiator_persona_id",
                "reason",
                "route_id",
                "subject_id",
                "subject_kind",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/approvals/requests/:request_id",
              "requiresAuth": true,
              "summary": "Get request state + steps",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/approvals/requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/approvals/requests/:request_id/decide",
              "requiresAuth": true,
              "summary": "Approve a pending request directly",
              "payload_shape": [
                "comment",
                "decider_persona_id",
                "decision"
              ],
              "fieldEnums": {
                "decision": [
                  "approved",
                  "rejected"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/approvals/requests"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/approvals/routes",
              "requiresAuth": true,
              "summary": "List routes for tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/approvals/routes",
              "requiresAuth": true,
              "summary": "Create 2-step approval route (manager single -> finance m-of-n)",
              "payload_shape": [
                "delegation_rules",
                "description",
                "kind_pattern",
                "name",
                "steps",
                "tenant_id"
              ],
              "fieldEnums": {
                "kind": [
                  "single",
                  "m-of-n",
                  "role"
                ],
                "status": [
                  "draft",
                  "active",
                  "deprecated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/approvals/steps/:step_id/decide",
              "requiresAuth": true,
              "summary": "Approve manager step",
              "payload_shape": [
                "acting_persona_id",
                "decision",
                "reason"
              ],
              "fieldEnums": {
                "decision": [
                  "approve",
                  "reject"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/approvals/requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/break-glass",
              "requiresAuth": true,
              "summary": "Request emergency break-glass access to a patient record",
              "payload_shape": [
                "justification",
                "route_id",
                "scope",
                "tenant_id",
                "ttl_minutes"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/break-glass/:grant_id",
              "requiresAuth": true,
              "summary": "Read grant status and latest certificate",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/break-glass",
                "POST /api/break-glass/:grant_id/decide",
                "POST /api/break-glass/:grant_id/use"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/break-glass/:grant_id/decide",
              "requiresAuth": true,
              "summary": "Approve the gating request, activating the grant",
              "payload_shape": [
                "decision",
                "reason",
                "step_id"
              ],
              "fieldEnums": {
                "decision": [
                  "approve",
                  "reject"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/break-glass"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/break-glass/:grant_id/use",
              "requiresAuth": true,
              "summary": "Exercise the active grant within scope, emitting a certificate",
              "payload_shape": [
                "action",
                "target_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes",
                "POST /api/break-glass",
                "POST /api/break-glass/:grant_id/decide"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-audit",
          "group": "Governance, Consent & Security",
          "summary": "Tamper-evident audit chain / audit log",
          "reuse_when": [
            "audit",
            "audit log",
            "compliance",
            "trail",
            "tamper-evident",
            "history"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-audit",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/audit/append",
              "requiresAuth": true,
              "summary": "Append entry to canonical audit chain",
              "payload_shape": [
                "actor_kind",
                "app_id",
                "bu_id",
                "event_type",
                "org_id",
                "payload",
                "pool_index",
                "retention_class",
                "subject_id",
                "subject_kind",
                "tenant_id"
              ],
              "fieldEnums": {
                "actor_kind": [
                  "human",
                  "service",
                  "agent"
                ],
                "retention_class": [
                  "transient",
                  "operational",
                  "regulated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/tenants/:tenant_id/bus",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/audit/export",
              "requiresAuth": true,
              "summary": "Request an inline JSONL export of the tenant audit chain",
              "payload_shape": [
                "format",
                "inline",
                "range_end",
                "range_start",
                "tenant_id"
              ],
              "fieldEnums": {
                "format": [
                  "pdf",
                  "jsonl"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/audit/verify",
              "requiresAuth": true,
              "summary": "Verify chain for an empty pool",
              "payload_shape": [
                "from_seq",
                "pool_index",
                "to_seq"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/events/types",
              "requiresAuth": false,
              "summary": "List the platform baseline plus this tenant's own event types",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/events/types",
              "requiresAuth": true,
              "summary": "Register a tenant event type",
              "payload_shape": [
                "compaction_policy",
                "conflict_policy",
                "event_type",
                "retention_class",
                "schema_state",
                "schema_version"
              ],
              "fieldEnums": {
                "retention_class": [
                  "transient",
                  "operational",
                  "regulated"
                ],
                "conflict_policy": [
                  "crdt",
                  "lww",
                  "merge",
                  "event-sourcing",
                  "human-review"
                ],
                "schema_state": [
                  "active",
                  "deprecated",
                  "retired"
                ],
                "compaction_policy": [
                  "none",
                  "lww",
                  "count"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/events/types/:type",
              "requiresAuth": true,
              "summary": "Look up one event type, platform baseline first then tenant",
              "payload_shape": [],
              "fieldEnums": {
                "type": [
                  "vault.key.issued.v1",
                  "vault.key.rotated.v1",
                  "vault.key.shredded.v1",
                  "vault.encounter.opened.v1",
                  "vault.encounter.sealed.v1",
                  "secrets.ref.resolved.v1",
                  "secrets.key.rotated.v1",
                  "tenant.pool.assigned.v1",
                  "pool.lifecycle.changed.v1",
                  "usage.event.v1",
                  "audit.chain.verified.v1",
                  "audit.chain.break.v1",
                  "audit.export.requested.v1",
                  "audit.export.ready.v1",
                  "tenant.created.v1",
                  "tenant.subtenant.created.v1",
                  "tenant.bu.created.v1",
                  "tenant.bu.moved.v1",
                  "tenant.role-template.updated.v1",
                  "tenant.fiscal-calendar.updated.v1",
                  "reseller.created.v1",
                  "reseller.tenant.attached.v1",
                  "identity.login.v1",
                  "identity.app-identity.created.v1",
                  "identity.alias.merged.v1",
                  "identity.federation.configured.v1",
                  "identity.mfa.challenged.v1",
                  "identity.mfa.verified.v1",
                  "identity.impersonation.requested.v1",
                  "identity.impersonation.granted.v1",
                  "identity.impersonation.ended.v1",
                  "consent.granted.v1",
                  "consent.revoked.v1",
                  "consent.purpose.registered.v1",
                  "consent.cross-tenant.granted.v1",
                  "policy.evaluated.v1",
                  "policy.updated.v1",
                  "rebac.relationship.created.v1",
                  "rebac.relationship.scope.changed.v1",
                  "rebac.relationship.terminated.v1",
                  "rebac.decision.v1",
                  "api-key.issued.v1",
                  "api-key.rotated.v1",
                  "api-key.revoked.v1",
                  "api-key.used.v1",
                  "identity.projection.refreshed.v1",
                  "identity.projection.miss.v1",
                  "profile.band.updated.v1",
                  "profile.field.shredded.v1",
                  "identity.persona.created.v1",
                  "identity.persona.shred.v1",
                  "identity.membership.created.v1",
                  "identity.membership.suspended.v1",
                  "identity.membership.reactivated.v1",
                  "identity.membership.terminated.v1",
                  "identity.role.assigned.v1",
                  "identity.role.revoked.v1",
                  "identity.resolver.fallback.v1",
                  "data-rights.request.submitted.v1",
                  "data-rights.request.transitioned.v1",
                  "data-rights.executed.v1",
                  "data-rights.certificate.issued.v1",
                  "data-rights.reconciliation.completed.v1",
                  "pool-residency.touched.v1",
                  "geo.address.canonicalized.v1",
                  "geo.address.merged.v1",
                  "device.registered.v1",
                  "device.attested.v1",
                  "device.revoked.v1",
                  "device.person-link.changed.v1",
                  "feature-flag.updated.v1",
                  "feature-flag.rollout.updated.v1",
                  "feature-flag.kill-switch.flipped.v1",
                  "hdk-sync.queue.replayed.v1",
                  "hdk-sync.conflict.resolved.v1",
                  "hdk-sync.conflict.escalated-to-human.v1",
                  "hdk-sync.event-type-policy.registered.v1",
                  "hdk-idp.device-claim.registered.v1",
                  "hdk-idp.offline-auth.synced.v1",
                  "hdk-permissions.surface.snapshot.v1",
                  "media.blob.uploaded.v1",
                  "media.transcode.completed.v1",
                  "media.blob.shredded.v1",
                  "notification.sent.v1",
                  "notification.delivered.v1",
                  "notification.failed.v1",
                  "payment.charge.v1",
                  "payment.refund.v1",
                  "payment.distributed.v1",
                  "billing.invoice.finalized.v1",
                  "billing.invoice.paid.v1",
                  "billing.dunning.advanced.v1",
                  "billing.reprice.dry-run.completed.v1",
                  "approval.step.decided.v1",
                  "engagement.encounter.opened.v1",
                  "engagement.encounter.closed.v1",
                  "engagement.encounter.sealed.v1",
                  "engagement.relationship.created.v1",
                  "engagement.relationship.terminated.v1",
                  "engagement.encounter.grant.issued.v1",
                  "engagement.encounter.grant.revoked.v1",
                  "crm.contact.created.v1",
                  "crm.contact.updated.v1",
                  "crm.deal.created.v1",
                  "crm.deal.transitioned.v1",
                  "crm.activity.logged.v1",
                  "content.item.created.v1",
                  "content.version.published.v1",
                  "service-request.ticket.created.v1",
                  "service-request.ticket.transitioned.v1",
                  "service-request.ticket.sla.breached.v1",
                  "event.session.opened.v1",
                  "event.ticket.issued.v1",
                  "event.ticket.checked-in.v1",
                  "campaign.created.v1",
                  "campaign.segment.computed.v1",
                  "campaign.journey.advanced.v1",
                  "social.handle.authorized.v1",
                  "social.interaction.ingested.v1",
                  "social.lead.captured.v1",
                  "connector.installed.v1",
                  "connector.uninstalled.v1",
                  "connector.sync.completed.v1",
                  "connector.sync.conflict.v1",
                  "hdk-scanner.code.captured.v1",
                  "hdk-image.edit.applied.v1",
                  "hdk-video.trim.applied.v1",
                  "tenant.lifecycle.transitioned.v1",
                  "tenant.lifecycle.sandbox.created.v1",
                  "tenant.lifecycle.offboarded.v1",
                  "slack.workspace.connected.v1",
                  "slack.message.posted.v1",
                  "slack.thread.message.v1",
                  "slack.interaction.received.v1",
                  "webhook.delivery.failed.v1",
                  "webhook.delivery.dlq.v1",
                  "agent.run.started.v1",
                  "agent.run.completed.v1",
                  "agent.run.terminated.v1",
                  "agent.run.replayed.v1",
                  "agent.run.rolled-back.v1",
                  "agent.tool.invoked.v1",
                  "agent.scope.exceeded.v1",
                  "agent.capability-token.minted.v1",
                  "agent.capability-token.revoked.v1",
                  "agent.log.purged.v1",
                  "agent.kill-switch.triggered.v1",
                  "ai-gateway.complete.v1",
                  "ai-gateway.stream.v1",
                  "ai-gateway.provider.circuit-state.changed.v1",
                  "trace.export.requested.v1",
                  "trace.export.ready.v1",
                  "mcp.server.registered.v1",
                  "mcp.server.disabled.v1",
                  "mcp.tool.invoked.v1",
                  "mcp.exposed-server.activated.v1",
                  "taxonomy.version.activated.v1",
                  "taxonomy.version.deprecated.v1",
                  "connector.github.webhook.received.v1",
                  "connector.github.pr.upserted.v1",
                  "rag.corpus.created.v1",
                  "rag.document.indexed.v1",
                  "rag.document.reindexed.v1",
                  "rag.retrieval.completed.v1",
                  "parsing.job.queued.v1",
                  "parsing.stage.completed.v1",
                  "parsing.field.extracted.v1",
                  "parsing.review.routed.v1",
                  "parsing.job.completed.v1",
                  "conversation.session.opened.v1",
                  "conversation.turn.recorded.v1",
                  "conversation.handoff.v1",
                  "conversation.session.closed.v1",
                  "recommendation.model.trained.v1",
                  "recommendation.suggestion.generated.v1",
                  "recommendation.feedback.captured.v1",
                  "analytics.rollup.executed.v1",
                  "analytics.extract.published.v1",
                  "lineage.edge.emitted.v1",
                  "lineage.projection.queued.v1",
                  "lineage.projection.completed.v1",
                  "lineage.projection.failed.v1",
                  "semantic.ontology.registered.v1",
                  "semantic.ontology.deprecated.v1",
                  "semantic.intent.planned.v1",
                  "semantic.plan.executed.v1",
                  "semantic.policy.evaluated.v1",
                  "semantic.bridge.created.v1",
                  "snowflake.installed.v1",
                  "snowflake.binding.created.v1",
                  "snowflake.sync.completed.v1",
                  "snowflake.query.executed.v1",
                  "storm.event.ingested.v1",
                  "storm.intensity.updated.v1",
                  "dispatch.task.enqueued.v1",
                  "dispatch.task.assigned.v1",
                  "dispatch.task.completed.v1",
                  "dispatch.route.optimized.v1",
                  "assignment.assigned.v1",
                  "assignment.accepted.v1",
                  "assignment.rejected.v1",
                  "lead-scoring.scored.v1",
                  "lead-scoring.model.trained.v1",
                  "evidence.captured.v1",
                  "evidence.variant.created.v1",
                  "evidence.chain.appended.v1",
                  "evidence.legal-export.generated.v1",
                  "evidence.shredded.v1",
                  "evidence.sealed.v1",
                  "diagnostic.crash.reported.v1",
                  "diagnostic.health.captured.v1",
                  "diagnostic.session-replay.event.v1",
                  "federation.route.resolved.v1",
                  "federation.failover.executed.v1",
                  "iceberg.table.compacted.v1",
                  "iceberg.query.executed.v1",
                  "usage.hardcap.exceeded.v1",
                  "usage.hardcap.override.applied.v1",
                  "hdk-measure.captured.v1",
                  "hdk-watermark.applied.v1",
                  "byok.binding.created.v1",
                  "byok.cmk.used.v1",
                  "byok.cmk.rotated.v1",
                  "byok.binding.revoked.v1",
                  "sovereign.bundle.shipped.v1",
                  "sovereign.bundle.applied.v1",
                  "sovereign.attestation.issued.v1",
                  "sovereign.leak.alert.v1",
                  "onprem.bundle.applied.v1",
                  "onprem.bundle.rolled-back.v1",
                  "onprem.local-llm.loaded.v1",
                  "active-active.profile.activated.v1",
                  "active-active.failover.drill.v1",
                  "active-active.tier.downgraded.v1",
                  "ai_gateway.tenant_credential.bound.v1",
                  "ai_gateway.tenant_credential.rotated.v1",
                  "ai_gateway.tenant_credential.revoked.v1",
                  "security.principal_token.key_rotated.v1",
                  "security.break_glass.granted.v1",
                  "security.break_glass.used.v1",
                  "resource_registry.quarantined.v1",
                  "mdm.candidate_link.created.v1",
                  "mdm.steward.decided.v1",
                  "mdm.merge.performed.v1",
                  "mdm.merge.reversed.v1",
                  "mdm.calibration.drift.v1"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-consent",
          "group": "Governance, Consent & Security",
          "summary": "Consent capture, purpose binding, revocation, consent-gated auth",
          "reuse_when": [
            "consent",
            "opt-in",
            "opt-out",
            "gdpr",
            "purpose",
            "permission",
            "privacy"
          ],
          "api_count": 10,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-consent",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/consent/purposes",
              "requiresAuth": true,
              "summary": "List consent purposes for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/consent/receipts",
              "requiresAuth": true,
              "summary": "List consent receipts filtered by tenant, subject and purpose",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/consents/purposes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/consent/receipts/:receipt_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke a previously granted consent receipt",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/consents/purposes",
                "POST /api/consents"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/consents",
              "requiresAuth": true,
              "summary": "Grant consent for the registered purpose",
              "payload_shape": [
                "app_id",
                "expires_at",
                "granted_by_actor",
                "jurisdiction",
                "person_id",
                "processor",
                "purpose_id",
                "source_tenant_id",
                "target_tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/consents/purposes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/consents/:receipt_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke the previously granted receipt",
              "payload_shape": [
                "reason",
                "revoked_by"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/consents/purposes",
                "POST /api/consents"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/consents/check",
              "requiresAuth": true,
              "summary": "Check the granted receipt is active",
              "payload_shape": [
                "jurisdiction",
                "person_id",
                "processor",
                "purpose_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/consents/purposes",
                "POST /api/consents"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/consents/check/bulk",
              "requiresAuth": true,
              "summary": "One granted tuple and one malformed item - the bad item must not fail the batch",
              "payload_shape": [
                "items"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/consents/purposes",
                "POST /api/consents"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/consents/export",
              "requiresAuth": true,
              "summary": "Export receipts for the freshly-registered person",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/consents/purposes",
                "POST /api/consents"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/consents/purposes",
              "requiresAuth": true,
              "summary": "List the registry and see the purpose just registered",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/consents/purposes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/consents/purposes",
              "requiresAuth": true,
              "summary": "Register a marketing-email purpose",
              "payload_shape": [
                "app_id",
                "default_jurisdictions",
                "description",
                "legal_basis",
                "purpose_id"
              ],
              "fieldEnums": {
                "legal_basis": [
                  "consent",
                  "contract",
                  "legitimate-interest",
                  "vital",
                  "public-task",
                  "legal-obligation"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-data-rights",
          "group": "Governance, Consent & Security",
          "summary": "Data subject rights (DSAR): access, erasure, portability",
          "reuse_when": [
            "data rights",
            "dsar",
            "gdpr",
            "erasure",
            "right to be forgotten",
            "subject access",
            "privacy"
          ],
          "api_count": 9,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-data-rights",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/data-rights/executions/:execution_id/result",
              "requiresAuth": true,
              "summary": "Record success",
              "payload_shape": [
                "audit_entry_id",
                "error_detail",
                "status"
              ],
              "fieldEnums": {
                "status": [
                  "succeeded",
                  "failed"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/data-rights/residency/touch",
                "POST /api/data-rights/requests",
                "POST /api/data-rights/requests/:request_id/plan-executions"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/data-rights/reconciliation/run",
              "requiresAuth": true,
              "summary": "Run reconciliation (empty discrepancies -> green)",
              "payload_shape": [
                "discrepancies"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/data-rights/requests",
              "requiresAuth": true,
              "summary": "Submit erasure request",
              "payload_shape": [
                "approval_policy",
                "jurisdiction",
                "kind",
                "person_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "kind": [
                  "access",
                  "erasure",
                  "rectification",
                  "restriction",
                  "objection",
                  "portability"
                ],
                "jurisdiction": [
                  "GDPR",
                  "DPDP",
                  "CCPA",
                  "LGPD"
                ],
                "approval_policy": [
                  "auto",
                  "manager-approval",
                  "cross-tenant-approval"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/data-rights/requests/:request_id",
              "requiresAuth": true,
              "summary": "Get DSAR request",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/data-rights/requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/data-rights/requests/:request_id/certificate",
              "requiresAuth": true,
              "summary": "Issue cert with shred proofs",
              "payload_shape": [
                "artifact_s3_key",
                "shred_proofs",
                "signed_by_audit_entry_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/data-rights/requests",
                "POST /api/data-rights/reconciliation/run"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/data-rights/requests/:request_id/plan-executions",
              "requiresAuth": true,
              "summary": "Plan executions",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/data-rights/residency/touch",
                "POST /api/data-rights/requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/data-rights/requests/:request_id/transition",
              "requiresAuth": true,
              "summary": "Transition submitted -> identity-verified",
              "payload_shape": [
                "approval_ref",
                "grace_until",
                "to"
              ],
              "fieldEnums": {
                "to": [
                  "submitted",
                  "identity-verified",
                  "approval-pending",
                  "grace-period",
                  "executing",
                  "certificate-issued",
                  "audited",
                  "rejected"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/data-rights/requests"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/data-rights/residency/:person_id",
              "requiresAuth": true,
              "summary": "List residency",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/data-rights/residency/touch",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/data-rights/residency/touch",
              "requiresAuth": true,
              "summary": "Record residency for a person+pool",
              "payload_shape": [
                "data_classes",
                "person_id",
                "pool_index",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /scim/v2/Users"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-evidence",
          "group": "Governance, Consent & Security",
          "summary": "Evidence capture and chain-of-custody",
          "reuse_when": [
            "evidence",
            "chain of custody",
            "proof",
            "forensic"
          ],
          "api_count": 3,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-evidence",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/evidence/capture",
              "requiresAuth": true,
              "summary": "List captures for an encounter",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/encounters",
                "POST /api/evidence/capture"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/evidence/capture",
              "requiresAuth": true,
              "summary": "Provenance-stamped capture intake for an open encounter",
              "payload_shape": [
                "altitude",
                "blob_checksum",
                "captured_at",
                "capturer_persona_id",
                "consent_ref",
                "device_attestation_id",
                "device_uuid",
                "encounter_id",
                "imu_signature",
                "lat",
                "lng",
                "raw_blob_id",
                "retention_class",
                "retention_expires_at",
                "tenant_id"
              ],
              "fieldEnums": {
                "retention_class": [
                  "transient",
                  "operational",
                  "regulated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/devices",
                "POST /api/devices/:device_uuid/attest",
                "POST /api/media/:blob_id/ready",
                "POST /api/consents",
                "POST /api/encounters"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/evidence/capture/:id",
              "requiresAuth": true,
              "summary": "Fetch a capture by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/evidence/capture"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-policy",
          "group": "Governance, Consent & Security",
          "summary": "Policy decision point (ABAC/PDP) with obligations",
          "reuse_when": [
            "policy",
            "abac",
            "pdp",
            "authorization",
            "decision",
            "rule",
            "obligation",
            "access policy",
            "permit or deny",
            "attribute based",
            "conditional access",
            "guardrail"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-policy",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/policies",
              "requiresAuth": true,
              "summary": "List the tenant-wide policies for the calling tenant",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "draft",
                  "active",
                  "deprecated",
                  "retired"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/policies",
              "requiresAuth": true,
              "summary": "Create a doctor-care-team policy bundle",
              "payload_shape": [
                "iql_source",
                "name",
                "obligations",
                "tenant_id",
                "version"
              ],
              "fieldEnums": {
                "obligations.audit_level": [
                  "none",
                  "standard",
                  "detailed",
                  "forensic"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/policies/:policy_id",
              "requiresAuth": true,
              "summary": "Fetch the freshly-created policy",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/policies"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/policies/evaluate",
              "requiresAuth": true,
              "summary": "Evaluate the doctor-care-team policy for a subject",
              "payload_shape": [
                "consent_receipts",
                "context",
                "policy_id",
                "purpose",
                "purpose_bound",
                "resource_class",
                "subject_id",
                "target_id"
              ],
              "fieldEnums": {
                "resource_class": [
                  "sensitive",
                  "low_risk"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/policies"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/policies/evaluate/bulk",
              "requiresAuth": true,
              "summary": "Evaluate one policy for the same subject twice - one bare, one with full context",
              "payload_shape": [
                "items"
              ],
              "fieldEnums": {
                "resource_class": [
                  "sensitive",
                  "low_risk"
                ],
                "decision": [
                  "ALLOW",
                  "DENY"
                ],
                "error_code": [
                  "VALIDATION_ERROR",
                  "POLICY_NOT_FOUND"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/policies"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-rebac",
          "group": "Governance, Consent & Security",
          "summary": "Relationship-based access control (ReBAC) graph",
          "reuse_when": [
            "rebac",
            "authorization",
            "relationship",
            "access control",
            "permission",
            "graph",
            "contextual role",
            "delegate",
            "acts on behalf of",
            "trust state",
            "evidence",
            "who may act for whom",
            "can this user",
            "ownership",
            "sharing",
            "team access"
          ],
          "api_count": 9,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-rebac",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/relationships",
              "requiresAuth": true,
              "summary": "Create a care-team relationship",
              "payload_shape": [
                "consent_ref",
                "cross_tenant",
                "expires_at",
                "kind",
                "persona_a",
                "persona_b",
                "reattest_due_at",
                "scope"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/relationships/:relationship_id/attest",
              "requiresAuth": true,
              "summary": "Attest the relationship as CONFIRMED with an evidence ref",
              "payload_shape": [
                "evidence_refs",
                "trust_state"
              ],
              "fieldEnums": {
                "trust_state": [
                  "CONFIRMED",
                  "CANDIDATE",
                  "DOCUMENTED"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/relationships"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/relationships/:relationship_id/scope",
              "requiresAuth": true,
              "summary": "Suspend the relationship and narrow scope",
              "payload_shape": [
                "scope",
                "status"
              ],
              "fieldEnums": {
                "status": [
                  "open",
                  "active",
                  "suspended",
                  "terminated",
                  "expired"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/relationships"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/relationships/check",
              "requiresAuth": true,
              "summary": "Check care-team reachability with default budget",
              "payload_shape": [
                "budget",
                "kind",
                "subject_persona_id",
                "target_persona_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/relationships/roles",
              "requiresAuth": true,
              "summary": "Live roles for a pair",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/relationships/roles"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/relationships/roles",
              "requiresAuth": true,
              "summary": "Grant a DOCUMENTED carer role with evidence",
              "payload_shape": [
                "evidence_refs",
                "kind",
                "persona_a",
                "persona_b",
                "role_label",
                "trust_state",
                "valid_from"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/role-assignments",
              "requiresAuth": true,
              "summary": "Assign role to persona",
              "payload_shape": [
                "assigned_by",
                "persona_id",
                "role_template_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/role-assignments/:assignment_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke role assignment",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/role-assignments"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/role-templates",
              "requiresAuth": true,
              "summary": "Create a tenant-scoped doctor role template",
              "payload_shape": [
                "app_id",
                "name",
                "permissions",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-secrets",
          "group": "Governance, Consent & Security",
          "summary": "Secret storage and retrieval",
          "reuse_when": [
            "secret",
            "credential",
            "token",
            "secure store"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-secrets",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/secrets",
              "requiresAuth": true,
              "summary": "Retrieve a previously registered SecretRef by ref",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/secrets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/secrets",
              "requiresAuth": true,
              "summary": "Register a tenant-scoped SecretRef",
              "payload_shape": [
                "kms_key_id",
                "ref",
                "scope"
              ],
              "fieldEnums": {
                "scope": [
                  "app",
                  "pool",
                  "tenant"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/secrets/:ref",
              "requiresAuth": true,
              "summary": "Retrieve a previously registered SecretRef by ref",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/secrets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/secrets/:ref/rotate",
              "requiresAuth": true,
              "summary": "Rotate previously registered SecretRef",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/secrets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/secrets/rotate",
              "requiresAuth": true,
              "summary": "Rotate previously registered SecretRef",
              "payload_shape": [
                "ref"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/secrets"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-trace",
          "group": "Governance, Consent & Security",
          "summary": "Distributed trace / lineage records",
          "reuse_when": [
            "trace",
            "lineage",
            "span",
            "distributed tracing",
            "provenance"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-trace",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/trace/:trace_id",
              "requiresAuth": true,
              "summary": "Timeline renders trace header + spans",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/trace/exports",
              "requiresAuth": true,
              "summary": "PDF export persists trace.export row with signature",
              "payload_shape": [
                "format",
                "requestor_persona_id",
                "tenant_id",
                "trace_id"
              ],
              "fieldEnums": {
                "format": [
                  "pdf",
                  "json"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /policy/:id/evaluate"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/trace/health",
              "requiresAuth": false,
              "summary": "Health probe returns sdk + status",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/trace/regression-assert",
              "requiresAuth": true,
              "summary": "Regression assert returns matched/missing/extra layers",
              "payload_shape": [
                "expected_layers",
                "trace_id"
              ],
              "fieldEnums": {
                "expected_layers": [
                  "gateway",
                  "identity",
                  "consent",
                  "pool-router",
                  "vault",
                  "policy",
                  "rebac",
                  "meter",
                  "sdk-body",
                  "tool",
                  "agent",
                  "lineage"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-vault",
          "group": "Governance, Consent & Security",
          "summary": "Encrypted vault for secrets/keys (envelope encryption)",
          "reuse_when": [
            "vault",
            "secret",
            "encryption",
            "key",
            "kms",
            "envelope"
          ],
          "api_count": 8,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-vault",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/vault/decrypt",
              "requiresAuth": true,
              "summary": "Decrypt an envelope bundle produced by /api/vault/encrypt",
              "payload_shape": [
                "ciphertext_b64",
                "iv_b64",
                "ref",
                "tag_b64",
                "wrapped_dek_b64"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/secrets",
                "POST /api/vault/encrypt"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/vault/encrypt",
              "requiresAuth": true,
              "summary": "Encrypt a base64 plaintext",
              "payload_shape": [
                "plaintext_b64",
                "ref"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/secrets"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/vault/health",
              "requiresAuth": false,
              "summary": "Liveness probe returns sdk + status",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "GET",
              "endpoint": "/api/vault/keys",
              "requiresAuth": true,
              "summary": "List the calling tenant's keys",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/vault/keys",
              "requiresAuth": true,
              "summary": "Issue a root-tier vault key",
              "payload_shape": [
                "algorithm",
                "kms_ref",
                "region",
                "tier"
              ],
              "fieldEnums": {
                "tier": [
                  "root",
                  "app",
                  "pool",
                  "tenant",
                  "person",
                  "device",
                  "encounter"
                ],
                "algorithm": [
                  "AES-256-GCM",
                  "ChaCha20-Poly1305"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/vault/keys/:key_id",
              "requiresAuth": true,
              "summary": "A root-tier key is NOT visible to a tenant token",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/vault/keys/:key_id/rotate",
              "requiresAuth": true,
              "summary": "Rotate a freshly-issued key",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/vault/keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/vault/keys/:key_id/shred",
              "requiresAuth": true,
              "summary": "Cryptographic-shred an issued key",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/vault/keys"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Identity & Access (AIM)",
      "sdk_count": 5,
      "api_count": 67,
      "sdks": [
        {
          "sdk": "sdk-api-keys",
          "group": "Identity & Access (AIM)",
          "summary": "API key issuance, rotation, and scopes",
          "reuse_when": [
            "api key",
            "token",
            "credential",
            "key rotation",
            "scope",
            "service account",
            "application",
            "client credentials",
            "machine to machine",
            "m2m",
            "secret key",
            "pk_live",
            "publishable key",
            "server to server"
          ],
          "api_count": 15,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-api-keys",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/api-keys",
              "requiresAuth": true,
              "summary": "List keys for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/api-keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/api-keys",
              "requiresAuth": true,
              "summary": "Issue a key with crm + engagement scopes",
              "payload_shape": [
                "expires_at",
                "rate_limit_rpm",
                "scopes",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/api-keys/:key_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke the freshly-issued key",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/api-keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/api-keys/:key_id/rotate",
              "requiresAuth": true,
              "summary": "Rotate the freshly-issued key",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/api-keys"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/applications",
              "requiresAuth": true,
              "summary": "List after creating one",
              "payload_shape": [],
              "fieldEnums": {
                "environment": [
                  "live",
                  "test"
                ],
                "status": [
                  "active",
                  "disabled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/applications"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/applications",
              "requiresAuth": true,
              "summary": "Create a live application",
              "payload_shape": [
                "description",
                "environment",
                "name"
              ],
              "fieldEnums": {
                "environment": [
                  "live",
                  "test"
                ],
                "status": [
                  "active",
                  "disabled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/applications/:application_id",
              "requiresAuth": true,
              "summary": "Read the application just created",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "active",
                  "rotating",
                  "revoked",
                  "expired"
                ],
                "environment": [
                  "live",
                  "test"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/applications"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/applications/:application_id",
              "requiresAuth": true,
              "summary": "Rename the application just created",
              "payload_shape": [
                "description",
                "name"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/applications"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/applications/:application_id/disable",
              "requiresAuth": true,
              "summary": "Disable the application and revoke what it owns",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "active",
                  "disabled"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/applications"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/applications/:application_id/keys",
              "requiresAuth": true,
              "summary": "Issue a scoped, rate-limited, expiring key",
              "payload_shape": [
                "expires_at",
                "name",
                "rate_limit_rpm",
                "scopes"
              ],
              "fieldEnums": {
                "scopes": [
                  "sla.clock.read",
                  "sla.clock.write",
                  "sla.policy.read",
                  "crm.contact.read",
                  "notification.send.write"
                ],
                "environment": [
                  "live",
                  "test"
                ],
                "status": [
                  "active",
                  "rotating",
                  "revoked",
                  "expired"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/applications"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/auth/token",
              "requiresAuth": false,
              "summary": "Exchange a key for a service token",
              "payload_shape": [
                "client_id",
                "client_secret",
                "grant_type"
              ],
              "fieldEnums": {
                "grant_type": [
                  "client_credentials"
                ],
                "token_type": [
                  "Bearer"
                ],
                "error": [
                  "invalid_request",
                  "invalid_client",
                  "invalid_scope",
                  "unsupported_grant_type"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/applications",
                "POST /api/applications/{application_id}/keys"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/keys",
              "requiresAuth": true,
              "summary": "List API keys for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/keys",
              "requiresAuth": true,
              "summary": "Issue a new API key for the tenant",
              "payload_shape": [
                "name",
                "scope",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/keys/:key_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke the freshly-issued key",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/keys"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/keys/:key_id/rotate",
              "requiresAuth": true,
              "summary": "Rotate the key just issued",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/keys"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-identity",
          "group": "Identity & Access (AIM)",
          "summary": "Six-layer canonical identity: persons, credentials, authentication",
          "reuse_when": [
            "identity",
            "user",
            "auth",
            "login",
            "person",
            "credential",
            "authentication",
            "account",
            "signup",
            "sign up",
            "register",
            "registration",
            "sign in",
            "session",
            "password",
            "email verification",
            "forgot password",
            "jwt",
            "bearer token",
            "who is logged in",
            "same person across tenants",
            "one email one person"
          ],
          "api_count": 21,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-identity",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/.well-known/jwks.json",
              "requiresAuth": false,
              "summary": "JWKS keys array",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "GET",
              "endpoint": "/.well-known/openid-configuration",
              "requiresAuth": false,
              "summary": "Discovery doc shape",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/auth/login",
              "requiresAuth": false,
              "summary": "Login with previously registered credentials",
              "payload_shape": [
                "email",
                "password"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/auth/register",
              "requiresAuth": false,
              "summary": "Register new user with email, password, name and phone",
              "payload_shape": [
                "display_name",
                "email",
                "family_name",
                "given_name",
                "password",
                "phone"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/auth/send-verification-email",
              "requiresAuth": false,
              "summary": "Send (or resend) an email-verification link",
              "payload_shape": [
                "email",
                "userId"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/auth/signup-tenant",
              "requiresAuth": false,
              "summary": "Self-serve signup with company, founder name and phone",
              "payload_shape": [
                "company_name",
                "display_name",
                "email",
                "family_name",
                "given_name",
                "password",
                "phone",
                "region"
              ],
              "fieldEnums": {
                "region": [
                  "us-east-1",
                  "us-west-2",
                  "eu-west-1",
                  "ap-south-1"
                ]
              },
              "dependsOn": []
            },
            {
              "method": "GET",
              "endpoint": "/api/auth/verification-status",
              "requiresAuth": false,
              "summary": "Check whether an email is verified before login",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/auth/verify-email",
              "requiresAuth": false,
              "summary": "Confirm the email-verification token from the link",
              "payload_shape": [
                "token"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/identity/aliases",
              "requiresAuth": true,
              "summary": "Attach a phone alias to the registered person",
              "payload_shape": [
                "kind",
                "person_id",
                "value"
              ],
              "fieldEnums": {
                "kind": [
                  "email",
                  "phone",
                  "gov_id",
                  "biometric_template_ref",
                  "social_idp_subject",
                  "saml_nameid"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/impersonation/:grant_id/approve",
              "requiresAuth": true,
              "summary": "Approve with manager approval + customer consent refs",
              "payload_shape": [
                "customer_consent_ref",
                "manager_approval_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/impersonation/request"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/impersonation/:grant_id/end",
              "requiresAuth": true,
              "summary": "End the active impersonation session",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/impersonation/request",
                "POST /api/impersonation/:grant_id/approve"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/impersonation/request",
              "requiresAuth": true,
              "summary": "Support engineer requests 30min impersonation",
              "payload_shape": [
                "duration_minutes",
                "support_user_id",
                "target_tenant_id",
                "ticket_ref"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/me/profile",
              "requiresAuth": true,
              "summary": "Update name/phone/avatar for the signed-up founder",
              "payload_shape": [
                "avatar",
                "display_name",
                "family_name",
                "given_name",
                "phone"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/memberships",
              "requiresAuth": true,
              "summary": "A signed-in person sees their memberships",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/mfa/challenge",
              "requiresAuth": true,
              "summary": "Issue a TOTP challenge",
              "payload_shape": [
                "kind"
              ],
              "fieldEnums": {
                "kind": [
                  "totp",
                  "webauthn",
                  "sms_otp"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/mfa/verify",
              "requiresAuth": false,
              "summary": "Verify a 6-digit TOTP response",
              "payload_shape": [
                "challenge_id",
                "response"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/mfa/challenge"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/userinfo",
              "requiresAuth": true,
              "summary": "Userinfo for the freshly-registered subject (name/email/roles)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/saml/:tenant_id/acs",
              "requiresAuth": false,
              "summary": "Mock-adapter assertion JIT-provisions a person",
              "payload_shape": [
                "attributes",
                "email",
                "groups",
                "name_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/saml/:tenant_id/metadata",
              "requiresAuth": false,
              "summary": "Metadata XML for a known tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/scim/v2/Users",
              "requiresAuth": true,
              "summary": "Provision a new user via SCIM 2.0",
              "payload_shape": [
                "active",
                "emails",
                "groups",
                "name",
                "schemas",
                "userName"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "DELETE",
              "endpoint": "/scim/v2/Users/:person_id",
              "requiresAuth": true,
              "summary": "Deprovision a SCIM-provisioned user (offboards tenant membership)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /scim/v2/Users"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-identity-resolver",
          "group": "Identity & Access (AIM)",
          "summary": "Identity resolution / EMPI / MDM matching and merge",
          "reuse_when": [
            "identity resolution",
            "empi",
            "mdm",
            "match",
            "dedupe",
            "merge",
            "golden record"
          ],
          "api_count": 8,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-identity-resolver",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/empi/candidate-links",
              "requiresAuth": true,
              "summary": "List candidate links in the high-confidence band",
              "payload_shape": [],
              "fieldEnums": {
                "band": [
                  "high",
                  "medium",
                  "low"
                ],
                "status": [
                  "open",
                  "merged",
                  "rejected",
                  "superseded"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/empi/candidate-links/:link_id/adjudicate",
              "requiresAuth": true,
              "summary": "Steward approves a candidate link (triggers reversible merge)",
              "payload_shape": [
                "decision",
                "reason",
                "step_id"
              ],
              "fieldEnums": {
                "decision": [
                  "approve",
                  "reject"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/empi/candidate-links/:link_id/steward-review"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/empi/candidate-links/:link_id/steward-review",
              "requiresAuth": true,
              "summary": "Queue a candidate link for steward review",
              "payload_shape": [
                "route_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/approvals/routes"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/empi/merges",
              "requiresAuth": true,
              "summary": "Merge two person records (event-sourced, reversible)",
              "payload_shape": [
                "link_id",
                "merged_person_id",
                "reason",
                "surviving_person_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/empi/merges/:merge_id/unmerge",
              "requiresAuth": true,
              "summary": "Reverse a prior merge via compensating event",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/empi/merges"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/empi/metrics",
              "requiresAuth": true,
              "summary": "Read EMPI observability metrics",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/resolver/explain",
              "requiresAuth": true,
              "summary": "Explain primary_persona_id provenance",
              "payload_shape": [
                "app_id",
                "attribute",
                "person_id",
                "tenant_id"
              ],
              "fieldEnums": {
                "attribute": [
                  "primary_persona_id",
                  "all_persona_ids",
                  "effective_role_closure",
                  "active_consents",
                  "admin_pool_index",
                  "app_pool_index",
                  "rebac_edges",
                  "abac_attributes"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/resolver/resolve",
              "requiresAuth": true,
              "summary": "Resolve identity context",
              "payload_shape": [
                "app_id",
                "bypass_cache",
                "person_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /scim/v2/Users"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-persona",
          "group": "Identity & Access (AIM)",
          "summary": "Personas — role-scoped identity facets (L4)",
          "reuse_when": [
            "persona",
            "role",
            "identity facet",
            "actor",
            "profile role",
            "app user",
            "end user",
            "member",
            "seat",
            "user role",
            "acting identity",
            "persona id",
            "one user many apps",
            "join another tenant",
            "switch tenant"
          ],
          "api_count": 17,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-persona",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/app-identities",
              "requiresAuth": true,
              "summary": "Create app_identity for person + app",
              "payload_shape": [
                "app_id",
                "person_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/app-identities/:app_identity_id",
              "requiresAuth": true,
              "summary": "Get app_identity by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/app-identities/:app_identity_id/memberships",
              "requiresAuth": true,
              "summary": "List memberships",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/memberships",
              "requiresAuth": true,
              "summary": "Create membership",
              "payload_shape": [
                "app_identity_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/memberships/:membership_id/personas",
              "requiresAuth": true,
              "summary": "List personas",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities",
                "POST /api/memberships"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/memberships/:membership_id/terminate",
              "requiresAuth": true,
              "summary": "Terminate membership",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities",
                "POST /api/memberships"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/personas",
              "requiresAuth": true,
              "summary": "List tenant members for a tenant_id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/personas",
              "requiresAuth": true,
              "summary": "Create patient persona",
              "payload_shape": [
                "bu_id",
                "kind",
                "membership_id",
                "persona_key_ref",
                "primary_role_template_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/personas/:persona_id",
              "requiresAuth": true,
              "summary": "Get persona",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/personas/:persona_id/bu",
              "requiresAuth": true,
              "summary": "Set persona business unit",
              "payload_shape": [
                "bu_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/personas/:persona_id/deactivate",
              "requiresAuth": true,
              "summary": "Deactivate persona",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/personas/:persona_id/role",
              "requiresAuth": true,
              "summary": "Set persona role label",
              "payload_shape": [
                "role"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas",
                "POST /api/role-templates"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/personas/:persona_id/roles",
              "requiresAuth": true,
              "summary": "List persona roles",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/personas/:persona_id/shred",
              "requiresAuth": true,
              "summary": "Shred persona independent of person",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "POST /api/memberships",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/persons/:person_id/app-identities",
              "requiresAuth": true,
              "summary": "List app identities",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/persons/:person_id/devices",
              "requiresAuth": true,
              "summary": "List devices",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/role-templates/:role_template_id/holders",
              "requiresAuth": true,
              "summary": "List role holders for a tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-profile",
          "group": "Identity & Access (AIM)",
          "summary": "User/persona profiles and preferences",
          "reuse_when": [
            "profile",
            "preferences",
            "user profile",
            "settings"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-profile",
          "apis": [
            {
              "method": "PUT",
              "endpoint": "/api/profile/bands",
              "requiresAuth": true,
              "summary": "Upsert profile band",
              "payload_shape": [
                "app_identity_id",
                "band_kind",
                "fields_envelope",
                "tenant_id"
              ],
              "fieldEnums": {
                "band_kind": [
                  "profile",
                  "preference",
                  "notification_routing"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/app-identities"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/profile/bands/:app_identity_id/:band_kind",
              "requiresAuth": true,
              "summary": "Read profile band for app_identity",
              "payload_shape": [],
              "fieldEnums": {
                "band_kind": [
                  "profile",
                  "preference",
                  "notification_routing"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/app-identities",
                "PUT /api/profile/bands"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/profile/secure-data/:person_id",
              "requiresAuth": true,
              "summary": "Read secure data",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/profile/secure-data/set-field"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/profile/secure-data/:person_id/shred-history",
              "requiresAuth": true,
              "summary": "List shred history",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/profile/secure-data/set-field",
                "POST /api/profile/secure-data/shred-field"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/profile/secure-data/set-field",
              "requiresAuth": true,
              "summary": "Set PAN field envelope",
              "payload_shape": [
                "envelope",
                "field_name",
                "person_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/profile/secure-data/shred-field",
              "requiresAuth": true,
              "summary": "Shred PAN field",
              "payload_shape": [
                "audit_entry_id",
                "field_name",
                "person_id",
                "reason"
              ],
              "fieldEnums": {
                "reason": [
                  "retention-expiry",
                  "dsar-erasure",
                  "operator-request"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/profile/secure-data/set-field"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "AI & Agents",
      "sdk_count": 7,
      "api_count": 54,
      "sdks": [
        {
          "sdk": "sdk-agent-runtime",
          "group": "AI & Agents",
          "summary": "Agent runtime: plan/execute, capability graph, capability tokens",
          "reuse_when": [
            "agent",
            "ai agent",
            "runtime",
            "plan",
            "execute",
            "autonomous",
            "capability",
            "tool"
          ],
          "api_count": 12,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-agent-runtime",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/agent-runtime/agents",
              "requiresAuth": true,
              "summary": "List agent definitions",
              "payload_shape": [],
              "fieldEnums": {
                "tier": [
                  "sync",
                  "orchestration",
                  "batch"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/agents",
              "requiresAuth": true,
              "summary": "Create agent definition",
              "payload_shape": [
                "acting_persona_id",
                "agent_scope",
                "created_by",
                "default_ttl_seconds",
                "description",
                "kill_switch_flag_id",
                "name",
                "tenant_id",
                "tier",
                "tool_manifest",
                "vector_namespace"
              ],
              "fieldEnums": {
                "tier": [
                  "sync",
                  "orchestration",
                  "batch"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/agent-runtime/agents/:id",
              "requiresAuth": true,
              "summary": "Get agent definition",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/agent-runtime/agents"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/agent-runtime/health",
              "requiresAuth": true,
              "summary": "Agent runtime health check",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/agent-runtime/runs",
              "requiresAuth": true,
              "summary": "List agent runs",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "running",
                  "completed",
                  "failed",
                  "terminated_ttl_expired",
                  "terminated_kill_switch",
                  "terminated_quota"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/runs",
              "requiresAuth": true,
              "summary": "Start agent run",
              "payload_shape": [
                "actor_id",
                "actor_kind",
                "agent_id",
                "parent_run_id",
                "persona_id",
                "trace_id",
                "ttl_seconds"
              ],
              "fieldEnums": {
                "actor_kind": [
                  "human",
                  "service",
                  "agent"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/personas",
                "POST /api/agent-runtime/agents"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/agent-runtime/runs/:id",
              "requiresAuth": true,
              "summary": "Get agent run",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/agent-runtime/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/runs/:run_id/replay",
              "requiresAuth": true,
              "summary": "Replay a freshly-started run (no execution log yet) returns 404",
              "payload_shape": [
                "current_model_snapshot_id",
                "dryRun"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/personas",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/runs/:run_id/rollback",
              "requiresAuth": true,
              "summary": "Roll back a freshly-started run (empty action journal) returns 200",
              "payload_shape": [
                "actor_id",
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/personas",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/tokens",
              "requiresAuth": true,
              "summary": "Mint capability token",
              "payload_shape": [
                "acting_persona_id",
                "actor_id",
                "agent_id",
                "args",
                "run_id",
                "tenant_scope",
                "tool_sku",
                "ttl_seconds"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/tokens/:token_id/revoke",
              "requiresAuth": true,
              "summary": "Revoke a capability token",
              "payload_shape": [
                "actor_id",
                "actor_kind",
                "reason"
              ],
              "fieldEnums": {
                "actor_kind": [
                  "human",
                  "service",
                  "agent"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs",
                "POST /api/agent-runtime/tokens"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/agent-runtime/tokens/:token_id/validate",
              "requiresAuth": true,
              "summary": "Validate freshly-minted token",
              "payload_shape": [
                "args"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs",
                "POST /api/agent-runtime/tokens"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-ai-gateway",
          "group": "AI & Agents",
          "summary": "Multi-LLM AI gateway with tenant BYOK provider keys",
          "reuse_when": [
            "ai",
            "llm",
            "openai",
            "anthropic",
            "model",
            "completion",
            "byok",
            "provider key",
            "inference"
          ],
          "api_count": 10,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-ai-gateway",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/ai-gateway/complete",
              "requiresAuth": true,
              "summary": "Completion records consent + budget + redaction + trace",
              "payload_shape": [
                "context",
                "request"
              ],
              "fieldEnums": {
                "request.provider_hint": [
                  "anthropic",
                  "openai",
                  "gemini",
                  "bedrock",
                  "local-llama",
                  "local-mistral"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/ai-gateway/health",
              "requiresAuth": false,
              "summary": "Health probe returns ok",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/ai-gateway/stream",
              "requiresAuth": true,
              "summary": "SSE stream produces chunks and final completion row",
              "payload_shape": [
                "context",
                "request"
              ],
              "fieldEnums": {
                "request.provider_hint": [
                  "anthropic",
                  "openai",
                  "gemini",
                  "bedrock",
                  "local-llama",
                  "local-mistral"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/agent-runtime/agents",
                "POST /api/agent-runtime/runs"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/ai-gateway/tenant-credentials",
              "requiresAuth": true,
              "summary": "List bindings for a tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/ai-gateway/tenant-credentials"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/ai-gateway/tenant-credentials",
              "requiresAuth": true,
              "summary": "Bind an OpenAI key for the tenant",
              "payload_shape": [
                "fallback_on_error",
                "model_allowlist",
                "provider_id",
                "raw_key",
                "tenant_id"
              ],
              "fieldEnums": {
                "provider_id": [
                  "anthropic",
                  "openai",
                  "bedrock",
                  "gemini"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "DELETE",
              "endpoint": "/api/ai-gateway/tenant-credentials/:binding_id",
              "requiresAuth": true,
              "summary": "Revoke an active binding with a reason",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/ai-gateway/tenant-credentials"
              ]
            },
            {
              "method": "PATCH",
              "endpoint": "/api/ai-gateway/tenant-credentials/:binding_id",
              "requiresAuth": true,
              "summary": "Rotate the raw key on an existing binding",
              "payload_shape": [
                "raw_key"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/ai-gateway/tenant-credentials"
              ]
            },
            {
              "method": "EVENT_CONTRACT",
              "endpoint": "events://ai_gateway.tenant_credential",
              "requiresAuth": false,
              "summary": "Three event types registered with regulated retention",
              "payload_shape": [
                "conflict_policy",
                "event_types",
                "retention_class"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "INTERNAL_FUNCTION",
              "endpoint": "internal://sdk-ai-gateway/completionService.emitCompletionEvent",
              "requiresAuth": false,
              "summary": "Tenant credential completion stamps credential_source=tenant and bills 0 markup",
              "payload_shape": [
                "expected_audit_payload_field",
                "expected_billed_cost",
                "expected_governance_sku_emitted",
                "expected_token_sku_emitted",
                "scenario"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "INTERNAL_FUNCTION",
              "endpoint": "internal://sdk-ai-gateway/completionService.loadProviderRow",
              "requiresAuth": false,
              "summary": "Tenant active binding → tenant credential",
              "payload_shape": [
                "expected_credential_source",
                "model",
                "provider_id",
                "tenant_binding",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": []
            }
          ]
        },
        {
          "sdk": "sdk-ingest",
          "group": "AI & Agents",
          "summary": "Data ingestion pipelines",
          "reuse_when": [
            "ingest",
            "ingestion",
            "import",
            "etl",
            "pipeline",
            "load data"
          ],
          "api_count": 3,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-ingest",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/ingest/:entity/batch",
              "requiresAuth": true,
              "summary": "Land a one-record batch for an entity (idempotent upsert)",
              "payload_shape": [
                "idempotency_key",
                "mode",
                "records"
              ],
              "fieldEnums": {
                "mode": [
                  "upsert",
                  "insert"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/ingest/customer/batch",
              "requiresAuth": true,
              "summary": "Bulk upsert customer records with idempotency key",
              "payload_shape": [
                "entity",
                "idempotency_key",
                "mode",
                "records"
              ],
              "fieldEnums": {
                "mode": [
                  "upsert",
                  "insert"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/ingest/sensor-readings/batch",
              "requiresAuth": true,
              "summary": "Idempotent batch of catalog-valid sensor readings",
              "payload_shape": [
                "idempotency_key",
                "readings",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-mcp-bridge",
          "group": "AI & Agents",
          "summary": "MCP bridge — expose tools to agents via the Model Context Protocol",
          "reuse_when": [
            "mcp",
            "tool",
            "agent tool",
            "bridge",
            "model context protocol"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-mcp-bridge",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/mcp/health",
              "requiresAuth": false,
              "summary": "Health probe returns sdk marker",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "GET",
              "endpoint": "/api/mcp/server-registrations",
              "requiresAuth": true,
              "summary": "List MCP server registrations for a tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/mcp/server-registrations",
              "requiresAuth": true,
              "summary": "Register a synthetic Slack MCP server",
              "payload_shape": [
                "allowed_agent_ids",
                "credential_envelope_b64",
                "display_name",
                "endpoint_url",
                "tenant_id",
                "transport"
              ],
              "fieldEnums": {
                "transport": [
                  "http",
                  "sse",
                  "stdio"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/mcp/server-registrations/:id",
              "requiresAuth": true,
              "summary": "Read a registered MCP server by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/mcp/server-registrations"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/mcp/server-registrations/:id/disable",
              "requiresAuth": true,
              "summary": "Disable a registered MCP server",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/mcp/server-registrations"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/mcp/tools/:tool_id/invoke",
              "requiresAuth": true,
              "summary": "Invoke an MCP tool via capability token",
              "payload_shape": [
                "agent_run_id",
                "args",
                "capability_token_id",
                "trace_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/mcp/server-registrations",
                "POST /api/agent-runtime/runs",
                "POST /api/agent-runtime/tokens"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-search",
          "group": "AI & Agents",
          "summary": "Search / query across resources",
          "reuse_when": [
            "search",
            "query",
            "find",
            "full-text",
            "lookup"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-search",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/search",
              "requiresAuth": true,
              "summary": "Query encounters with free text",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/search/index"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/search",
              "requiresAuth": true,
              "summary": "Query encounter entities",
              "payload_shape": [
                "dsl",
                "entity_kind",
                "from",
                "q",
                "size"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/search/index"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/search/health",
              "requiresAuth": false,
              "summary": "Report search backend availability",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/search/index",
              "requiresAuth": true,
              "summary": "Register encounter entity index",
              "payload_shape": [
                "entity_kind",
                "field_mappings",
                "opensearch_alias",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/search/saved-queries",
              "requiresAuth": true,
              "summary": "List my saved queries",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/search/saved-queries"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/search/saved-queries",
              "requiresAuth": true,
              "summary": "Save my-open-encounters query",
              "payload_shape": [
                "dsl",
                "name",
                "persona_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-taxonomy",
          "group": "AI & Agents",
          "summary": "Taxonomies, categories, and classification",
          "reuse_when": [
            "taxonomy",
            "category",
            "classification",
            "tag",
            "hierarchy"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-taxonomy",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/taxonomy/extraction-schemas",
              "requiresAuth": true,
              "summary": "Lookup active extraction schema by document_kind (tenant with platform fallback)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/taxonomy/health",
              "requiresAuth": false,
              "summary": "Health check returns sdk + status ok",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "GET",
              "endpoint": "/api/taxonomy/prompt-templates",
              "requiresAuth": true,
              "summary": "Lookup active prompt template by purpose_tag (tenant with platform fallback)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/taxonomy/versions/:taxonomy_version_id/activate",
              "requiresAuth": true,
              "summary": "Activate a taxonomy version (demotes prior active version to deprecated)",
              "payload_shape": [
                "taxonomy_version_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "semantic-service",
          "group": "AI & Agents",
          "summary": "Semantic/ontology + embeddings + vector search (RAG)",
          "reuse_when": [
            "semantic",
            "embedding",
            "vector",
            "ontology",
            "similarity",
            "rag",
            "knowledge"
          ],
          "api_count": 13,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-semantic-service",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/build/plan",
              "requiresAuth": true,
              "summary": "Compose a plan for a financial accounting app",
              "payload_shape": [
                "intent"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/bridge",
              "requiresAuth": true,
              "summary": "List all registered cross-domain bridges",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/bridge",
              "requiresAuth": true,
              "summary": "Register a cross-domain bridge between two object types",
              "payload_shape": [
                "access_mode",
                "from_object_type_id",
                "requires_cross_tenant_consent",
                "to_object_type_id"
              ],
              "fieldEnums": {
                "access_mode": [
                  "read-only",
                  "read-write"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /ontology/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/intent/plan",
              "requiresAuth": true,
              "summary": "Plan a goal that matches a seeded capability edge (subject Patient)",
              "payload_shape": [
                "agent_run_id",
                "intent"
              ],
              "fieldEnums": {
                "status": [
                  "proposed",
                  "approved",
                  "executing",
                  "completed",
                  "abandoned"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /ontology/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/ontology",
              "requiresAuth": true,
              "summary": "List all registered ontologies",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /ontology/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/ontology/:id/deprecate",
              "requiresAuth": true,
              "summary": "Deprecate a registered ontology version",
              "payload_shape": [
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /ontology/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/ontology/:name/active",
              "requiresAuth": true,
              "summary": "Fetch the active ontology by name (seeded always-active ontology)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/ontology/register",
              "requiresAuth": true,
              "summary": "Register a self-contained domain ontology bundle (activate on register)",
              "payload_shape": [
                "activate",
                "bundle",
                "bundle_ref"
              ],
              "fieldEnums": {
                "cardinality": [
                  "1:1",
                  "1:N",
                  "N:N"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/plan/:id",
              "requiresAuth": true,
              "summary": "Read a plan produced by POST /intent/plan",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /ontology/register",
                "POST /intent/plan"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/plan/:id/status",
              "requiresAuth": true,
              "summary": "Advance a freshly-proposed plan to approved",
              "payload_shape": [
                "status"
              ],
              "fieldEnums": {
                "status": [
                  "proposed",
                  "approved",
                  "executing",
                  "completed",
                  "abandoned"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /ontology/register",
                "POST /intent/plan"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/policy",
              "requiresAuth": true,
              "summary": "List registered semantic policies",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/policy/:id/evaluate",
              "requiresAuth": true,
              "summary": "Evaluate an active semantic policy (happy path)",
              "payload_shape": [
                "action",
                "active_edges",
                "resource_id",
                "resource_type",
                "subject_id",
                "subject_type",
                "trace_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /policy/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/policy/register",
              "requiresAuth": true,
              "summary": "Register + activate a Doctor→Prescription semantic policy",
              "payload_shape": [
                "activate",
                "description",
                "iql_source",
                "name",
                "ontology_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /ontology/register"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Native HDK (mobile / edge)",
      "sdk_count": 11,
      "api_count": 28,
      "sdks": [
        {
          "sdk": "hdk-camera",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device camera capture (HDK)",
          "reuse_when": [
            "camera",
            "capture",
            "photo",
            "scan",
            "mobile camera"
          ],
          "api_count": 2,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-camera",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/camera/capabilities",
              "requiresAuth": true,
              "summary": "List native camera capabilities",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk/camera/recording-presets",
              "requiresAuth": true,
              "summary": "List camera recording presets",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-diagnostic",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device diagnostics (HDK)",
          "reuse_when": [
            "diagnostic",
            "device diagnostic",
            "hardware check"
          ],
          "api_count": 2,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-diagnostic",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/hdk-diagnostic/drain",
              "requiresAuth": true,
              "summary": "Drain queue",
              "payload_shape": [
                "limit"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk-diagnostic/events",
              "requiresAuth": true,
              "summary": "Capture event",
              "payload_shape": [
                "category",
                "device_uuid",
                "occurred_at",
                "payload"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-idp",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device identity/document proofing (HDK)",
          "reuse_when": [
            "idp",
            "id verification",
            "document proofing",
            "kyc",
            "id scan"
          ],
          "api_count": 3,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-idp",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/hdk-idp/claims",
              "requiresAuth": true,
              "summary": "Register claim",
              "payload_shape": [
                "biometric_template_envelope",
                "device_uuid",
                "person_id",
                "pin_envelope"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /scim/v2/Users"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk-idp/devices/:device_uuid/claims",
              "requiresAuth": true,
              "summary": "List claims",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/hdk-idp/claims"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk-idp/offline-auth/log",
              "requiresAuth": true,
              "summary": "Sync biometric offline-auth",
              "payload_shape": [
                "device_uuid",
                "method",
                "occurred_at",
                "person_id"
              ],
              "fieldEnums": {
                "method": [
                  "biometric",
                  "pin",
                  "passkey"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/hdk-idp/claims"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-image-editor",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device image editing (HDK)",
          "reuse_when": [
            "image editor",
            "crop",
            "edit image",
            "annotate"
          ],
          "api_count": 1,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-image-editor",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/image-editor/capabilities",
              "requiresAuth": true,
              "summary": "List native image-editor capabilities",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-map",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device maps (HDK)",
          "reuse_when": [
            "map",
            "navigation",
            "location",
            "offline map"
          ],
          "api_count": 2,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-map",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/map/capabilities",
              "requiresAuth": true,
              "summary": "List native map capabilities",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk/map/tile-providers",
              "requiresAuth": true,
              "summary": "List map tile providers",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-measure",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device AR measurement (HDK)",
          "reuse_when": [
            "measure",
            "ar",
            "dimension",
            "distance",
            "measurement"
          ],
          "api_count": 3,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-measure",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/measure",
              "requiresAuth": true,
              "summary": "List measurements for a capture",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/hdk/measure"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk/measure",
              "requiresAuth": true,
              "summary": "Record an AR measurement",
              "payload_shape": [
                "accuracy_class",
                "capture_id",
                "captured_at",
                "device_uuid",
                "kind",
                "tenant_id",
                "unit",
                "value"
              ],
              "fieldEnums": {
                "kind": [
                  "area",
                  "distance",
                  "volume"
                ],
                "accuracy_class": [
                  "high",
                  "medium",
                  "low"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk/measure/:id",
              "requiresAuth": true,
              "summary": "Fetch one measurement by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/hdk/measure"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-permissions",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device permission prompts (HDK)",
          "reuse_when": [
            "permissions",
            "device permission",
            "access prompt"
          ],
          "api_count": 2,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-permissions",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk-permissions/devices/:device_uuid/latest",
              "requiresAuth": true,
              "summary": "Get latest snapshot",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/hdk-permissions/snapshots"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk-permissions/snapshots",
              "requiresAuth": true,
              "summary": "Capture surface",
              "payload_shape": [
                "device_uuid",
                "permission_set",
                "persona_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-scanner",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device barcode/QR scanner (HDK)",
          "reuse_when": [
            "scanner",
            "barcode",
            "qr",
            "scan code"
          ],
          "api_count": 1,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-scanner",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/scanner/capabilities",
              "requiresAuth": true,
              "summary": "List native scanner capabilities",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-sync",
          "group": "Native HDK (mobile / edge)",
          "summary": "Offline-first data sync (HDK)",
          "reuse_when": [
            "sync",
            "offline",
            "offline-first",
            "replication",
            "conflict"
          ],
          "api_count": 8,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-sync",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/hdk-sync/conflicts/resolve",
              "requiresAuth": true,
              "summary": "Resolve CRDT note conflict",
              "payload_shape": [
                "event_type",
                "input_a",
                "input_b"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "PUT /api/hdk-sync/event-type-policies"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk-sync/event-type-policies",
              "requiresAuth": true,
              "summary": "List policies",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/hdk-sync/event-type-policies",
              "requiresAuth": true,
              "summary": "Register RGA-text policy for clinical notes",
              "payload_shape": [
                "conflict_policy",
                "event_type",
                "retention_class",
                "strategy_detail"
              ],
              "fieldEnums": {
                "conflict_policy": [
                  "crdt",
                  "lww",
                  "merge",
                  "event-sourcing",
                  "human-review"
                ],
                "retention_class": [
                  "transient",
                  "operational",
                  "regulated"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk-sync/event-type-policies/:event_type",
              "requiresAuth": true,
              "summary": "Get clinical note policy",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "PUT /api/hdk-sync/event-type-policies"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk-sync/human-review/:task_id/resolve",
              "requiresAuth": true,
              "summary": "Mark task resolved",
              "payload_shape": [
                "resolved_value",
                "status"
              ],
              "fieldEnums": {
                "status": [
                  "open",
                  "in-review",
                  "resolved",
                  "rejected"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "PUT /api/hdk-sync/event-type-policies",
                "POST /api/hdk-sync/conflicts/resolve"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk-sync/human-review/open",
              "requiresAuth": true,
              "summary": "List open review tasks",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk-sync/replay/:batch_id/complete",
              "requiresAuth": true,
              "summary": "Complete replay",
              "payload_shape": [
                "conflict_count"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/hdk-sync/replay/start"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk-sync/replay/start",
              "requiresAuth": true,
              "summary": "Start replay with one envelope",
              "payload_shape": [
                "device_uuid",
                "envelopes",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "PUT /api/hdk-sync/event-type-policies"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-video-editor",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device video editing (HDK)",
          "reuse_when": [
            "video editor",
            "trim",
            "edit video"
          ],
          "api_count": 1,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-video-editor",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/video-editor/capabilities",
              "requiresAuth": true,
              "summary": "List native video-editor capabilities",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            }
          ]
        },
        {
          "sdk": "hdk-watermark",
          "group": "Native HDK (mobile / edge)",
          "summary": "On-device watermarking (HDK)",
          "reuse_when": [
            "watermark",
            "stamp",
            "overlay",
            "brand image"
          ],
          "api_count": 3,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-hdk-watermark",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/hdk/watermark",
              "requiresAuth": true,
              "summary": "List watermark applications for a variant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/hdk/watermark"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/hdk/watermark",
              "requiresAuth": true,
              "summary": "Record a watermark application",
              "payload_shape": [
                "payload_envelope",
                "scheme",
                "tenant_id",
                "variant_id"
              ],
              "fieldEnums": {
                "scheme": [
                  "visible",
                  "invisible",
                  "cryptographic"
                ]
              },
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/hdk/watermark/:id",
              "requiresAuth": true,
              "summary": "Fetch one watermark application by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant",
                "POST /api/hdk/watermark"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Connectors & Integration",
      "sdk_count": 1,
      "api_count": 22,
      "sdks": [
        {
          "sdk": "sdk-connectors",
          "group": "Connectors & Integration",
          "summary": "Enterprise connector framework (Salesforce, Slack, M365, Snowflake, …)",
          "reuse_when": [
            "connector",
            "integration",
            "salesforce",
            "slack",
            "m365",
            "snowflake",
            "sync",
            "third-party",
            "external system",
            "lead form",
            "meta",
            "facebook",
            "instagram",
            "linkedin",
            "tiktok",
            "google ads",
            "web chat",
            "webhook ingest"
          ],
          "api_count": 22,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-connectors",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/connectors",
              "requiresAuth": true,
              "summary": "List connector installs for a tenant (tenant-scoped query)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register",
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/dlq/replay",
              "requiresAuth": true,
              "summary": "Bulk-replay a tenant's dead-lettered syncs",
              "payload_shape": [
                "connector_kind",
                "tenant_id"
              ],
              "fieldEnums": {
                "connector_kind": [
                  "slack",
                  "salesforce",
                  "jira",
                  "github",
                  "hubspot",
                  "linear",
                  "microsoft365",
                  "snowflake",
                  "zendesk",
                  "zoom",
                  "gworkspace"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/dlq/retry-tick",
              "requiresAuth": true,
              "summary": "Run a retry tick (nothing due -> zero counts)",
              "payload_shape": [
                "batch_size"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/inbound/:kind",
              "requiresAuth": false,
              "summary": "Subscription-verification handshake echoes the challenge",
              "payload_shape": [
                "challenge",
                "type"
              ],
              "fieldEnums": {
                "kind": [
                  "slack",
                  "salesforce",
                  "jira",
                  "github",
                  "hubspot",
                  "linear",
                  "microsoft365",
                  "snowflake",
                  "zendesk",
                  "zoom",
                  "gworkspace"
                ]
              },
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/installs",
              "requiresAuth": true,
              "summary": "Install slack connector",
              "payload_shape": [
                "connector_kind",
                "credential_ref",
                "display_name",
                "installed_by",
                "tenant_id",
                "vendor_account_id"
              ],
              "fieldEnums": {
                "connector_kind": [
                  "slack",
                  "salesforce",
                  "jira",
                  "github",
                  "hubspot",
                  "linear",
                  "microsoft365",
                  "snowflake",
                  "zendesk",
                  "zoom",
                  "gworkspace"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/installs/:install_id",
              "requiresAuth": true,
              "summary": "Read a connector install by id",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/connectors/installs"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/installs/:install_id/health",
              "requiresAuth": true,
              "summary": "Health snapshot for a freshly installed connector",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/connectors/installs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/installs/:install_id/sync",
              "requiresAuth": true,
              "summary": "Sync a connector install (slack stub returns 0 records when unconfigured)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/connectors/installs"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/installs/:install_id/tools",
              "requiresAuth": true,
              "summary": "List tool manifest for an install",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/connectors/installs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/installs/:install_id/tools/call",
              "requiresAuth": true,
              "summary": "Invoke a connector tool by name (slack stub returns NotConfigured payload with 200)",
              "payload_shape": [
                "args",
                "tool_name"
              ],
              "fieldEnums": {
                "tool_name": [
                  "slack.message.post",
                  "slack.channel.list",
                  "slack.user.lookup",
                  "slack.thread.reply"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/connectors/installs"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/installs/:install_id/uninstall",
              "requiresAuth": true,
              "summary": "Uninstall a connector install",
              "payload_shape": [
                "actor_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/connectors/installs"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/kinds",
              "requiresAuth": true,
              "summary": "List registered connector adapter kinds",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/lead-forms/:tenant_id",
              "requiresAuth": true,
              "summary": "List all archived deliveries for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/lead-forms/:tenant_id/:platform",
              "requiresAuth": false,
              "summary": "Meta lead form with valid signature is accepted and archived",
              "payload_shape": [
                "entry"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/lead-forms/:tenant_id/events/:event_id/reprocess",
              "requiresAuth": true,
              "summary": "Re-process a previously rejected delivery",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/lead-forms/:tenant_id/website",
              "requiresAuth": false,
              "summary": "Chat lead with transcript and human handoff",
              "payload_shape": [
                "event_id",
                "event_kind",
                "fields",
                "form_id",
                "form_version",
                "handoff",
                "page_title",
                "page_url",
                "permissions",
                "referrer",
                "session_id",
                "submitted_at",
                "transcript",
                "utm_campaign",
                "utm_medium",
                "utm_source"
              ],
              "fieldEnums": {},
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/slack/events",
              "requiresAuth": false,
              "summary": "URL verification handshake (no signature required)",
              "payload_shape": [
                "challenge",
                "type"
              ],
              "fieldEnums": {
                "type": [
                  "url_verification",
                  "event_callback"
                ]
              },
              "dependsOn": []
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/slack/install",
              "requiresAuth": true,
              "summary": "OAuth exchange returns 503 when SLACK_CLIENT_ID/SECRET not configured",
              "payload_shape": [
                "code",
                "redirect_uri"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/slack/post-message",
              "requiresAuth": true,
              "summary": "postMessage returns 400 SlackError when SLACK_BOT_TOKEN not configured",
              "payload_shape": [
                "channel",
                "text"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/register"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/tenants/:tenant_id/dlq",
              "requiresAuth": true,
              "summary": "List a tenant's DLQ (empty is a valid result)",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "dlq",
                  "retrying",
                  "resolved",
                  "discarded"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/connectors/tenants/:tenant_id/dlq/reconcile",
              "requiresAuth": true,
              "summary": "Reconcile a tenant's DLQ (clean queue -> zero counts)",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/connectors/tenants/:tenant_id/installs",
              "requiresAuth": true,
              "summary": "List connector installs for a tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        }
      ]
    },
    {
      "name": "Billing, Metering & Analytics",
      "sdk_count": 5,
      "api_count": 30,
      "sdks": [
        {
          "sdk": "sdk-analytics",
          "group": "Billing, Metering & Analytics",
          "summary": "Analytics rollups and reporting",
          "reuse_when": [
            "analytics",
            "report",
            "metrics",
            "dashboard",
            "aggregate",
            "insight"
          ],
          "api_count": 6,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-analytics",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/analytics/builds/:build_id/export",
              "requiresAuth": true,
              "summary": "Export a built dataset to the warehouse",
              "payload_shape": [
                "target"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/analytics/datasets",
                "POST /api/analytics/datasets/:spec_id/build"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/analytics/datasets",
              "requiresAuth": true,
              "summary": "List dataset specs for the tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/analytics/datasets",
              "requiresAuth": true,
              "summary": "Register a per-minute feature dataset spec",
              "payload_shape": [
                "aggregations",
                "asset_id",
                "grain",
                "label_source",
                "name",
                "sensor_ids"
              ],
              "fieldEnums": {
                "grain": [
                  "minute",
                  "hour",
                  "day"
                ],
                "aggregations": [
                  "avg",
                  "min",
                  "max",
                  "last",
                  "count"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/analytics/datasets/:spec_id/build",
              "requiresAuth": true,
              "summary": "Build feature windows for a 1h range",
              "payload_shape": [
                "from",
                "to"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/analytics/datasets"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/analytics/datasets/:spec_id/builds",
              "requiresAuth": true,
              "summary": "List builds with lineage refs",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/analytics/datasets"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/analytics/datasets/:spec_id/label-source",
              "requiresAuth": true,
              "summary": "Set interval-based labels",
              "payload_shape": [
                "default_label",
                "intervals",
                "kind",
                "provider_args"
              ],
              "fieldEnums": {
                "kind": [
                  "intervals",
                  "provider"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets",
                "POST /api/analytics/datasets"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-billing",
          "group": "Billing, Metering & Analytics",
          "summary": "Invoicing and billing",
          "reuse_when": [
            "billing",
            "invoice",
            "charge",
            "subscription",
            "bill"
          ],
          "api_count": 4,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-billing",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/billing/invoices/generate",
              "requiresAuth": true,
              "summary": "Generate Jan 2026 invoice",
              "payload_shape": [
                "catalog_id",
                "currency",
                "period_end",
                "period_start",
                "tax_rate",
                "tenant_id",
                "usage"
              ],
              "fieldEnums": {
                "actor_kind": [
                  "human",
                  "agent",
                  "service"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /admin/meter/pricing-catalogs",
                "PUT /admin/meter/pricing-catalogs/:catalog_id/rates/:sku",
                "PATCH /admin/meter/pricing-catalogs/:catalog_id/status"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/billing/live",
              "requiresAuth": true,
              "summary": "Read live meter for tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/billing/reprice-dry-run",
              "requiresAuth": true,
              "summary": "Compare current catalog against itself (baseline == target dry-run)",
              "payload_shape": [
                "baseline_catalog_id",
                "period_end",
                "period_start",
                "target_catalog_id",
                "tenant_id",
                "usage"
              ],
              "fieldEnums": {
                "actor_kind": [
                  "human",
                  "agent",
                  "service"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /admin/meter/pricing-catalogs",
                "PUT /admin/meter/pricing-catalogs/:catalog_id/rates/:sku",
                "PATCH /admin/meter/pricing-catalogs/:catalog_id/status"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/billing/showback",
              "requiresAuth": true,
              "summary": "Split by app_id + bu_id for Jan 2026",
              "payload_shape": [],
              "fieldEnums": {
                "group_by": [
                  "app_id",
                  "bu_id",
                  "persona_kind",
                  "encounter_id",
                  "sku",
                  "actor_kind"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /admin/meter/pricing-catalogs",
                "PUT /admin/meter/pricing-catalogs/:catalog_id/rates/:sku",
                "PATCH /admin/meter/pricing-catalogs/:catalog_id/status",
                "POST /api/billing/invoices/generate"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-data-credits",
          "group": "Billing, Metering & Analytics",
          "summary": "Prepaid capability credits: balances, reservation, consumption and top-up against enrichment providers",
          "reuse_when": [
            "credits",
            "capability",
            "enrichment",
            "provider",
            "budget",
            "metered spend",
            "top up",
            "quota",
            "prepaid"
          ],
          "api_count": 13,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-data-credits",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/capabilities",
              "requiresAuth": true,
              "summary": "List the outcomes this tenant can buy",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/capabilities/estimate",
              "requiresAuth": true,
              "summary": "Quote a capability for this tenant",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/capability-requests",
              "requiresAuth": true,
              "summary": "List recent requests",
              "payload_shape": [],
              "fieldEnums": {
                "status": [
                  "PENDING_APPROVAL",
                  "APPROVED",
                  "REJECTED",
                  "EXECUTING",
                  "COMPLETED",
                  "FAILED"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/capability-requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/capability-requests",
              "requiresAuth": true,
              "summary": "Ask for an outcome about a subject",
              "payload_shape": [
                "capability_key",
                "metadata",
                "requested_by_persona_id",
                "role_ref",
                "subject_fingerprint",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/capability-requests/:request_id",
              "requiresAuth": true,
              "summary": "Read one request",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/capability-requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/capability-requests/:request_id/approve",
              "requiresAuth": true,
              "summary": "Approve a waiting request",
              "payload_shape": [
                "approval_ref",
                "approved",
                "decided_by",
                "tenant_id"
              ],
              "fieldEnums": {
                "approved": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/capability-requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/capability-requests/:request_id/execute",
              "requiresAuth": true,
              "summary": "Execute an approved request",
              "payload_shape": [
                "subject",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/capability-requests"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/credits/balance",
              "requiresAuth": true,
              "summary": "Read the credit balance",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/credits/budgets",
              "requiresAuth": true,
              "summary": "List the budget policies",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "PUT",
              "endpoint": "/api/credits/budgets",
              "requiresAuth": true,
              "summary": "Cap a role at a rolling daily limit with a bulk gate",
              "payload_shape": [
                "bulk_approval_threshold",
                "daily_cap",
                "is_active",
                "mode",
                "role_ref",
                "tenant_id"
              ],
              "fieldEnums": {
                "mode": [
                  "REQUEST_ONLY",
                  "DAILY_CAP",
                  "FULL"
                ],
                "is_active": [
                  "true",
                  "false"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/credits/ledger",
              "requiresAuth": true,
              "summary": "Export the ledger for one request",
              "payload_shape": [],
              "fieldEnums": {
                "entry_type": [
                  "GRANT",
                  "RESERVATION",
                  "CHARGE",
                  "REFUND",
                  "RELEASE",
                  "ADJUSTMENT"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/capability-requests"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/credits/reservations",
              "requiresAuth": true,
              "summary": "Hold credits for a self-run lookup",
              "payload_shape": [
                "capability_key",
                "metadata",
                "requested_by_persona_id",
                "role_ref",
                "subject_fingerprint",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/credits/reservations/:reservation_id/settle",
              "requiresAuth": true,
              "summary": "Settle a hold as a no-match, charging nothing",
              "payload_shape": [
                "outcome",
                "result",
                "tenant_id"
              ],
              "fieldEnums": {
                "outcome": [
                  "MATCHED",
                  "NO_MATCH",
                  "TECHNICAL_FAILURE",
                  "CACHE_HIT"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/credits/reservations"
              ]
            }
          ]
        },
        {
          "sdk": "sdk-meter",
          "group": "Billing, Metering & Analytics",
          "summary": "Usage metering / metered events",
          "reuse_when": [
            "meter",
            "usage",
            "metering",
            "consumption",
            "quota",
            "usage-based"
          ],
          "api_count": 2,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-meter",
          "apis": [
            {
              "method": "GET",
              "endpoint": "/api/meter/assets/:asset_id/usage",
              "requiresAuth": true,
              "summary": "Read per-robot metered usage",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/assets"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/meter/health",
              "requiresAuth": false,
              "summary": "Health probe returns emit-only mode marker",
              "payload_shape": [],
              "fieldEnums": {},
              "dependsOn": []
            }
          ]
        },
        {
          "sdk": "sdk-payment",
          "group": "Billing, Metering & Analytics",
          "summary": "Payments and payment methods",
          "reuse_when": [
            "payment",
            "pay",
            "card",
            "stripe",
            "checkout",
            "transaction"
          ],
          "api_count": 5,
          "docs_url": "https://cloud.projexlight.com/workspace/docs/api/index.html#sdk-sdk-payment",
          "apis": [
            {
              "method": "POST",
              "endpoint": "/api/payments/:charge_id/distribute",
              "requiresAuth": true,
              "summary": "Split charge between two parties",
              "payload_shape": [
                "currency",
                "splits"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/personas",
                "POST /api/payments/methods",
                "POST /api/payments/charge"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/payments/:charge_id/refund",
              "requiresAuth": true,
              "summary": "Refund $5.00 USD below approval threshold",
              "payload_shape": [
                "amount",
                "approval_threshold",
                "reason"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/payments/methods",
                "POST /api/payments/charge"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/payments/charge",
              "requiresAuth": true,
              "summary": "Charge $25.00 USD",
              "payload_shape": [
                "amount",
                "currency",
                "encounter_id",
                "idempotency_key",
                "method_id",
                "tenant_id"
              ],
              "fieldEnums": {},
              "dependsOn": [
                "POST /api/auth/signup-tenant",
                "POST /api/payments/methods"
              ]
            },
            {
              "method": "POST",
              "endpoint": "/api/payments/methods",
              "requiresAuth": true,
              "summary": "Attach Stripe card via tokenized ref",
              "payload_shape": [
                "brand",
                "exp_month",
                "exp_year",
                "kind",
                "last4",
                "persona_id",
                "provider",
                "provider_token",
                "secure_data_field_ref",
                "tenant_id"
              ],
              "fieldEnums": {
                "provider": [
                  "stripe",
                  "razorpay",
                  "plaid",
                  "ach"
                ],
                "kind": [
                  "card",
                  "bank-account",
                  "upi",
                  "wallet"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            },
            {
              "method": "GET",
              "endpoint": "/api/payments/provider",
              "requiresAuth": true,
              "summary": "Resolve the tenant's payment collection provider",
              "payload_shape": [],
              "fieldEnums": {
                "level": [
                  "collect",
                  "billing"
                ]
              },
              "dependsOn": [
                "POST /api/auth/signup-tenant"
              ]
            }
          ]
        }
      ]
    }
  ]
}