Guest API sends message but getMessages returns empty

Bypassing the widget to hit /api/v2/conversations/messaging/contacts/{contactId}/messages directly. The POST returns 200 OK with a valid message ID, but polling the contact endpoint yields an empty array. Here’s the JSON I’m sending:

{
 "type": "text",
 "from": { "id": "guest-123" },
 "text": "Test"
}

Checked the trace, no 4xx errors. Just nothing coming back on the read side.

Studio handles the guest ID lifecycle differently than raw API calls. If you’re spinning up a contact via the Guest API, that guest-123 string might not be bound to an active session context that the read endpoint expects to query.

Check if the contact ID returned in the 200 OK response is actually the one you need for subsequent reads. The ID in the from object is just metadata. The response body contains the canonical id.

{
 "id": "actual-system-generated-id",
 "type": "text",
 "from": { "id": "guest-123" },
 "text": "Test"
}

Use that actual-system-generated-id for the polling URL. Also, verify the OAuth scope includes conversation:message:read. Missing that scope won’t throw a 403 on the POST, but it might silently fail or return empty on the GET depending on the client implementation.

Don’t mix widget-generated contact IDs with raw API contacts. They live in different namespaces.