Chat
Read a community's creator inbox: the thread list, and the messages inside one thread.
2 endpoints, generated from openapi.yaml. New to the API? Start with the Overview.
These are real direct messages between a brand and its creators. A creator wrote them expecting a conversation with the brand, not an API feed.
The media attachments and videoUrl archives are creator-uploaded files served from the Airaa CDN. Those links are private to the brand and should not be shared or republished.
Both tools are read-only. The API cannot send a message, mark a thread read, or delete anything; those stay in the dashboard. Your key reaches only communities you administer, so it can never read another brand's inbox.
https://app.airaa.xyzEvery tool is a POST to /api/ai/mcp/tools/{tool}/execute with arguments wrapped in an args object, authorised with Authorization: Bearer airaa_<key>.
get_chat_threads
List chat threads
Who has been messaging this community, and who is waiting on a reply?
One community's chat inbox, the same list the dashboard shows a brand: one thread per creator who has messaged or submitted there. Each thread carries the creator's identity, a preview of the last message, and two counts. Take creatorUserId from a thread here and pass it to get_chat_messages to read the conversation.
projectId is required. This tool only ever reads a community you administer; it never reads the key owner's own creator inbox.
unreadCount is messages the brand has not opened. pendingReviewCount is submissions from that creator awaiting review, not messages at all.
Arguments
projectIdstringrequiredThe community whose inbox to read, from list_manageable_projects.
projectCampaignIdstring | nullOnly threads with a non-rejected submission in this campaign
searchstring | nullMatches creator name/username, project name and campaign titles
onlyPendingReviewboolean | nullOnly threads with submissions awaiting review
pageintegerPage number, 1-indexed
limitintegerThreads per page, max 100
Returns
Fields inside result.
threadsarray of ChatThreadpageintegerlimitintegerhasMorebooleanErrors
400An argument is missing or failed validation; the message names the field. Also returned when a required projectId is omitted.401The key is missing or not valid.403The key is valid but you do not administer that community.404No such tool, or no campaign with that id.429Too many requests. Tool execution is limited to 120 calls per minute per user.
Request
curl -X POST https://app.airaa.xyz/api/ai/mcp/tools/get_chat_threads/execute \
-H "Authorization: Bearer $AIRAA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"args": {"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41","limit": 20}}'const res = await fetch("https://app.airaa.xyz/api/ai/mcp/tools/get_chat_threads/execute", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AIRAA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"args": {
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"limit": 20
}
}),
});
const { result } = await res.json();import os
import requests
res = requests.post(
"https://app.airaa.xyz/api/ai/mcp/tools/get_chat_threads/execute",
headers={"Authorization": f"Bearer {os.environ['AIRAA_API_KEY']}"},
json={
"args": {
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"limit": 20
}
},
)
res.raise_for_status()
result = res.json()["result"]Response
pendingReviewCount is submissions awaiting review, not unread messages. Paginates with page/limit/hasMore rather than a metadata object.
{
"result": {
"threads": [
{
"creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1",
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"username": "marasolace",
"userDisplayName": "Mara S.",
"userPhotoUrl": "https://cdn.airaa.xyz/users/mara.jpg",
"lastMessagePreview": "sent the second cut, let me know if the hook lands",
"lastMessageType": "text",
"lastMessageAt": "2026-08-27T16:42:19.000Z",
"unreadCount": 2,
"pendingReviewCount": 1
},
{
"creatorUserId": "2c8f45d1-6e93-40a7-b25c-1d3e9f7a6b08",
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"username": "devonbuilds",
"userDisplayName": "Devon K.",
"userPhotoUrl": "https://cdn.airaa.xyz/users/devon.jpg",
"lastMessagePreview": "Submission received for Launch week clips",
"lastMessageType": "system",
"lastMessageAt": "2026-08-24T11:03:40.000Z",
"unreadCount": 0,
"pendingReviewCount": 0
}
],
"page": 1,
"limit": 20,
"hasMore": true
}
}get_chat_messages
Read a chat thread
What did this creator and the brand actually say to each other?
One creator's thread inside one community, oldest message first. Both projectId and creatorUserId are required; take creatorUserId from get_chat_threads.
This returns a bare array rather than a paginated envelope. Page with the before and after ISO timestamps rather than page and limit offsets: before walks further back through history, after catches up on what arrived since.
Read-only. There is no way to send a message, mark the thread read, or delete anything through the API.
Arguments
projectIdstringrequiredThe community the thread belongs to.
creatorUserIdstringrequiredThe creator whose thread to read, from get_chat_threads.
projectCampaignIdstring | nullScopes the lookup to one campaign, for threads that belong to a campaign rather than to the community at large.
limitintegerMessages per page, max 100
beforestring | nullISO timestamp. Returns only messages older than this.
afterstring | nullISO timestamp. Returns only messages newer than this.
Returns
Fields inside result.
idstringcreatorUserIdstringprojectCampaignIdstring | nullSet when the message is campaign-scoped.
campaignTitlestring | nullsenderTypeenumairaa marks an automated system message.
creatorbrandairaasenderDisplayNamestring | nullsenderUsernamestring | nullsenderPhotoUrlstring | nullmessageTypeenumtextimagevideosystemdraft_submissioncontentstringmediaobjectAttachment. Private to the brand.
videoUrlstring | nullArchived clip on the Airaa CDN, when a submission is linked. Private to the brand.
replyToMessageIdstring | nullreplyToMessageChatReply | nullThe quoted message, when this one is a reply.
isReadByBrandbooleanisReadByCreatorbooleancreatedAtstringErrors
400An argument is missing or failed validation; the message names the field. Also returned when a required projectId is omitted.401The key is missing or not valid.403The key is valid but you do not administer that community.404No such tool, or no campaign with that id.429Too many requests. Tool execution is limited to 120 calls per minute per user.
Request
curl -X POST https://app.airaa.xyz/api/ai/mcp/tools/get_chat_messages/execute \
-H "Authorization: Bearer $AIRAA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"args": {"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41","creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1","limit": 50}}'const res = await fetch("https://app.airaa.xyz/api/ai/mcp/tools/get_chat_messages/execute", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AIRAA_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"args": {
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1",
"limit": 50
}
}),
});
const { result } = await res.json();import os
import requests
res = requests.post(
"https://app.airaa.xyz/api/ai/mcp/tools/get_chat_messages/execute",
headers={"Authorization": f"Bearer {os.environ['AIRAA_API_KEY']}"},
json={
"args": {
"projectId": "3f2a9c7e-1b84-4d5a-9e60-7c1af2b83d41",
"creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1",
"limit": 50
}
},
)
res.raise_for_status()
result = res.json()["result"]Response
A bare array, oldest first. These are private messages between the brand and the creator; media and videoUrl are creator-uploaded files on the Airaa CDN and should not be shared outside the brand.
{
"result": [
{
"id": "9c04b7e2-3a15-4d68-b029-71f5e8c34ab6",
"creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1",
"projectCampaignId": "a7d2f61c-08b5-4e3a-9c14-5f8b73d20e69",
"campaignTitle": "Launch week clips",
"senderType": "airaa",
"senderDisplayName": null,
"senderUsername": null,
"senderPhotoUrl": null,
"messageType": "system",
"content": "Mara S. claimed a TikTok slot on Launch week clips.",
"media": {},
"videoUrl": null,
"replyToMessageId": null,
"replyToMessage": null,
"isReadByBrand": true,
"isReadByCreator": true,
"createdAt": "2026-08-09T18:20:41.000Z"
},
{
"id": "d17e5f80-64c9-4b23-a05e-8f21c740b93d",
"creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1",
"projectCampaignId": "a7d2f61c-08b5-4e3a-9c14-5f8b73d20e69",
"campaignTitle": "Launch week clips",
"senderType": "creator",
"senderDisplayName": "Mara S.",
"senderUsername": "marasolace",
"senderPhotoUrl": "https://cdn.airaa.xyz/users/mara.jpg",
"messageType": "draft_submission",
"content": "first cut, hook is at 0:02",
"media": {},
"videoUrl": "https://cdn.airaa.xyz/submissions/b52f8c14/clip.mp4",
"replyToMessageId": null,
"replyToMessage": null,
"isReadByBrand": true,
"isReadByCreator": true,
"createdAt": "2026-08-09T18:22:05.000Z"
},
{
"id": "3b8a24d6-f051-4e97-8c16-2a5d90e7cb48",
"creatorUserId": "5e9c1a47-3d20-4b68-9f15-8c7e2a04d3b1",
"projectCampaignId": "a7d2f61c-08b5-4e3a-9c14-5f8b73d20e69",
"campaignTitle": "Launch week clips",
"senderType": "brand",
"senderDisplayName": "Priya R.",
"senderUsername": "priyanotes",
"senderPhotoUrl": "https://cdn.airaa.xyz/users/priya.jpg",
"messageType": "text",
"content": "hook works, approved.",
"media": {},
"videoUrl": null,
"replyToMessageId": "d17e5f80-64c9-4b23-a05e-8f21c740b93d",
"replyToMessage": {
"id": "d17e5f80-64c9-4b23-a05e-8f21c740b93d",
"senderType": "creator",
"senderDisplayName": "Mara S.",
"senderUsername": "marasolace",
"messageType": "draft_submission",
"content": "first cut, hook is at 0:02",
"media": {}
},
"isReadByBrand": true,
"isReadByCreator": true,
"createdAt": "2026-08-09T19:40:02.000Z"
}
]
}