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:/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 ishttps://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:records_path out entirely.
Most APIs wrap the list inside a named field:
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: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. Thepagination 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.
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:
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:
members_path, for SCIM Groups where each group carries its members:
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:
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: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:
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.
Putting it together: your first connection
- 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.
- 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.
- 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 yourpagination), and map the user fields (that’s yourmapping). Set the status path and active values last. - Connect. Lumos validates the credentials and the configuration immediately. A configuration mistake shows up here, not silently later.
- 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.