Guest API send_message returns 401 despite valid access_token in header

Trying to implement a headless chat interface using the Guest API directly, bypassing the Messenger widget entirely. I’m following the standard flow: fetch the guest token via POST to /api/v2/conversations/messaging/guests, then use that token to send messages. The token request succeeds and returns a valid access_token, but when I hit POST /api/v2/conversations/messaging/conversations/{id}/messages, I get a 401 Unauthorized. My Node.js request looks like this:

const res = await fetch(`https://${domain}.mygenesys.com/api/v2/conversations/messaging/conversations/${convId}/messages`, {
 method: 'POST',
 headers: { 'Authorization': `Bearer ${guestToken}`, 'Content-Type': 'application/json' },
 body: JSON.stringify({ content: 'test' })
});

The error response body is just {"errors":[{"message":"Invalid token"}]}. I’ve double-checked the expiration and the token matches what the SDK generates internally. Is there a specific scope or header I’m missing for the Guest API specifically, or does the token need to be passed differently than the standard bearer pattern?