Contacts and groups
Your saved numbers, and the groups you organise them into. The same records the dashboard shows — there is one contact list per organization, not one per surface.
403 FORBIDDEN. Test keys get pasted into sample code and CI configs; one of them deleting your live contact list is not a trade worth making. Use a live key to write.List contacts
/api/v1/contactsnext_cursor from the previous page.{
"success": true,
"data": [
{
"id": "cmuawlglj000pbuwqoponkvjt",
"phone": "+233271231111",
"first_name": "Yaw",
"last_name": "Asante",
"email": null,
"groups": [{ "id": "cmuawlgkf000bbuwq57ilhdds", "name": "Regulars" }],
"created_at": "2026-09-21T07:08:10.951Z"
}
],
"next_cursor": "cmuawlglj000pbuwqoponkvjt"
}Pagination is cursor-based, not offset-based. At scale an OFFSET 500000 is a table scan; a cursor is an index seek. Keep requesting until next_cursor is null.
Create a contact
/api/v1/contacts024…, 233… or +233…. Stored normalised, so the same person cannot be added twice in two formats.Update a contact
/api/v1/contacts/:idSend null to clear a field and omit it to leave it alone. The phone number cannot be changed — it is the contact's identity and carries their message history. Delete and re-add instead.
Delete a contact
/api/v1/contacts/:idImport a CSV
/api/v1/contacts/importThe phone column may be called phone, mobile, msisdn, number or contact. Any column we do not recognise is kept and can be used as a {{placeholder}} when you send. Invalid rows come back with their row number rather than failing the whole file.
Export a CSV
/api/v1/contacts/exportReturns text/csv, not JSON. Values beginning =, +, - or @ are escaped so a contact named =HYPERLINK(...) cannot execute when the file is opened in a spreadsheet.
Groups
/api/v1/contacts/groups/api/v1/contacts/groups/api/v1/contacts/groups/:id/members/api/v1/contacts/groups/:id# Add contacts to a group
curl -X POST https://api.jkasms.com/api/v1/contacts/groups/GROUP_ID/members \
-H "Authorization: Bearer $JKASMS_SECRET_KEY" \
-H "X-JKASMS-Org-Id: $JKASMS_ORG_ID" \
-H "Content-Type: application/json" \
-d '{ "contact_ids": ["cmuawlglj000pbuwqoponkvjt"] }'Deleting a group never deletes the contacts inside it. Contact ids that belong to another organization are silently excluded rather than linked.