Bypassing the widget: implementing pure guest api for message i/o

is it possible to fully decouple the guest interaction from the standard messenger widget using only the guest api?

i am building a headless chat interface that needs to handle sessions entirely via http calls, avoiding the genesyscloud-messaging-web-sdk bundle entirely. the goal is to manage the lifecycle programmatically within a terraform-driven ci/cd pipeline for a custom frontend.

currently, i am successfully initiating a session via:

post /api/v2/conversations/messaging/guests
content-type: application/json

{
 "address": {
 "protocol": "messaging",
 "subprotocol": "web",
 "id": "unique_guest_id_123"
 }
}

this returns a conversationId and guestId. however, when i attempt to send a message using:

post /api/v2/conversations/messaging/conversations/{conversationId}/messages
content-type: application/json

{
 "type": "text",
 "from": {
 "id": "unique_guest_id_123"
 },
 "text": "hello from headless client"
}

i get a 403 forbidden or 400 bad request depending on the auth token scope. i am using a standard api key with conversations:messaging permissions.

is there a specific header or payload structure required for the guest api that differs from the widget’s internal calls? the docs are sparse on the pure api usage without the sdk. i need to handle incoming messages via webhooks or polling, but first i need to establish that the outbound flow works.

any working examples of the full request/response cycle for a pure api guest session? specifically looking for the correct content-type and auth handling for the message endpoint.