Lumos REST API

The Lumos REST API enables programmatic access to the Lumos identity platform for automating tasks such as managing users, apps, access requests, and governance workflows. All requests require a bearer token (prefixed lsk_) in the Authorization header.

Operations 89

GET /apps Get Apps #
POST /apps Create App #
GET /apps/categories Get App Categories #
GET /apps/{app_id} Get App #
PATCH /apps/{app_id} Update App #
PUT /apps/{app_id} Reconnect App #
DELETE /apps/{app_id} Disconnect App #
GET /apps/{app_id}/settings Get Appstore App Settings #
PATCH /apps/{app_id}/settings Update Domain App Appstore Settings #
GET /users/current Get Current User #
GET /users Get Users #
GET /users/{user_id} Get User #
GET /users/{user_id}/accounts Get User Accounts #
GET /inline_webhooks Get Inline Webhooks #
GET /accounts Get Accounts #
GET /groups/{group_id}/users Get Group Membership #
GET /groups/{group_id} Get Group #
GET /groups Get Groups #
GET /accounts/upload/{job_id} Get Upload Job State #
GET /activity_logs Get Activity Logs #
GET /identity_events Get Identity Events #
POST /apps/{app_id}/sync Trigger App Sync #
GET /integrations List Integrations #
GET /integrations/{app_class_id} Get Integration #
GET /integrations/{app_class_id}/connection-schema Get Integration Connection Schema #
POST /accounts/upload Create Accounts #
POST /activity_records Update Activity Records #
GET /activity_records/job/{job_id} Get Activity Records Job State #
GET /users/{user_id}/roles Get User Roles #
POST /users/{user_id}/roles/{role_name} Add Role To User #
DELETE /users/{user_id}/roles/{role_name} Remove Role From User #
GET /appstore/apps/{app_id}/requestable_permissions Get Appstore Permissions For App #
GET /appstore/requestable_permissions Get Appstore Permissions #
POST /appstore/requestable_permissions Create Appstore Requestable Permission #
GET /appstore/requestable_permissions/{permission_id} Get Appstore Permission #
PATCH /appstore/requestable_permissions/{permission_id} Update Appstore Permission #
DELETE /appstore/requestable_permissions/{permission_id} Delete Appstore Permission #
GET /appstore/pre_approval_rules Get Appstore Pre Approval Rules For App #
POST /appstore/pre_approval_rules Create Pre Approval Rule #
GET /appstore/pre_approval_rules/{pre_approval_rule_id} Get Appstore Pre Approval Rule #
PATCH /appstore/pre_approval_rules/{pre_approval_rule_id} Update Pre Approval Rule #
DELETE /appstore/pre_approval_rules/{pre_approval_rule_id} Delete Pre Approval Rule #
GET /appstore/apps/{app_id}/settings Get Appstore App Settings #
PATCH /appstore/apps/{app_id}/settings Update Appstore App Settings #
POST /appstore/apps Add App To Appstore #
GET /appstore/apps Get Appstore Apps #
DELETE /appstore/apps/{app_id} Remove App From Appstore #
GET /appstore/apps/{app_id} Get Appstore App #
DELETE /appstore/access_requests/{id} Cancel Access Request #
GET /appstore/access_requests/{id} Get Access Request #
POST /appstore/access_request Create Access Request #
GET /appstore/access_requests Get Access Requests #
GET /access_policies Get Access Policies #
POST /access_policies Create Access Policy #
GET /access_policies/{access_policy_id} Get Access Policy #
DELETE /access_policies/{access_policy_id} Delete Access Policy #
PUT /access_policies/{access_policy_id} Update Access Policy #
POST /access_reviews Create Access Review #
GET /access_reviews List Access Reviews #
POST /access_reviews/{access_review_id}/apps Add Apps To Access Review #
DELETE /access_reviews/{access_review_id} Delete Access Review #
GET /access_reviews/{access_review_id} Get Access Review #
PATCH /access_reviews/{access_review_id} Update Access Review #
DELETE /access_reviews/{access_review_id}/apps/{arda_id} Delete Access Review App #
GET /access_reviews/scope_options Get Scope Options Endpoint #
GET /v1/knowledge/context List Knowledge Context #
POST /v1/knowledge/context Create Knowledge Context #
GET /v1/knowledge/context/{knowledge_context_id} Get Knowledge Context #
PATCH /v1/knowledge/context/{knowledge_context_id} Update Knowledge Context #
DELETE /v1/knowledge/context/{knowledge_context_id} Delete Knowledge Context #
GET /vendor_agreements Get Vendor Agreements #
PUT /vendor_agreements/{vendor_agreement_id}/custom_attributes/{label} Update Vendor Agreement Custom Attribute #
POST /found_documents Upload Found Documents #
POST /orders Upload Order #
GET /tasks List Tasks #
GET /tasks/{task_id} Get Task #
GET /tasks/{task_id}/actions Get Task Actions #
POST /tasks/{task_id}/perform-action Perform Task Action #
POST /tasks/{task_id}/reassign Reassign Task #
POST /tasks/{task_id}/comments Add Task Comment #
POST /tasks/{task_id}/complete Complete Task #
POST /tasks/{task_id}/dismiss Dismiss Task #
POST /lifecycle-management/user-offboardings Create User Offboarding #
GET /lifecycle-management/user-offboardings/{user_offboarding_id} Get User Offboarding #
POST /lifecycle-management/user-offboardings/{user_offboarding_id}/cancel Cancel User Offboarding #
GET /art Get Art #
GET /info Get Info #
POST /webhooks/airbase/purchase_request_approved/{domain_app_uuid} Process Airbase Purchase Request Approved #
POST /webhooks/vendr/request_completed/{domain_app_uuid} Process Vendr Request Completed #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/rest-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

lumos-openapi.json Raw ↑
{"openapi":"3.1.0","info":{"title":"Lumos","description":"\n    The Lumos API gives you the building blocks to administer and extend Lumos programmatically.\n    Our REST API provides a management interface for the AppStore and a read interface\n    for the Lumos Core.\n    Go to https://developers.lumos.com to see our complete documentation.\n","version":"0.1.0"},"servers":[{"url":"https://api.lumos.com"}],"paths":{"/apps":{"get":{"tags":["Core"],"summary":"Get Apps","description":"List all of your company's apps.","operationId":"listApps","security":[{"HTTPBearer":[]}],"parameters":[{"name":"name_search","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search against name, app instance identifier, and app class ID.","title":"Name Search"},"description":"Search against name, app instance identifier, and app class ID."},{"name":"exact_match","in":"query","required":false,"schema":{"type":"boolean","description":"Search filter should be an exact match.","default":false,"title":"Exact Match"},"description":"Search filter should be an exact match."},{"name":"connection_source","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ConnectionSource"},{"type":"null"}],"description":"Filter to integration apps connected via this source (`API` or `UI`).","title":"Connection Source"},"description":"Filter to integration apps connected via this source (`API` or `UI`)."},{"name":"disconnected","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Filter on whether the app has been disconnected. `false` excludes disconnected apps, `true` returns only disconnected apps whose record Lumos still holds, and omitting it lists every app. Pair `false` with `connection_source=API` to reconcile the integrations you manage from automation such as Terraform.","title":"Disconnected"},"description":"Filter on whether the app has been disconnected. `false` excludes disconnected apps, `true` returns only disconnected apps whose record Lumos still holds, and omitting it lists every app. Pair `false` with `connection_source=API` to reconcile the integrations you manage from automation such as Terraform."},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fields to expand. Supported fields: custom_attributes.","title":"Expand"},"description":"Fields to expand. Supported fields: custom_attributes."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size","default":50,"title":"Size"},"description":"Page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_AppWithCustomAttributes_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["Core"],"summary":"Create App","description":"Create a new custom app, or connect an integration app.\n\nWith a `name`/`category`/`description` body this creates a custom app. With an `app_class_id` body it connects the integration identified by `app_class_id` using the credentials in `auth` — integrations that validate in-band connect immediately and trigger an initial sync, while integrations that require browser consent are finished in the Lumos UI. Custom apps and integrations created here are both marked `connection_source=API`; list your API-managed apps with `GET /apps?connection_source=API&disconnected=false`.","operationId":"createApp","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppInputCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/App"}}}},"400":{"description":"Bad request — the request could not be processed. Common causes: missing or malformed credentials, an unknown `app_class_id`, or an invalid configuration value. See the `detail` field for the specific reason."},"403":{"description":"Forbidden — the caller lacks permission to manage apps on this domain."},"501":{"description":"Not implemented — this app does not support the requested operation."},"404":{"description":"Not found — no integration with this `app_class_id` is available to your domain."},"409":{"description":"Conflict — an instance for this app already exists in the domain."},"502":{"description":"Bad gateway — the third-party service rejected the credentials, or the post-connect sync failed."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/categories":{"get":{"tags":["Core"],"summary":"Get App Categories","description":"Get app categories.","operationId":"getAppCategories","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"type":"string"},"type":"array","title":"Response Getappcategories"}}}}},"security":[{"HTTPBearer":[]}]}},"/apps/{app_id}":{"get":{"tags":["Core"],"summary":"Get App","description":"Get an app by id.","operationId":"getApp","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fields to expand. Supported fields: custom_attributes.","title":"Expand"},"description":"Fields to expand. Supported fields: custom_attributes."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppWithCustomAttributes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Core"],"summary":"Update App","description":"Update domain-specific app metadata overrides. This updates the app instance in your domain, not the shared Lumos app catalog.","operationId":"updateApp","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppInputUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/App"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["Core"],"summary":"Reconnect App","description":"Update an app in place: apply domain-specific metadata overrides (the same fields as `PATCH /apps/{app_id}`) and/or rotate an integration's credentials. Providing `auth`/`settings`/`version` (with the matching `app_class_id`) reconnects the app: credentials are always overwritten and re-validated, and a sync is triggered — like connect, the app either connects in-band or awaits browser consent in the Lumos UI, and while a sync is in flight the request is throttled with `429` and a `Retry-After` header. Metadata-only bodies (custom apps, or integrations without credential changes) never touch credentials.","operationId":"reconnectApp","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppInputPut"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/App"}}}},"400":{"description":"Bad request — the request could not be processed. Common causes: missing or malformed credentials, an unknown `app_class_id`, or an invalid configuration value. See the `detail` field for the specific reason."},"403":{"description":"Forbidden — the caller lacks permission to manage apps on this domain."},"501":{"description":"Not implemented — this app does not support the requested operation."},"404":{"description":"Not found — no app with this id in your domain."},"409":{"description":"Conflict — credentials were provided for an app that is not managed via the API (`connection_source` is not `API`), so it cannot be reconnected here."},"429":{"description":"Too many requests — a sync is already in flight for this app. Includes a `Retry-After` header (seconds)."},"502":{"description":"Bad gateway — the third-party service rejected the credentials, or the post-reconnect sync failed."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["Core"],"summary":"Disconnect App","description":"Disconnect an API-managed app. For integrations this removes the stored credentials and returns the app to a connectable state; for custom apps it removes the app. In both cases, when no users remain the underlying record is also deleted where possible (a record still referenced by other Lumos data is kept, disconnected). Reconnect an integration later with `PUT /apps/{app_id}`. Returns 404 if `app_id` is unknown in the caller's organization.","operationId":"disconnectApp","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisconnectIntegrationOutput"}}}},"400":{"description":"Bad request — the request could not be processed. Common causes: missing or malformed credentials, an unknown `app_class_id`, or an invalid configuration value. See the `detail` field for the specific reason."},"403":{"description":"Forbidden — the caller lacks permission to manage apps on this domain."},"501":{"description":"Not implemented — this app does not support the requested operation."},"404":{"description":"Not found — no app with this id in your domain."},"409":{"description":"Conflict — the app is not managed via the API (`connection_source` is not `API`), so it cannot be disconnected here."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/settings":{"get":{"tags":["Core"],"summary":"Get Appstore App Settings","description":"Get App settings.","operationId":"getAppSettings","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSettingOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["Core"],"summary":"Update Domain App Appstore Settings","description":"Update app settings.","operationId":"updateAppSettings","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSettingInput"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppSettingOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/current":{"get":{"tags":["Core"],"summary":"Get Current User","description":"Get current user","operationId":"currentUser","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/User"}}}}},"security":[{"HTTPBearer":[]}]}},"/users":{"get":{"tags":["Core"],"summary":"Get Users","description":"List all of your company's users.","operationId":"listUsers","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search_term","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search for users by name or email.","title":"Search Term"},"description":"Search for users by name or email."},{"name":"exact_match","in":"query","required":false,"schema":{"type":"boolean","description":"If a search_term is provided, only accept exact matches.","default":false,"title":"Exact Match"},"description":"If a search_term is provided, only accept exact matches."},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fields to expand. Supported fields: custom_attributes.","title":"Expand"},"description":"Fields to expand. Supported fields: custom_attributes."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size","default":50,"title":"Size"},"description":"Page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_UserWithCustomAttributes_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}":{"get":{"tags":["Core"],"summary":"Get User","description":"Get user by id.","operationId":"getUser","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fields to expand. Supported fields: custom_attributes.","title":"Expand"},"description":"Fields to expand. Supported fields: custom_attributes."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserWithCustomAttributes"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/users/{user_id}/accounts":{"get":{"tags":["Core"],"summary":"Get User Accounts","description":"Get a list of Accounts for this user","operationId":"getUserAccounts","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","title":"User Id"}},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fields to expand. Supported fields: app.","title":"Expand"},"description":"Fields to expand. Supported fields: app."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size","default":50,"title":"Size"},"description":"Page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_Account_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/inline_webhooks":{"get":{"tags":["Core"],"summary":"Get Inline Webhooks","description":"Get available webhooks","operationId":"get_inline_webhooks_inline_webhooks_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/InlineWebhook"},"type":"array","title":"Response Get Inline Webhooks Inline Webhooks Get"}}}}},"security":[{"HTTPBearer":[]}]}},"/accounts":{"get":{"tags":["Core"],"summary":"Get Accounts","description":"Get all accounts associated with apps at your company.","operationId":"getAccounts","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Id"}},{"name":"discovered_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Discovered Before"}},{"name":"discovered_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Discovered After"}},{"name":"sources","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/DiscoverySource"}},{"type":"null"}],"title":"Sources"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"$ref":"#/components/schemas/AccountLifecycleStatus"}},{"type":"null"}],"title":"Status"}},{"name":"expand","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Fields to expand. Supported fields: app.","title":"Expand"},"description":"Fields to expand. Supported fields: app."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/groups/{group_id}/users":{"get":{"tags":["Core"],"summary":"Get Group Membership","description":"Get user members by group ID.","operationId":"getGroupMembership","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size","default":50,"title":"Size"},"description":"Page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_User_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/groups/{group_id}":{"get":{"tags":["Core"],"summary":"Get Group","description":"Get group by ID.","operationId":"getGroup","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","title":"Group Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Group"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/groups":{"get":{"tags":["Core"],"summary":"Get Groups","description":"Get groups synced from connected integrations","operationId":"getGroups","security":[{"HTTPBearer":[]}],"parameters":[{"name":"integration_specific_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filters groups by integration specific ID, e.g. the group's Okta ID.","title":"Integration Specific Id"},"description":"Filters groups by integration specific ID, e.g. the group's Okta ID."},{"name":"name","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filters groups by name.","title":"Name"},"description":"Filters groups by name."},{"name":"exact_match","in":"query","required":false,"schema":{"type":"boolean","description":"Search filter should be an exact match.","default":false,"title":"Exact Match"},"description":"Search filter should be an exact match."},{"name":"app_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filters groups by the ID of the app to which they belong.","title":"App Id"},"description":"Filters groups by the ID of the app to which they belong."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size","default":50,"title":"Size"},"description":"Page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_Group_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/upload/{job_id}":{"get":{"tags":["Core"],"summary":"Get Upload Job State","description":"Get state of an account upload job.","operationId":"getUploadJobState","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStateOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/activity_logs":{"get":{"tags":["Core"],"summary":"Get Activity Logs","description":"Get activity logs.","operationId":"getActivityLogs","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size limit","default":50,"title":"Limit"},"description":"Page size limit"},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"Page offset","default":0,"title":"Offset"},"description":"Page offset"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LimitOffsetPage_ActivityLog_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/identity_events":{"get":{"tags":["Core"],"summary":"Get Identity Events","description":"Get user identity events.","operationId":"getIdentityEvents","security":[{"HTTPBearer":[]}],"parameters":[{"name":"identity_ids","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter events tied to specific user UUIDs.","title":"Identity Ids"},"description":"Filter events tied to specific user UUIDs."},{"name":"changed_fields","in":"query","required":false,"schema":{"anyOf":[{"type":"array","items":{"type":"string"}},{"type":"null"}],"description":"Filter events by changed field names, eg - 'title' or 'team'","title":"Changed Fields"},"description":"Filter events by changed field names, eg - 'title' or 'team'"},{"name":"start_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Start Time"}},{"name":"end_time","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"End Time"}},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cursor"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityEventsResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/apps/{app_id}/sync":{"post":{"tags":["Core"],"summary":"Trigger App Sync","description":"Trigger a sync for a connected app on demand (e.g. from automation, after Terraform has connected it). The sync runs asynchronously — the call returns `202 Accepted` once the sync is launched; poll `GET /apps/{app_id}` to follow status.\n\nRequires `sync_type` (only `full_sync` is supported today). The app must be connected or in an error state from a prior sync (so callers can retry after failure). Manual/CSV apps are not supported. Only one sync may run at a time: while a sync is in flight the request is rejected with `409` — wait for the running sync to finish, then retry.","operationId":"triggerAppSync","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","title":"App Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerSyncInput"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerSyncOutput"}}}},"400":{"description":"Bad request — the request could not be processed. Common causes: missing or malformed credentials, an unknown `app_class_id`, or an invalid configuration value. See the `detail` field for the specific reason."},"403":{"description":"Forbidden — the caller lacks permission to manage apps on this domain."},"501":{"description":"Not implemented — this app does not support the requested operation."},"404":{"description":"Not found — no app with this id in your domain."},"409":{"description":"Conflict — a sync is already running for this app, the app is not in a syncable state, or its first sync is deferred pending admin review (match rules, or a flatfile column mapping) in the Lumos UI."},"422":{"description":"Unprocessable — `sync_type` is missing or not a supported value, or the app is a manual/CSV app, which cannot be synced via this endpoint."},"502":{"description":"Bad gateway — the downstream sync launch failed."}}}},"/integrations":{"get":{"tags":["Core"],"summary":"List Integrations","description":"List the integrations (apps) available to connect in your domain (paginated). Only connectable integrations are returned — catalog-only apps (e.g. discovered SaaS without a Lumos integration) are excluded. Returns catalog metadata only — name, category, and logo. Integrations you have connected are read via the Apps API (`GET /apps`).","operationId":"listIntegrations","security":[{"HTTPBearer":[]}],"parameters":[{"name":"query","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Case-insensitive substring filter over the integration's `app_class_id` and name. `google` matches both `workspace.google.com` and `cloud.google.com`.","title":"Query"},"description":"Case-insensitive substring filter over the integration's `app_class_id` and name. `google` matches both `workspace.google.com` and `cloud.google.com`."},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Page number","default":1,"title":"Page"},"description":"Page number"},{"name":"size","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"description":"Page size","default":50,"title":"Size"},"description":"Page size"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_IntegrationCatalogOutput_"}}}},"403":{"description":"Forbidden — the caller lacks permission to view integrations in this domain."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/{app_class_id}":{"get":{"tags":["Core"],"summary":"Get Integration","description":"Get a connectable integration (app) by its `app_class_id` (e.g. `okta.com`). Returns catalog metadata only; integrations you have connected are read via the Apps API (`GET /apps`).","operationId":"getIntegration","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_class_id","in":"path","required":true,"schema":{"type":"string","title":"App Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationCatalogOutput"}}}},"403":{"description":"Forbidden — the caller lacks permission to view integrations in this domain."},"404":{"description":"Not found — no integration with this `app_class_id` in your domain."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/integrations/{app_class_id}/connection-schema":{"get":{"tags":["Core"],"summary":"Get Integration Connection Schema","description":"Get the connection schema for an integration — the JSON schema of the `auth` and `settings` fields needed to connect it via `POST /apps`. Use it to discover how to connect an integration *before* connecting it (e.g. to populate a Terraform resource). `app_class_id` is the canonical identifier (e.g. `okta.com`, `slack_ics`) — the same value the connect body uses. Integrations whose connection schema Lumos cannot describe yet return 404.","operationId":"getIntegrationConnectionSchema","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_class_id","in":"path","required":true,"schema":{"type":"string","title":"App Class Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationConnectionSchemaOutput"}}}},"403":{"description":"Forbidden — the caller lacks permission to view integrations in this domain."},"404":{"description":"Not found — no integration with this `app_class_id` is accessible to your domain, or no connection schema is available for it yet."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/accounts/upload":{"post":{"tags":["Core"],"summary":"Create Accounts","description":"Upload accounts to an app.","operationId":"postAccounts","requestBody":{"content":{"application/json":{"schema":{"properties":{"accounts":{"items":{"$ref":"#/components/schemas/AccountInput"},"type":"array","title":"Accounts","description":"Accounts to upload.","default":[]},"app_id":{"type":"string","title":"App Id","description":"The ID of the app to upload accounts to."}},"type":"object","required":["app_id"],"title":"AccountsUploadInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStateOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/activity_records":{"post":{"tags":["Core"],"summary":"Update Activity Records","description":"Update the last_login or last_activity for a given account.","operationId":"activityRecords","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityRecordInput"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivityRecordOutput"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"security":[{"HTTPBearer":[]}]}},"/activity_records/job/{job_id}":{"get":{"tags":["Core"],"summary":"Get Activity Records Job State","description":"Get the state of an activity records post-processing job.","operationId":"getActivityRecordsJobState","security":[{"HTTPBearer":[]}],"parameters":[{"name":"job_id","in":"path","required":true,"schema":{"type":"string","title":"Job Id"}}],"responses":{"200":{"description":"Successful Response","content":{"ap

# --- truncated at 32 KB (275 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/lumos/refs/heads/main/openapi/lumos-openapi.json