Update progress for a user on a content block
Updates a user’s progress (status, optional userData). userId is in the path, not the body. Scoped to your integration’s institution via Basic Auth credentials.
PATCH
/content-blocks/{id}/progress/{userId}Path parameters
idstringrequiredContent block ID
userIdstringrequiredUser ID
Request body
requiredapplication/jsonstatusstringNew progress status for the user on this block
Allowed:
NOT_STARTEDIN_PROGRESSFINISHEDREVIEWEDuserDataobjectOptional block-type-specific progress payload (e.g. survey answers, workbench state)
forcebooleanWhen true, bypasses some validation guards when updating status
default: false
Responses
200Updated progress
dataUpdateProgressResponserequiredShow propertiesHide properties
blockIdstringrequireduserIdstringrequiredstatusstringrequiredAllowed:
NOT_STARTEDIN_PROGRESSFINISHEDREVIEWEDpreviousStatusstring | nullrequiredAllowed:
NOT_STARTEDIN_PROGRESSFINISHEDREVIEWEDnullupdatedAtstring<date-time>requireduserDataobjectmetaResponseMetarequiredShow propertiesHide properties
requestIdstringrequiredtimestampstring<date-time>requiredversionstringrequiredAllowed:
v4400Bad Request
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring401Unauthorized
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring403Forbidden
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring404Not Found
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring429Too Many Requests
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestring500Internal Server Error
typestringrequiredAllowed:
errorcodestringrequiredAllowed:
bad_requestunauthorizedforbiddenresource_not_foundconflictvalidation_failedidempotency_key_reusedrate_limit_exceededinternal_errortitlestringrequiredstatusintegerrequireddetailstringrequiredinstancestringerrorsobject[]Show propertiesHide properties
Array of
objectfieldstringmessagestringRequest
curl -X PATCH "https://fuxam.app/api/v4/content-blocks/string/progress/string" \
-H "Content-Type: application/json" \
-d '{
"status": "NOT_STARTED",
"userData": {},
"force": false
}'const response = await fetch("https://fuxam.app/api/v4/content-blocks/string/progress/string", {
method: "PATCH",
headers: {
"Content-Type": "application/json"
},
body: JSON.stringify({
"status": "NOT_STARTED",
"userData": {},
"force": false
})
});import requests
response = requests.patch(
"https://fuxam.app/api/v4/content-blocks/string/progress/string",
headers={
"Content-Type": "application/json"
},
json={
"status": "NOT_STARTED",
"userData": {},
"force": False
},
)Response
{
"data": {
"blockId": "string",
"userId": "string",
"status": "NOT_STARTED",
"previousStatus": "NOT_STARTED",
"updatedAt": "2024-01-01T00:00:00Z",
"userData": {}
},
"meta": {
"requestId": "req_1234567890_abc",
"timestamp": "2026-06-02T07:00:00.000Z",
"version": "v4"
}
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}{
"type": "error",
"code": "resource_not_found",
"title": "Not Found",
"status": 404,
"detail": "Course not found",
"instance": "req_1234567890_abc",
"errors": [
{
"field": "string",
"message": "string"
}
]
}