Get one conversation
curl --request GET \
--url https://api.inboxbase.ai/v1/identities/{handle}/conversations/{convId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.inboxbase.ai/v1/identities/{handle}/conversations/{convId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.inboxbase.ai/v1/identities/{handle}/conversations/{convId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"identity": "<string>",
"conversation": {
"id": "<string>",
"with": "<string>",
"subject": "<string>",
"messageCount": 123,
"archived": true,
"labels": [
"<string>"
],
"lastEventAt": 123,
"lastEventAtIso": "2023-11-07T05:31:56Z",
"noReplyAt": 123,
"noReplyAtIso": "2023-11-07T05:31:56Z",
"lastNoReplyAt": 123,
"lastNoReplyAtIso": "2023-11-07T05:31:56Z",
"events": [
{
"type": "message",
"ts": 123,
"message": {
"id": "<string>",
"direction": "out",
"from": "<string>",
"to": "<string>",
"cc": "<string>",
"subject": "<string>",
"text": "<string>",
"html": "<string>",
"snippet": "<string>",
"ts": 123
},
"tsIso": "2023-11-07T05:31:56Z"
}
]
}
}{
"error": "<string>",
"details": {}
}{
"error": "<string>",
"details": {}
}Endpoints
Get a conversation
Full timeline for one conversation: messages, no-reply expirations, label changes.
GET
/
v1
/
identities
/
{handle}
/
conversations
/
{convId}
Get one conversation
curl --request GET \
--url https://api.inboxbase.ai/v1/identities/{handle}/conversations/{convId} \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.inboxbase.ai/v1/identities/{handle}/conversations/{convId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.inboxbase.ai/v1/identities/{handle}/conversations/{convId}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text){
"identity": "<string>",
"conversation": {
"id": "<string>",
"with": "<string>",
"subject": "<string>",
"messageCount": 123,
"archived": true,
"labels": [
"<string>"
],
"lastEventAt": 123,
"lastEventAtIso": "2023-11-07T05:31:56Z",
"noReplyAt": 123,
"noReplyAtIso": "2023-11-07T05:31:56Z",
"lastNoReplyAt": 123,
"lastNoReplyAtIso": "2023-11-07T05:31:56Z",
"events": [
{
"type": "message",
"ts": 123,
"message": {
"id": "<string>",
"direction": "out",
"from": "<string>",
"to": "<string>",
"cc": "<string>",
"subject": "<string>",
"text": "<string>",
"html": "<string>",
"snippet": "<string>",
"ts": 123
},
"tsIso": "2023-11-07T05:31:56Z"
}
]
}
}{
"error": "<string>",
"details": {}
}{
"error": "<string>",
"details": {}
}events[] is a discriminated-union timeline. The discriminator is
always type. Today the union includes:
| Type | What it is |
|---|---|
message | A message sent or received. Body, direction, snippet, timestamps. |
no_reply_expired | The no-reply timer fired without a reply. Carries waitedMs. |
label_added | A label was added (today, dashboard-only). |
label_removed | A label was removed. |
archived / unarchived | The conv was archived or unarchived. |
const messages = conv.events
.filter((e) => e.type === "message")
.map((e) => e.message);
Snapshot, not subscription
This endpoint serves a fresh snapshot every call, off the materialized state inside the durable object that owns the conversation. There is no “give me the diff since last read” — and you don’t need one. The pattern we want you to use is:- Events stream tells you something changed on
convId X. - GET /conversations/:convId gives you the current state.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Identity handle, URL-encoded.
Example:
"alice.acme@inboxbase.ai"
Conversation id.
Pattern:
^conv_[0-9a-f]+$