Summaries API
Two kinds of AI-written summary are available over the API:
-
Chat summaries — a short recap of one contact’s conversation, generated on demand. The same thing as the summary control in a chat (see Chat Summary).
-
Daily summaries — the once-a-day roundup across all your conversations that Daily Summaries builds every morning: stats, one markdown block per section, and any tasks the AI created from it.
-
Base URL —
https://api.dmchamp.com/v1 -
Authentication — your API key (see Authentication). A scoped key needs the
Summariessection. -
Errors & paging — see Errors & Pagination
All examples below show the ?apiKey= query form in cURL and the X-API-Key header in JavaScript and Python — either works on every endpoint.
Generate a chat summary
POST /summaries — send the contact’s phoneNumber (with country code) or email; one of the two is required.
The AI reads the contact’s most recently closed conversation, or the one that is still open if none has closed yet, and writes a recap of it. The recap is stored on the contact (it appears under Summaries in the contact panel in the app) and returned in the response, so you can forward it straight to a CRM, a Slack channel or an email.
Cost: the same as one AI reply at the Agent’s AI Quality tier — Pro 1 credit, Max 0.25, Mini 0.15; with your own Anthropic key connected, Pro costs 0. The request is refused before anything is generated when the balance does not cover it.
cURL
curl -X POST "https://api.dmchamp.com/v1/summaries?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"phoneNumber": "+31612345678"}'
JavaScript
const res = await fetch("https://api.dmchamp.com/v1/summaries", {
method: "POST",
headers: { "X-API-Key": "YOUR_API_KEY", "Content-Type": "application/json" },
body: JSON.stringify({ email: "jane@example.com" }),
});
const { summary } = await res.json();
Python
import requests
r = requests.post(
"https://api.dmchamp.com/v1/summaries",
headers={"X-API-Key": "YOUR_API_KEY"},
json={"phoneNumber": "+31612345678"},
)
print(r.json()["summary"])
Response
{
"success": true,
"message": "Chat summary generated successfully",
"summary": "Jane asked about the 10-session package for her two children (ages 6 and 9) and preferred Saturday mornings. She booked a trial lesson for Saturday at 10:00 and wants to know whether siblings get a discount."
}
| Status | Meaning |
|---|---|
400 |
Neither phoneNumber nor email was sent. |
404 |
No contact matches, the contact has no conversation yet, or the conversation has no messages. The body’s message says which. |
500 |
Generation failed (for example, not enough credits). |
Automation recipe: booking email with a recap. In an automation on the Appointment booked trigger, add an HTTP request step that calls this endpoint with
${trigger.contact.phone_number}(or the contact’s email), then an Email step that inserts thesummaryfrom the HTTP step’s response together with a link to the chat (your app’s address followed by/chats/and the contact ID from the trigger). Your team gets the context of the booking in the same email, without opening the inbox.
Reading summaries back. There is no endpoint that lists stored chat summaries. Keep the text from the response if you need it later, or generate it again (each call is billed).
Alternative: by contact ID
POST /summaries/chat-summary with {"contactId": "..."} does the same generation for a contact you already hold the ID of. It only confirms success ({"success": true, "data": "Chat summary generated successfully"}) and does not return the text, so use POST /summaries when you want the recap itself. A team member whose key is limited to their assigned contacts gets 404 for a contact outside that scope.
Get a daily summary
GET /summaries/daily/{date} — date is YYYY-MM-DD. Returns the summary for that day, or null under summary when none has been generated yet, plus your section configuration.
cURL
curl "https://api.dmchamp.com/v1/summaries/daily/2026-09-08?apiKey=YOUR_API_KEY"
Response
{
"success": true,
"data": {
"summary": {
"date": "2026-09-08",
"status": "completed",
"generated_at": "2026-09-09T05:02:11.000Z",
"stats": {
"total_conversations": 42,
"total_messages_sent": 310,
"total_messages_received": 268,
"human_alerts": 3,
"bookings": 5,
"new_contacts": 11,
"sales": 2
},
"sections": {
"wins_losses_improvements": "## Wins\n- ...",
"tasks_action_items": "- Call Jane back about the sibling discount",
"human_alerts_reviews": "...",
"sentiment_analysis": "...",
"booked_meetings_sales": "..."
},
"contact_map": { "Jane Doe": "uid_whatsapp_31612345678" },
"auto_tasks": [],
"created_task_ids": []
},
"section_configs": [
{ "id": "wins_losses_improvements", "name": "Wins, Losses & Improvements", "enabled": true, "position": 0 }
]
}
}
status—pending,generating,completedorfailed(witherrorset). Poll this endpoint after a regenerate until it readscompleted.sections— one markdown string per section, keyed by the section id. The five standard sections arewins_losses_improvements,tasks_action_items,human_alerts_reviews,sentiment_analysisandbooked_meetings_sales; sections you add under Configure on the Daily Summaries page get acustom_…id. Names and order are echoed insection_configs.contact_map— display name to contact ID, so you can turn the names in the text into links.auto_tasks/created_task_ids— the action items the AI extracted and the tasks it created from them (when Create task cards from action items is on).
| Status | Meaning |
|---|---|
400 |
date is not YYYY-MM-DD, or is in the future. |
403 |
Daily Summaries is switched off for the account. |
Prefer a push over polling? The Daily Summary Created webhook event delivers the same payload the moment a morning summary finishes.
Regenerate a daily summary
POST /summaries/daily/{date}/regenerate — starts a fresh generation for that day in the background and returns immediately with status: "generating" and empty sections. Poll GET /summaries/daily/{date} until it completes. The same rules apply as for the Try again link in the app.
Optional body {"deleteTasks": false} keeps the tasks the previous run created; by default they are deleted and recreated from the new summary. Send a real boolean — the string "false" is ignored and treated as the default.
curl -X POST "https://api.dmchamp.com/v1/summaries/daily/2026-09-08/regenerate?apiKey=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"deleteTasks": false}'
Quick reference
| Task | Endpoint |
|---|---|
| Generate a chat summary and get the text | POST /summaries |
| Generate a chat summary by contact ID (no text returned) | POST /summaries/chat-summary |
| Read a day’s summary | GET /summaries/daily/{date} |
| Regenerate a day’s summary | POST /summaries/daily/{date}/regenerate |