The org and API key this request is authenticated as
GET/v1/me
Returns 200 with Me.
Your AI teammates — knowledge, rooms, action items and meetings — from your own systems. Base URL https://api.zeriq.app; authenticate with Authorization: Bearer zqt_sk_…. Conventions, errors and limits are in the guide. Machine-readable: openapi.json.
GET/v1/me
Returns 200 with Me.
GET/v1/knowledge/documents
Newest first. Room documents are included only for rooms you can use.
limitintegerdefault 20cursorstring | nullexternal_idstring | nullroom_idstring | nullsourcestring | nullReturns 200 with DocumentList.
POST/v1/knowledge/documents
Upload a file (multipart), or send JSON with text + title or a url. It's searchable once
status is ready. With an external_id that already exists, this replaces that document.
external_idstring | nullmetadataobject | nullroom_idstring | nulltextstring | nulltitlestring | nullurlstring | nullReturns 202 with Document.
GET/v1/knowledge/documents/{document_id}
document_idstringrequiredReturns 200 with Document.
DELETE/v1/knowledge/documents/{document_id}
document_idstringrequiredReturns 200 with Deleted.
POST/v1/knowledge/search
The most relevant passages from your workspace's knowledge, best first.
querystringrequiredroom_idstring | nullsourcesstring[] | null["upload", "jira"].top_kintegerdefault 5Returns 200 with SearchResponse.
GET/v1/conversations
limitintegerdefault 20Returns 200 with ConversationList.
GET/v1/conversations/{conversation_id}
conversation_idstringrequiredReturns 200 with ConversationDetail.
GET/v1/personas
Returns 200 with PersonaList.
GET/v1/personas/{persona_id}
persona_idstringrequiredReturns 200 with Persona.
POST/v1/personas/{persona_id}/ask
One answer from the teammate, grounded in your knowledge, with citations and usage.
persona_idstringrequiredinputstringrequiredallow_downgradebooleandefault falseconversation_idstring | nullmodelstring | nulltools"none" | "read_only" | "allowed"default "none"use_knowledgebooleandefault trueReturns 200 with Answer.
GET/v1/rooms
Rooms this key created (all rooms with rooms:read:all), newest first.
status"active" | "scheduled" | "ended" | "archived" | nulllimitintegerdefault 20cursorstring | nullReturns 200 with RoomList.
POST/v1/rooms
A room run by this API key with the AI teammates you choose, and optionally people from your
workspace. With first_message, the teammates start replying. Anyone who isn't a current member
is rejected with 400 not_an_org_member.
titlestringrequiredfirst_messagestring | nullhostMemberRef | nullmembersMemberRef[]modelstring | nullnotify"email" | "none"default "email"personasstring[]prs_…), up to 6.topicstring | nullReturns 201 with Room.
GET/v1/rooms/{room_id}
room_idstringrequiredReturns 200 with Room.
POST/v1/rooms/{room_id}/end
Ends it; a title, summary and action items follow in the background.
room_idstringrequiredoutcome"success" | "followup" | "failure" | "cancelled" | nullReturns 200 with Room.
GET/v1/rooms/{room_id}/events
Live events for a room you can read:
- persona.thinking: which AI teammates are working on a reply
- message.created: a message from a person, an AI teammate or an API key
- run.completed / run.failed: a reply run finished
With run_id it replays that run from the start, then ends when the run does. Without it, it streams
live; after Last-Event-ID it first replays what you missed. A : keep-alive comment comes every 15
seconds, and a stream closes after 10 minutes (reconnect with Last-Event-ID).
room_idstringrequiredrun_idstring | nullReturns 200.
GET/v1/rooms/{room_id}/messages
room_idstringrequiredafterstring | nullmsg_…).Returns 200 with MessageList.
POST/v1/rooms/{room_id}/messages
Posted as this API key. The room's AI teammates reply in the background: stream them with
GET /rooms/{id}/events?run_id=<run_id>, or poll GET /rooms/{id}/messages?after=.
room_idstringrequiredcontentstringrequiredReturns 201 with PostedMessage.
POST/v1/rooms/{room_id}/reports
room_idstringrequiredsave_to_knowledgebooleandefault falsetype"summary" | "plan" | "pitch" | "security" | "funding"default "summary"Returns 200 with Report.
POST/v1/rooms/{room_id}/summarize
room_idstringrequiredReturns 200 with Room.
GET/v1/action-items
Across every room you can read, newest first.
room_idstring | nullstatus"open" | "done" | nullassigneestring | nullsincedatetime | nulllimitintegerdefault 50cursorstring | nullReturns 200 with ActionItemList.
POST/v1/action-items
room_idstringrequiredtitlestringrequiredassigneestring | nullexternal_refstring | nullReturns 201 with ActionItem.
PATCH/v1/action-items/{item_id}
Mark it done or open, and/or link where it's tracked (external_ref).
item_idstringrequiredexternal_refstring | nullstatus"open" | "done" | nullReturns 200 with ActionItem.
GET/v1/meetings/bots
Returns 200 with BotList.
GET/v1/meetings/bots/{bot_id}
bot_idstringrequiredReturns 200 with Bot.
GET/v1/meetings/bots/{bot_id}/report
bot_idstringrequiredReturns 200 with MeetingReport.
GET/v1/meetings/bots/{bot_id}/transcript
bot_idstringrequiredReturns 200 with Transcript.
GET/v1/webhooks/deliveries
Newest first.
endpoint_idstring | nullstatus"pending" | "succeeded" | "failed" | "skipped" | nulllimitintegerdefault 50cursorstring | nullReturns 200 with WebhookDeliveryList.
POST/v1/webhooks/deliveries/{delivery}/redeliver
A fresh round of attempts, e.g. after you've fixed your endpoint.
deliverystringrequiredReturns 200 with WebhookDelivery.
GET/v1/webhooks/endpoints
Returns 200 with WebhookEndpointList.
POST/v1/webhooks/endpoints
The response is the only time the signing secret is shown.
urlstringrequireddescriptionstring | nullevent_types("document.ready" | "document.failed" | "room.created" | "room.message.created" | "room.ended" | "room.summary.ready" | "room.report.ready" | "action_item.created" | "action_item.updated" | "meeting.bot.status_changed" | "meeting.report.ready" | "credits.low")[]Returns 201 with WebhookEndpointWithSecret.
GET/v1/webhooks/endpoints/{endpoint}
endpointstringrequiredReturns 200 with WebhookEndpoint.
PATCH/v1/webhooks/endpoints/{endpoint}
Change the URL or events, or turn it off and on (status).
endpointstringrequireddescriptionstring | nullevent_types("document.ready" | "document.failed" | "room.created" | "room.message.created" | "room.ended" | "room.summary.ready" | "room.report.ready" | "action_item.created" | "action_item.updated" | "meeting.bot.status_changed" | "meeting.report.ready" | "credits.low")[] | nullstatus"active" | "disabled" | nullactive turns a disabled endpoint back on.urlstring | nullReturns 200 with WebhookEndpoint.
DELETE/v1/webhooks/endpoints/{endpoint}
endpointstringrequiredReturns 200 with DeletedWebhookEndpoint.
POST/v1/webhooks/endpoints/{endpoint}/rotate-secret
A new secret, shown only now. For 24 hours deliveries are signed with both.
endpointstringrequiredReturns 200 with WebhookEndpointWithSecret.
POST/v1/webhooks/endpoints/{endpoint}/test
Sends a webhook.test event right away and returns the result (not retried).
endpointstringrequiredReturns 200 with WebhookDelivery.
GET/v1/webhooks/event-types
Returns 200 with EventTypeList.
created_atdatetimerequiredcreated_bystringrequiredidstringrequiredroom_idstringrequiredstatus"open" | "done" | stringrequiredtitlestringrequiredassigneestring | nullexternal_refstring | nullobject"action_item"default "action_item"dataActionItem[]requirednext_cursorstring | nullobject"list"default "list"namestringrequiredtype"user" | "persona" | "api_key" | "system"requiredidstring | nullinputstringrequiredallow_downgradebooleandefault falseconversation_idstring | nullmodelstring | nulltools"none" | "read_only" | "allowed"default "none"use_knowledgebooleandefault truecreated_atdatetimerequiredidstringrequiredmeeting_urlstringrequiredpersona_namestringrequiredstatusstringrequiredobject"meeting_bot"default "meeting_bot"themestring | nulldataBot[]requiredobject"list"default "list"chunk_idstringrequireddocument_idstringrequiredscorenumberrequiredsnippetstringrequiredsourcestringrequiredtitlestringrequiredsource_urlstring | nullcreated_atdatetimerequiredidstringrequiredtitlestringrequiredobject"conversation"default "conversation"persona_idstring | nullupdated_atdatetime | nullcreated_atdatetimerequiredidstringrequiredmessagesConversationMessage[]requiredtitlestringrequiredobject"conversation"default "conversation"persona_idstring | nullupdated_atdatetime | nulldataConversation[]requiredobject"list"default "list"contentstringrequiredcreated_atdatetimerequiredrolestringrequiredroom_idstringrequiredtitlestringrequiredassigneestring | nullexternal_refstring | nullJSON body: exactly one of text (with title) or url. Files use multipart/form-data.
external_idstring | nullmetadataobject | nullroom_idstring | nulltextstring | nulltitlestring | nullurlstring | nulltitlestringrequiredfirst_messagestring | nullhostMemberRef | nullmembersMemberRef[]modelstring | nullnotify"email" | "none"default "email"personasstring[]prs_…), up to 6.topicstring | nullurlstringrequireddescriptionstring | nullevent_types("document.ready" | "document.failed" | "room.created" | "room.message.created" | "room.ended" | "room.summary.ready" | "room.report.ready" | "action_item.created" | "action_item.updated" | "meeting.bot.status_changed" | "meeting.report.ready" | "credits.low")[]idstringrequireddeletedtruedefault trueobject"document"default "document"idstringrequireddeletedtruedefault trueobject"webhook_endpoint"default "webhook_endpoint"chunk_countintegerrequiredcreated_atdatetimerequiredidstringrequiredmime_typestringrequiredsize_bytesintegerrequiredsourcestringrequiredupload for files, URLs and text; otherwise the integration it was synced from.status"processing" | "ready" | "empty" | "failed"requiredprocessing until it's searchable; empty if no text was found.titlestringrequirederrorstring | nullexternal_idstring | nullmetadataobject | nullobject"document"default "document"replacingbooleandefault falseroom_idstring | nullsource_urlstring | nullupdated_atdatetime | nulldataDocument[]requirednext_cursorstring | nullcursor for the next page; null on the last page.object"list"default "list"outcome"success" | "followup" | "failure" | "cancelled" | nulldescriptionstringrequiredtypestringrequireddataEventTypeInfo[]requiredobject"list"default "list"api_key_idstringrequiredorg_idstringrequiredscopesstring[]requiredtool_accessstringrequiredbot_idstringrequiredcontentstringrequiredgenerated_atdatetime | nullobject"meeting_report"default "meeting_report"themestring | nullA current member of the workspace: exactly one of email or member_id.
emailstring | nullmember_idstring | nullcontentstringrequiredcreated_atdatetimerequiredidstringrequiredroom_idstringrequiredsenderActorrequiredtype"human" | "ai" | "system" | stringrequiredobject"message"default "message"dataMessage[]requiredobject"list"default "list"member_idstringrequirednamestringrequiredrole"host" | "member" | stringrequireddescriptionstringrequiredidstringrequirednamestringrequiredrolestringrequiredavatar_urlstring | nullobject"persona"default "persona"dataPersona[]requiredobject"list"default "list"Always posted as this API key: there's no way to post as a member.
contentstringrequiredcontentstringrequiredcreated_atdatetimerequiredidstringrequiredroom_idstringrequiredsenderActorrequiredtype"human" | "ai" | "system" | stringrequiredobject"message"default "message"run_idstring | nullGET /rooms/{id}/events?run_id=.contentstringrequiredtypestringrequireddocument_idstring | nullobject"report"default "report"save_to_knowledgebooleandefault falsetype"summary" | "plan" | "pitch" | "security" | "funding"default "summary"created_atdatetimerequiredcreated_byActorrequiredidstringrequiredmessage_countintegerrequiredparticipantsParticipant[]requiredpersonasRoomPersona[]requiredstatus"active" | "scheduled" | "ended" | "archived" | stringrequiredtitlestringrequiredaction_planstring | nullended_atdatetime | nullobject"room"default "room"outcomestring | nullsummarystring | nulltopicstring | nulldataRoom[]requirednext_cursorstring | nullobject"list"default "list"namestringrequiredidstring | nullrolestring | nullquerystringrequiredroom_idstring | nullsourcesstring[] | null["upload", "jira"].top_kintegerdefault 5dataSearchResult[]requiredobject"list"default "list"chunk_idstringrequiredcontentstringrequireddocument_idstringrequiredscorenumberrequiredsourcestringrequiredtitlestringrequiredexternal_idstring | nullsource_urlstring | nullbot_idstringrequireddataTranscriptLine[]requiredobject"transcript"default "transcript"speakerstringrequiredtextstringrequiredtimestampdatetime | nullexternal_refstring | nullstatus"open" | "done" | nulldescriptionstring | nullevent_types("document.ready" | "document.failed" | "room.created" | "room.message.created" | "room.ended" | "room.summary.ready" | "room.report.ready" | "action_item.created" | "action_item.updated" | "meeting.bot.status_changed" | "meeting.report.ready" | "credits.low")[] | nullstatus"active" | "disabled" | nullactive turns a disabled endpoint back on.urlstring | nullcredits_chargedintegerrequireddowngradedbooleanrequiredmodelstringrequiredattemptsintegerrequiredcreated_atdatetimerequiredendpoint_idstringrequiredevent_idstringrequiredevent_typestringrequiredidstringrequiredstatus"pending" | "succeeded" | "failed" | "skipped"requiredlast_errorstring | nulllast_responsestring | nulllast_response_msinteger | nulllast_status_codeinteger | nullnext_attempt_atdatetime | nullobject"webhook_delivery"default "webhook_delivery"updated_atdatetime | nulldataWebhookDelivery[]requirednext_cursorstring | nullobject"list"default "list"created_atdatetimerequiredevent_typesstring[]requiredidstringrequiredstatus"active" | "disabled"requiredurlstringrequireddescriptionstring | nulldisabled_reasonstring | nullfailing_sincedatetime | nullobject"webhook_endpoint"default "webhook_endpoint"previous_secret_expires_atdatetime | nulldataWebhookEndpoint[]requiredlimitintegerrequiredobject"list"default "list"created_atdatetimerequiredevent_typesstring[]requiredidstringrequiredsecretstringrequiredwhsec_…: shown only now. Keep it on your server.status"active" | "disabled"requiredurlstringrequireddescriptionstring | nulldisabled_reasonstring | nullfailing_sincedatetime | nullobject"webhook_endpoint"default "webhook_endpoint"previous_secret_expires_atdatetime | null