Skip to main content
Connect any REST API to Lumos without writing code. You fill out connection settings that describe the target API. Where its data lives, how to log in, and what the responses look like. Lumos does the rest. Think of it as filling out a form about the API. Once the form is right, Lumos can list the app’s users, see who has what access, and even grant or remove access, all through the API you described. This page explains every setting and every option inside each configuration block. Worked configurations for real APIs (Databricks, ADP, Salesforce, GitHub, Datadog, HubSpot, and more) are on Universal REST Configuration Examples.
The Universal REST connector works for services that do not have complex data models. Examine the configuration guide to determine if the API will be compliant with the Universal REST connector.

Where you enter the configuration

Go to Integrations and click the Generic REST card (or the Generic REST (On Prem) card for an API inside your network). Every setting and block on this page is a field on that card’s connection form, named after the block: the accounts block goes in Accounts Config (JSON), the error rules in Error Detection (JSON), and so on. Some fields are hidden until you tick the box that reveals them: Hiding a field only changes what the form displays. It doesn’t clear the value or turn the capability off. You also choose the credential type the connection uses:

How configuration works

The connection has two kinds of settings. Simple fields. Single values you type into a box. The API’s web address, the name of the header your token goes in, and so on. Configuration blocks. Small JSON documents you paste into a box. Each block describes one thing Lumos can do, like “here is how to list this app’s users.” JSON is just structured text made of pairs. A name in quotes, a colon, then a value:
That one line says: the list of users lives at the path /scim/v2/Users. Every block on this page follows this same pattern. Names on the left, your values on the right. You only fill in the blocks for what you want. For Lumos to see users without changing anything, fill in the accounts block and stop there. Each block you add unlocks one more capability.

The building blocks used in every configuration

Four ideas repeat in every block. After you learn them, every block below reads the same way.

1. The endpoint

The path where the data lives, added onto your Base URL. If the Base URL is https://api.example.com and the endpoint is /v1/users, Lumos calls https://api.example.com/v1/users. Your API’s documentation lists these paths, usually under names like “List users.”

2. The records path

APIs wrap their lists differently. Some return the list directly:
If yours does this, leave records_path out entirely. Most APIs wrap the list inside a named field:
Here the list lives under Resources, so you set "records_path": "Resources". Common wrapper names in the wild: Resources (SCIM), data (Datadog), results (HubSpot), records (Salesforce), workers (ADP), users (Google Play).

3. Dotted paths

Many values sit inside nested fields. A dotted path walks down into them. Given this user record:
The path id reads 42. The path name.givenName walks into name and reads Sarah. The path emails[0].value reads the first entry in the emails list and takes its value, which is the email address. If a field name itself contains dots, wrap it in brackets and quotes: ["urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"].employeeNumber. That’s the whole trick. Every “path” field on this page is one of these.

4. Pagination

APIs return long lists in pages, and each API signals “here is how to get the next page” differently. The pagination object inside each block tells Lumos which signal your API uses. Look at a real response from your API and match it to one of the four styles. Style: none. The API returns everything at once. Nothing else to configure.
Style: offset. You ask for records starting at a position. “Give me 20 records starting at record 21.” SCIM works this way, and so does ADP.
Style: page. You ask for page numbers. “Give me page 3.” Datadog works this way. Lumos stops at the first empty or short page.
Style: cursor. The API hands you a marker for the next page. The marker can arrive four different ways, and you configure exactly one of them: size_param and page_size work here too when the API accepts a page-size parameter.

Connection settings

The simple fields, before any blocks.

OAuth settings

Only needed when your credential is one of the OAuth types.

mTLS settings

Some APIs, like ADP, require a client certificate on every call in addition to the token.

Connecting to an API inside your network

If the API is reachable only from inside your network, use the Generic REST (On Prem) card instead of the cloud card. It runs through the Lumos On-Premise Agent, so set the agent up first (see Installation). The connection settings and configuration blocks on this page are the same for both cards.

Accounts Config

Describes how to list the app’s users. This is the first block to fill in, and the only one required for a basic connection. The mapping translates the API’s field names into Lumos field names. Every field is a dotted path into one user record: How the status works: Lumos reads the field at status_path and checks it against your active_values list. A match means ACTIVE. Anything else means INACTIVE. So for a SCIM API where "active": true, use "status_path": "active" with "active_values": ["true"]. For ADP, where status hides at workerStatus.statusCode.codeValue with values like Active, point the path there and list ["Active"]. A complete block for a SCIM-shaped API:

Entitlements Config

Describes how to list the access that exists in the app. Roles, groups, licenses, teams. Whatever the app calls them. One kind of access:
Several kinds of access from one app. Wrap multiple blocks in square brackets to make a list. Each block needs a different type, because other configuration refers to blocks by their type. This verified Salesforce configuration lists permission sets and groups together:

Associations Config

Describes how Lumos learns who holds which access. This is the block with the most options, because APIs expose memberships in four different shapes. Pick the mode matching what your API offers, then fill in that mode’s fields. Which mode do I need?

Mode: endpoint

Reads a membership listing. Without members_path, for a flat listing like Salesforce’s assignment records:
With members_path, for SCIM Groups where each group carries its members:
Reading that second one aloud: list the groups, take each group’s id as the access, look at its members list, and take each member’s value as the user.

Mode: account_attribute

For APIs where each user record already carries its access. No extra endpoint needed, Lumos reads it during the user sync. Requires Accounts Config to be filled in. Two verified examples showing the difference. SCIM users carry a groups list of objects, so both fields are needed:
Google Play users carry developerAccountPermissions as a list of plain text values, so the second field is left out:

Mode: entitlement_fanout

For APIs with no membership listing at all, where you must ask each group individually who its members are. Lumos walks the entitlements list and calls the endpoint once per entitlement. The verified Databricks configuration, needed because Databricks’s groups listing leaves out the members:

Mode: account_fanout

The mirror image. Ask each user individually what access they hold. A note on both fan-out modes. They make one API call per group or per user by nature, so a large tenant means many calls. Syncs resume midway rather than starting over if interrupted. Combining sources. Like entitlements, this block accepts a list. Use a list when memberships come from more than one place, such as Salesforce’s permission set assignments plus its group members. The blocks in the list don’t need to use the same mode.

Resources Config

Describes how to list the app’s containers. Workspaces, projects, sites, or profiles. Only needed when access in your app is scoped to a container.

Last Activity Config

Describes where to find when each user was last active, usually a last-login time. Powers inactive-account detection in Lumos. Records missing an id or timestamp are skipped, so users who never logged in don’t produce broken events.

Custom Attributes Schema

Declares extra fields to pull in beyond the standard ones. Department, title, employee number, cost center. This block is a list, one entry per attribute. The verified Salesforce example, pulling two extra fields off each user:

Write configs (provisioning)

Everything so far reads data. The write configs let Lumos change it. Grant access, remove access, create users, disable users. There are seven, one settings field each, and they all share one shape: A placeholder is a marker like {account_id} that Lumos replaces with the real value when the action runs. Each write config gets its own set: Two useful details. Placeholders in the url are safely encoded for web addresses. And a body value that is exactly one placeholder keeps its real type, so a template can produce a true or false rather than the text “true”.

The four shapes real APIs take

The shipped examples establish four patterns. Find the one your API’s documentation matches. SCIM-style PatchOp. Changes are PATCH calls with a standard envelope. Granting access adds a member to the group:
Removing access uses a filter to pick out the one member to remove, which is the standard SCIM way to do it:
Disabling a user replaces its active field with false, and enabling replaces it with true. Plain-field PATCH. Some APIs skip the envelope and just take the changed fields. Salesforce disables a user with:
Junction-record POST. Some APIs model a grant as its own object you create. Salesforce grants a permission set by creating an assignment record:
Fair warning on this shape: undoing it usually means finding and deleting that record, which needs a lookup first, and that’s beyond what one templated call can do. Bare DELETE. Deletion is usually a call with no body at all:
Write configs change the real app Test them against a sandbox before any production system. The SCIM Playground at scim.dev is a free live sandbox built for exactly this, and its configuration on Universal REST Configuration Examples covers the complete write lifecycle.
Where the limit is. Each write config is exactly one API call with values filled in. If an action needs the connector to first look something up, or to compute a value like a timestamp, it can’t be expressed here. Real cases: Salesforce permission-set removal and Google Play’s permission updates. Those need a dedicated connector or the Connector SDK, and the Examples page flags each one.

Error Detection

Most APIs report failures with an error status code, and Lumos handles those automatically. A few APIs always say “success” at the HTTP level and hide failures inside the response body. This optional block teaches Lumos to spot them, and it applies to every call the connection makes. Configure exactly one of the three detection rules: Two optional extras work with any rule. message_path points at the API’s human-readable error message, and code_path at its error code, so both appear in Lumos when something fails.
A badly formed block fails immediately when you connect, during the credential check, rather than quietly during a sync later.

Putting it together: your first connection

  1. Get one real response. Ask whoever owns the API for a sample response from its “list users” endpoint, or find one in its documentation. Everything below comes from looking at it.
  2. Fill in the connection settings. The Base URL, and how the token travels (which header, which prefix). The API’s authentication documentation states this on its first page.
  3. Write the Accounts Config. Find the list in the sample response (that’s your records_path), find how the API signals more pages (that’s your pagination), and map the user fields (that’s your mapping). Set the status path and active values last.
  4. Connect. Lumos validates the credentials and the configuration immediately. A configuration mistake shows up here, not silently later.
  5. Add blocks one at a time. Entitlements next, then associations, then the rest as needed. Each one can be added later by editing the connection, so there’s no need to configure everything on day one.
If your API resembles one on Universal REST Configuration Examples, start from that configuration and change the paths. Matching on mechanics beats matching on vendor: an offset-paginated SCIM-ish API can copy the SCIM Playground configuration nearly unchanged, whatever the app is called.