Conversations
Read a conversation back into your own system: what was said and what each person was shown, the facts it recorded, and its summary.
This page is for the developer who files conversations in your case management or records system.
With it you can list your organisation's conversations, and read one with its transcript, its facts and its summary.
Before you start
- Where to send calls. The base address is
https://app.inmywords.chat/api/integrations/v1/. - Send your key every time. Every request carries
Authorization: Bearer imw_<64 hex characters>, the key of a connection your organisation has made. - The scopes you need.
conversations:readlets you read a conversation, its transcript and its facts.summaries:readlets you read its summary. - You see only your own organisation. A conversation of another organisation answers 404, the same as one that does not exist.
- How values are written. A conversation's id is 32 lowercase hex characters. Other ids are strings of digits, such as
"57". Times are ISO 8601 in UTC, and field names are snake_case.
A conversation's words come in two languages: what each person said, and the translation the other person was shown.
When a conversation ends, the conversation.ended webhook event is sent. When its summary is written or rewritten, summary.ready is sent.
What you can call
| Method | Path | Scope |
|---|---|---|
| GET | /conversations | conversations:read |
| GET | /conversations/{id} | conversations:read |
| GET | /conversations/{id}/transcript | conversations:read |
| GET | /conversations/{id}/facts | conversations:read |
| GET | /conversations/{id}/summary | summaries:read |
What a conversation holds
| Field | Type | Meaning |
|---|---|---|
id | string | The conversation's id |
started_at | string | When it started |
ended_at | string or null | When it ended; null while it is open |
languages.operator | string | The language code the member of staff wrote in |
languages.service_user | string or null | The language code the other person wrote in; null if it was not set |
case_id | string or null | The case it belongs to; null if none |
group | object or null | The group it was held in; null if none |
group.id | string | The group's id |
group.name | string | That group's name |
operator | object or null | The person who held it; null if nobody was signed in |
operator.id | string | The person's id |
operator.display_name | string or null | That person's name; null once they have left the organisation |
turn_count | integer | How many turns were said |
has_summary | boolean | Whether a summary has been written |
List your conversations
Conversations come newest first. limit is 50 by default and 100 at most, and a larger value is reduced to 100.
To read the next page, pass the next_cursor of the page before as cursor. next_cursor is null on the last page.
To fetch only what has changed, give updated_since an ISO 8601 time and you get back only the conversations changed after it. A change is anything that changes the conversation itself, a turn or its ending included, or its summary being written.
A bad limit, cursor or updated_since answers 400 invalid_request.
curl "https://app.inmywords.chat/api/integrations/v1/conversations?limit=2" \
-H "Authorization: Bearer imw_3f9c..."
{
"data": [
{
"id": "3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7b",
"started_at": "2026-10-02T09:14:03Z",
"ended_at": "2026-10-02T09:41:47Z",
"languages": {"operator": "en", "service_user": "so"},
"case_id": "1207",
"group": {"id": "57", "name": "Housing advice"},
"operator": {"id": "1842", "display_name": "Fiona Maclean"},
"turn_count": 38,
"has_summary": true
},
{
"id": "9b8e2f71c04a4d3eb5a6c7d8e9f0a1b2",
"started_at": "2026-10-02T08:02:11Z",
"ended_at": null,
"languages": {"operator": "en", "service_user": "pl"},
"case_id": null,
"group": {"id": "57", "name": "Housing advice"},
"operator": {"id": "1790", "display_name": "Tom Gallagher"},
"turn_count": 12,
"has_summary": false
}
],
"next_cursor": "WyIyMDI2LTEwLTAyIDA5OjAyOjExIiwzNzEyXQ"
}
Read a conversation
curl https://app.inmywords.chat/api/integrations/v1/conversations/3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7b \
-H "Authorization: Bearer imw_3f9c..."
You get back {"data": {...}}, holding one conversation with the fields above.
Read the transcript
Turns come in the order they were said. Each one carries the words as said and the translation the other person was shown, each with its language.
| Field | Type | Meaning |
|---|---|---|
speaker | string | operator for the member of staff, service_user for the other person |
said.text | string | The words as said |
said.language | string | Their language code |
shown | object or null | The translation the other person was shown; null if the turn was never translated |
shown.text | string | The translation's words |
shown.language | string | Its language code |
score | integer or null | The translation's score, 0 to 100; null until it is scored |
said_at | string or null | When the turn was said; null if it was not recorded |
curl https://app.inmywords.chat/api/integrations/v1/conversations/3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7b/transcript \
-H "Authorization: Bearer imw_3f9c..."
{
"data": [
{
"speaker": "operator",
"said": {"text": "Can you tell me when the letter arrived?", "language": "en"},
"shown": {"text": "Ma ii sheegi kartaa goorta warqaddu timid?", "language": "so"},
"score": 96,
"said_at": "2026-10-02T09:15:20Z"
},
{
"speaker": "service_user",
"said": {"text": "Warqaddu waxay timid Isniinta.", "language": "so"},
"shown": {"text": "The letter came on Monday.", "language": "en"},
"score": 98,
"said_at": "2026-10-02T09:15:41Z"
}
]
}
Read the facts
The facts are what the conversation recorded about the person it was held with.
| Field | Type | Meaning |
|---|---|---|
key | string | What the fact is about |
category | string | The kind of fact |
value | string | What was recorded |
set_at | string or null | When it was set; null if it was not recorded |
curl https://app.inmywords.chat/api/integrations/v1/conversations/3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7b/facts \
-H "Authorization: Bearer imw_3f9c..."
{
"data": [
{"key": "household_size", "category": "household", "value": "3", "set_at": "2026-10-02T09:18:02Z"},
{"key": "letter_received", "category": "housing", "value": "Monday 28 September", "set_at": "2026-10-02T09:15:44Z"}
]
}
Read the summary
| Field | Type | Meaning |
|---|---|---|
text | string | The summary |
language | string | Its language code |
written_at | string | When it was last written |
curl https://app.inmywords.chat/api/integrations/v1/conversations/3f9a1c0e7b2d4e6f8a1b2c3d4e5f6a7b/summary \
-H "Authorization: Bearer imw_3f9c..."
{
"data": {
"text": "The client received an eviction notice on Monday 28 September and lives with two children.",
"language": "en",
"written_at": "2026-10-02T09:43:10Z"
}
}
A summary is written in English after the conversation ends, where your organisation has conversation reviews switched on. A conversation with no summary yet answers 404 not_found.
When something goes wrong
Every error comes back as {"error": {"code": "...", "message": "..."}} with the HTTP status.
| Status | Code | When |
|---|---|---|
| 401 | unauthorised | The key is missing, malformed or revoked |
| 403 | module_off | Integrations are not switched on for your organisation |
| 403 | scope_missing | Your connection does not hold the scope |
| 404 | not_found | No such conversation, or one belonging to another organisation |
| 400 | invalid_request | A bad limit, cursor or updated_since |
| 429 | rate_limited | Too many calls this minute; wait the seconds in Retry-After |
{"error": {"code": "scope_missing", "message": "This connection does not hold summaries:read."}}