List joiner items across cases (feed)
GET /jml/onboarding/items
Scope jml:read Plan Seed+
Flat feed of reconciled joiner items across cases, for polling. By default only items of OPEN and IN_PROGRESS cases are returned; an eq or in filter on caseStatus replaces that default. Use itemKey as the stable deduplication key. A result set above the server limit returns 422 QUERY_TOO_BROAD. Concurrent feed requests are limited per organisation; excess requests return 429 RATE_LIMITED with Retry-After: 1.
Example
curl "https://api.autociso.io/api/v1/jml/onboarding/items" \
-H "Authorization: Bearer <your-api-token>"import requests
response = requests.get(
"https://api.autociso.io/api/v1/jml/onboarding/items",
headers={"Authorization": "Bearer <your-api-token>"},
)
print(response.json())const response = await fetch("https://api.autociso.io/api/v1/jml/onboarding/items", {
method: "GET",
headers: { "Authorization": "Bearer <your-api-token>" },
});
console.log(await response.json());Response 200
{
"data": [
{
"itemId": "ltsk_example000002",
"itemKey": "lfc_example000002:ast_example000002",
"taskId": "ltsk_example000002",
"caseId": "lfc_example000002",
"employeeId": "empl_example000002",
"assetId": "ast_example000002",
"assetName": "Example Chat",
"status": "GRANTED",
"accessStatus": "ACTIVE",
"accessLastDetectedAt": "2026-09-29T02:00:00Z",
"sourceProfileIds": [
"aprf_example000001"
],
"attestedAt": null,
"source": "PROFILE",
"openedAt": "2026-09-25T08:00:00Z",
"dueAt": "2026-10-01T08:00:00Z"
},
{
"itemId": "ltsk_example000003",
"itemKey": "lfc_example000002:ltsk_example000003",
"taskId": "ltsk_example000003",
"caseId": "lfc_example000002",
"employeeId": "empl_example000002",
"assetId": null,
"assetName": null,
"status": "ATTESTED",
"accessStatus": null,
"accessLastDetectedAt": null,
"sourceProfileIds": [],
"attestedAt": "2026-09-26T09:15:00Z",
"source": "MANUAL_TASK",
"openedAt": "2026-09-25T08:00:00Z",
"dueAt": "2026-10-01T08:00:00Z"
}
],
"error": null,
"meta": {
"limit": 25,
"offset": 0,
"total": 2,
"summary": {
"total": 2,
"granted": 1,
"pending": 0,
"attested": 1
},
"accessDataAsOf": "2026-09-29T02:00:00Z"
}
}Query parameters
limitintegerPage size. Default 25, maximum 100; a larger value is rejected with 400 VALIDATION_FAILED.offsetintegerZero-based offset. Maximum 100000.sort[openedAt]string"asc" | "desc"sort[assetName]string"asc" | "desc"filter[status][eq]stringReconciled item status."GRANTED" | "PENDING" | "ATTESTED"filter[status][ne]string"GRANTED" | "PENDING" | "ATTESTED"filter[status][in]array of string"GRANTED" | "PENDING" | "ATTESTED"filter[caseStatus][eq]stringStatus of the owning case. Default: OPEN and IN_PROGRESS; an eq or in filter replaces the default, a ne filter narrows it."OPEN" | "IN_PROGRESS" | "COMPLETED" | "CANCELLED"filter[caseStatus][ne]string"OPEN" | "IN_PROGRESS" | "COMPLETED" | "CANCELLED"filter[caseStatus][in]array of string"OPEN" | "IN_PROGRESS" | "COMPLETED" | "CANCELLED"filter[employeeId][eq]stringfilter[employeeId][in]array of stringfilter[assetId][eq]stringfilter[assetId][in]array of stringfilter[caseId][eq]stringfilter[openedAt][gte]string (date-time)Opening time of the owning case.filter[openedAt][lte]string (date-time)filter[dueAt][gte]string (date-time)Due date of the owning case.filter[dueAt][lte]string (date-time)
Returns
The data field of the standard { data, error, meta } envelope:
An array of object:
itemIdstring requireditemKeystring requiredStable key for deduplicating items across polls: caseId:assetId, or caseId:taskId for a manual task.taskIdstring or null requiredcaseIdstring requiredemployeeIdstring requiredassetIdstring or null requiredNull for MANUAL_TASK items. Older assets may carry a 24-character hex asset id.assetNamestring or null requiredCurrent name of the application; the name at generation when the application no longer exists; null for manual items.statusstring requiredReconciled each time you read it, so an item turns GRANTED as soon as the access is detected, with no change to the case. GRANTED: the access inventory shows the access; nothing to do. PENDING: no access is detected and nobody has marked it done; give the access, then wait for the next access scan. ATTESTED: a person marked it done in the console (shown as Marked done) but the access is not yet detected; neither verified nor contradicted. Verify if it matters."GRANTED" | "PENDING" | "ATTESTED"accessStatusstring or null requiredNull when no access record exists.accessLastDetectedAtstring (date-time) or null requiredsourceProfileIdsarray of string requiredIds of the access profiles that required the application (ids only). Empty, never null.attestedAtstring (date-time) or null requiredWhen a person marked the item done in the console. Null when nobody has.sourcestring required"PROFILE" | "MANUAL_TASK"openedAtstring (date-time) requiredOpening time of the owning case.dueAtstring (date-time) or null requiredDue date of the owning case.
The meta field:
limitinteger requiredoffsetinteger requiredtotalinteger requiredsummaryobject requiredCounts of joiner items per reconciled status. total is the sum of the three.totalinteger requiredgrantedinteger requiredpendinginteger requiredattestedinteger required
accessDataAsOfstring (date-time) or null requiredLatest access detection time used for this response.
Errors
| Status | Code | Retry | Meaning |
|---|---|---|---|
| 400 | VALIDATION_FAILED |
no | Invalid query parameter. code VALIDATION_FAILED; args.parameter names the parameter, args.reason the rule, args.allowed the permitted values of an enum. |
| 401 | INVALID_TOKEN |
no | Missing (UNAUTHORIZED) or invalid, expired or revoked (INVALID_TOKEN) token. |
| 402 | FEATURE_GATED |
no | The tenant plan does not include lifecycle workflows. code FEATURE_GATED; args.feature, args.minTier, args.minTierName. |
| 403 | INSUFFICIENT_SCOPE |
no | The token lacks the jml:read scope (INSUFFICIENT_SCOPE; a token holding pii:read alone reaches no endpoint here), or the request is refused (FORBIDDEN). A token holding pii:read is also refused with INSUFFICIENT_SCOPE when personal data cannot be disclosed to it (personal-data disclosure is disabled for the tenant, or the token has no creator); it is never silently downgraded to the masked shape. |
| 422 | QUERY_TOO_BROAD |
no | The filtered feed exceeds the server limit and is never truncated. code QUERY_TOO_BROAD; narrow by date range, caseStatus or employeeId. |
| 429 | RATE_LIMITED |
yes | Rate limit exceeded. code RATE_LIMITED; wait Retry-After seconds. Applies to the personal-data (pii:read) request window on case endpoints, where Retry-After is the time until the window ends. That window is shared by all calls of the token, over REST and MCP; a request that fails with 503 AUDIT_UNAVAILABLE is not refunded, so retrying spends more of it. Do not build a design that depends on an exact number of requests. It also applies to concurrent feed requests on the items feeds, where Retry-After is 1. The body carries no meta. |
| 500 | INTERNAL_ERROR |
no | Unexpected server error. code INTERNAL_ERROR; quote error.id to support. |
| 503 | BILLING_UNAVAILABLE |
yes | A dependency is temporarily unavailable (BILLING_UNAVAILABLE), or a response containing name or email could not be audited and was withheld (AUDIT_UNAVAILABLE). Retry later. |
Last reviewed: 2026-10-13
Was this page helpful?