Skip to main content
An access request is someone asking for access to an app, and optionally to specific entitlements on it. The user who asks is the requester, and the identity the access is for is the target. They can be the same user. Filing a request starts its approval workflow. The request’s status tracks the workflow through approval and provisioning. For time-based access, it also tracks removal. Approvals and manual provisioning steps appear as tasks on the request.
The Access Request object

Attributes

Who can see a request

You can see requests you filed and requests where you’re the target. Of the built-in roles, Admin, Read Only Admin, AppStore Read Only Admin, and App Admin can see every request in your organization. A custom role can also grant this access. Get Access Request, List Access Requests, and Cancel Access Request act only on requests you can see. List Access Requests applies this whatever filters you pass. The approver of a request’s current stage can also get the request with Get Access Request, until the request no longer waits on them. List Access Requests doesn’t return it for them.

Statuses

status is one of the values below. The statuses marked cancellable are the ones a request holds while it’s still in progress. Cancelling returns 409 for the others.

Filing a request

Create Access Request needs an app_id and a business_justification:
  • The justification is required. A call without business_justification returns 400. Create Access Request still accepts the deprecated note field in its place.
  • The target is you unless you send target_user_id.
  • The requester is you. Only an Admin can send requester_user_id to file on someone else’s behalf. If anyone else sends it, the call returns 403.
  • access_length must be one of the time-based access options the app offers. When you name entitlements, it must be an option that all of them offer. Any other value returns 400. Omit it for permanent access, which works only if the app offers Unlimited. The possible options are: 2 hours, 4 hours, 8 hours, 12 hours, 1 day, 2 days, 3 days, 7 days, 14 days, 30 days, 90 days, and Unlimited.
  • custom_fields answers the app’s custom intake fields, keyed by reference_key, such as {"environment": "Production"}. Every required field needs an answer that isn’t blank. An answer can be up to 500 characters, and a dropdown answer must match one of its options exactly. A missing answer, an unknown key, or an answer that breaks these rules returns 400 with code set to access_request.custom_fields_invalid. errors lists each problem, with field set to custom_fields.<reference_key>.
A successful call returns 201 with an access_requests list. One call can create more than one request, so read the list rather than assuming a single item. An app_id, target_user_id, or requester_user_id that doesn’t exist in your organization returns 404. If the requester isn’t allowed to file the request, the call returns 403 with code set to access_request.forbidden. Lumos can refuse a request for other reasons, such as a webhook that rejects it. These return 400 with code set to access_request. followed by the reason: invalid, not_requestable, entitlement_invalid, access_length_invalid, expiration_invalid, itsm_ticket_id_required, missing_fields, or rejected_by_webhook.

Entitlements on a request

entitlement_ids takes entitlement IDs, the IDs that List Entitlements returns. To see what an app offers a requester, call Get App Entitlement AppStore Catalog. Omit entitlement_ids to request the app itself. Each entitlement must be one you can request on the app in app_id. Otherwise the call fails: Get Access Request and List Access Requests return entitlements as {id, label} objects. Each entitlement appears once. If you’re moving from requestable permissions, see Migrate requestable permissions to entitlements.

Time-based access

Send access_length to request access that ends. Lumos turns it into seconds when you file, and two fields track it:
  • expiration_in_seconds is the length, for example 2592000 for 30 days.
  • expires_at is null until the access is granted. After that, it’s the time the access ends, which is the time of the grant plus expiration_in_seconds.
When that time comes, Lumos runs the app’s deprovisioning workflow, which removes the access or creates a manual deprovisioning task. The request moves through pending-deprovisioning or pending-manual-deprovisioning to time-based-expired. An access_length of Unlimited, or none at all, means permanent access, and both fields stay null.

Cancelling

Cancel Access Request takes an optional reason and returns 204:
You can cancel a request while Statuses marks its status as cancellable. In any other status, the call returns 409. The requester, the target, and an Admin can cancel a request. Anyone else who can see the request, such as an App Admin or the approver of its current stage, gets 403.

Expanding a request

  • expand=tasks adds the request’s tasks that you can see. Each task has the same shape that Get Task returns when you send no expand.
  • expand=custom_fields adds the requester’s answers to the app’s custom intake fields.

Listing

statuses takes the labels in Statuses. Any other value, such as PENDING_APPROVAL, returns 400. A user ID that doesn’t exist in your organization returns 404. A page token works only with the same filters and order_by as the call that returned it. Pagination covers page tokens.

Endpoints