Treat message text as display content. Do not use it to determine job state or
drive application logic; use
status, hasResult, and isActive for that.Add detailed updates to your interface
1
Enable messages and choose their language
Set See Metrics for the available metrics and scoping options.
statusOptions.messages.isEnabled to true in your POST /roster/start request. English is used when language is omitted.Also request metrics that reflect what your users care about. They give the AI verified numerical context and can make progress messages more specific. Choose focused scopes rather than every available metric.Enable messages with a relevant metric
2
Start the roster job
Send the roster start request and retain the returned
jobId.Retrieve new messages while polling
Messages form an ordered stream. The status endpoint uses a token to return only the new messages after your previous poll. Tokens are opaque continuation values: do not decode, modify, or construct them. Keep one token per roster job.1
Initialize message retrieval
Call
GET /roster/status/{jobId} without a messageToken. The response contains an empty messages.items array and the first messages.nextToken. Store that token.2
Request new messages
Pass the stored token as the
messageToken query parameter on the next poll. Append every returned item to your interface, then replace the stored token with messages.nextToken.3
Keep polling
Repeat the previous step while
isActive is true. Always store the returned token, even when items is empty, because the token can still advance.