List assignments
Reference for GET /assignments, the paginated list of who has been assigned which SOP, with open, overdue and completed status.
Shell
GET https://app.sopcompass.com/api/v1/assignmentsScope: read only or read and write. Paginated: yes, see Pagination.
Returns the workspace’s assignments, newest first (by created_at, then id). Assignments made in the app and through the API are both included.
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
status |
string | No | open, overdue or completed. open includes overdue assignments. |
assignee_email |
string | No | Only this member’s assignments, by sign-in email. Not case sensitive. An email that isn’t a member returns an empty list. |
sop_id |
UUID | No | Only this SOP’s assignments. |
limit |
integer, 1 to 100 | No | Page size. Default 50. |
cursor |
string | No | next_cursor from the previous page. Send the same filters with it. |
Request
Shell
curl -G https://app.sopcompass.com/api/v1/assignments \
--data-urlencode "status=overdue" \
--data-urlencode "limit=100" \
-H "Authorization: Bearer $SOPCOMPASS_API_KEY"JavaScript
const params = new URLSearchParams({ status: "overdue", limit: "100" });
const res = await fetch(`https://app.sopcompass.com/api/v1/assignments?${params}`, {
headers: { Authorization: `Bearer ${process.env.SOPCOMPASS_API_KEY}` },
});
const { data, has_more, next_cursor } = await res.json();Python
import os
import requests
res = requests.get(
"https://app.sopcompass.com/api/v1/assignments",
params={"status": "overdue", "limit": 100},
headers={"Authorization": f"Bearer {os.environ['SOPCOMPASS_API_KEY']}"},
timeout=30,
)
page = res.json()Response
200 OK
JSON
{
"data": [
{
"id": "c4e6a8b0-2d4f-4e6a-8c0b-2d4f6a8c0e11",
"sop": {
"id": "5b7e9d1a-2c4f-4e6b-8a1d-3c5e7f9a0b03",
"title": "New hire onboarding"
},
"assignee": {
"id": "2c4e6a8b-0d2f-4e4a-8b6c-8d0f2a4c6e22",
"name": null,
"email": "new.cleaner@example.com"
},
"assigned_by": {
"id": "8e0a2c4d-6f8b-4a0c-8e2d-4f6a8c0e2a09",
"name": "Dana Whitfield",
"email": "dana.whitfield@example.com"
},
"note": "Before your first shift at Acme Cleaning Co. (example).",
"due_on": "2026-09-15",
"requires_quiz": false,
"status": "overdue",
"viewed_at": "2026-09-10T08:12:00.000000Z",
"completed_at": null,
"created_at": "2026-09-09T17:30:05.625394Z"
}
],
"has_more": false,
"next_cursor": null
}The assignment object
| Field | Type | Description |
|---|---|---|
id |
UUID | The assignment’s id. |
sop |
object | id and title of the assigned SOP. |
assignee |
object | id, name (or null) and email of the person assigned. |
assigned_by |
object or null | id, name (or null) and email of who assigned it. For assignments made through the API, the admin who created the key. null if that person’s account no longer exists. |
note |
string or null | The note shown to the assignee. |
due_on |
date or null | YYYY-MM-DD due date. |
requires_quiz |
boolean | true when the assignee must pass the SOP’s quiz to complete it. |
status |
string | completed once completed_at is set; otherwise overdue when due_on is before today’s date in UTC; otherwise open. |
viewed_at |
timestamp or null | When the assignee first opened it. |
completed_at |
timestamp or null | When it was completed. |
created_at |
timestamp | When it was assigned. The sort key for this list. |
Errors
| Status | Code | When |
|---|---|---|
| 422 | invalid_status |
status isn’t open, overdue or completed. |
| 422 | invalid_parameter |
assignee_email doesn’t look like an email address (or is over 320 characters), sop_id isn’t a UUID, or limit isn’t a whole number from 1 to 100. |
| 422 | invalid_cursor |
cursor isn’t one the API issued. |
Authentication, plan and rate limit errors apply to every endpoint; see Errors.