Ta strona nie została jeszcze przetłumaczona na Twój język. Wyświetlamy wersję angielski (Wielka Brytania).

Inbox

Read the Inbox, mark conversations as needing no reply, dismiss rows, and answer people who are not leads yet.

The Inbox API returns one ordered list of everyone waiting for an answer, your team chats and what arrived for you, and lets you clear rows and answer someone new before deciding whether they are a lead.

These endpoints take a signed-in member's session token (Authorization: Bearer <session-token>); API keys do not open them. See Authentication.

Base URL: https://api.fondaro.com. Every member can read their own Inbox. Writes (marking handled, dismissing, every POST and DELETE under /new-conversations) need an active plan.

Read the Inbox

GET /inbox

Returns one page of the Inbox, in order, for the person asking.

ParameterInTypeRequiredDescription
viewQuerywaiting | new | allNoThe tab. Without it you get the list without team chats, views or note.
scopeQueryme | members | agencyNoDefault me. Members always get me; members and agency are for admins.
assigneeIdsQuerystring, repeatableNoUser ids for scope=members. Up to 100.
channelQueryemail | whatsapp | linkedin | instagram | telegramNoOnly rows on this channel.
viaQueryconnected account id | team | agenciesNoOnly rows from one inbox, your colleagues' chats, or other agencies.
qQuerystringNoRows whose name contains it. With a view, also matches preview. Up to 200 characters.
cursorQuerystringNonextCursor from the previous page. A cursor from another view starts from the top.
limitQueryintegerNo1 to 50. Default 30.
timeZoneQueryIANA nameNoUsed for "tomorrow" and "overnight". Default UTC.
bash
curl "https://api.fondaro.com/inbox?view=waiting&limit=30&timeZone=Europe/Madrid" \  -H "Authorization: Bearer $SESSION_TOKEN"
json
{  "asOf": "2026-09-25T10:00:00.000Z",  "scope": "me",  "items": [    {      "id": "message:6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11",      "kind": "awaiting_reply",      "group": "people",      "ref": { "kind": "lead", "id": "1042" },      "conversationKey": null,      "messageRef": { "kind": "message", "id": "6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11" },      "connectedAccountId": "3f0c6f8e-1c1a-4a7e-9e7b-2d0c7f6a1b11",      "occurredAt": "2026-09-25T08:58:12.000Z",      "lead": { "id": 1042, "firstName": "Lead", "lastName": "Example", "language": "en", "assigneeIds": ["user_2abc"] },      "title": "Lead Example",      "channel": "whatsapp",      "reason": { "code": "wrote", "channel": "whatsapp" },      "replyOwed": true,      "automatic": false,      "fromAnAgency": false,      "handleable": true,      "additionalCount": 0,      "offers": [],      "preview": "Hi! Is Saturday 11 still ok?",      "chat": null,      "faceUrl": "/inbox/faces/message/6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11",      "unread": true    }  ],  "nextCursor": null,  "groups": { "reconnect": 0, "people": 1, "team": 0, "invites": 0, "brochures": 0, "network": 0, "posts": 0 },  "counts": { "awaiting_reply": 1, "new_lead": 0 },  "waitingCount": 1,  "hasConnectedAccount": true,  "view": "waiting",  "views": { "waiting": 1, "new": 0 },  "note": null}

The item object

FieldTypeDescription
idstringThe row's id. Used as :ref to dismiss a row with no message.
kindstringWhat the row is (see Row kinds).
groupstringreconnect, people, team, invites, brochures, network or posts.
refobject or nullWhat the row opens: { kind, id } for a lead, calendar_event, brochure, listing, organization, open_house or chat conversation. null for new_conversation (use conversationKey) and reconnect (use connectedAccountId).
conversationKeystring or nullFor new_conversation: the key for the new conversation endpoints.
messageRefobject or nullThe message the row is about: { kind: "email" | "message", id }.
connectedAccountIdstring or nullThe inbox a message arrived on, or the inbox that needs reconnecting.
occurredAtstringISO 8601.
leadobject or nullid, firstName, lastName, language, assigneeIds.
titlestringThe person, agency or chat name.
channelstring or nullemail, whatsapp, linkedin, instagram or telegram.
reasonobjectWhy the row is here, as { code, ...parameters } for your client to put into words.
replyOwedbooleanThe person is waiting for an answer.
automaticbooleanAn automatic message or a row a trigger created.
fromAnAgencybooleanIt came from another agency.
handleablebooleanWith a view: the row can be marked handled or dismissed.
additionalCountintegerOther reasons this lead is here. A lead appears once, with its strongest reason.
offersobject[]Ask Fondaro's suggestions for the message. Accepting one opens a proposal for the person to approve.
previewstring or nullThe person's own words, about 140 characters at most. null when there are none.
chatobject or nullFor team rows: conversation id, type, scope (internal or external), waits, unreadCount, mentionCount, person, last, mentionedBy.
faceUrlstring or nullPath of the person's profile picture (see Get a profile picture).
unreadbooleanSomething new since you last opened this conversation. Yours alone.

groups, counts, waitingCount and views cover the whole Inbox, not the page and not the q, channel or via filter. note (first page of a view only) holds one or two server-chosen sentences as structured parts; it is null when there is nothing to say.

Row kinds

kindA row whenIt leaves when
awaiting_replyThe newest message on a lead, on any channel, is theirsAnyone replies, a call connects, or it is marked handled
new_conversationSomeone who is not a lead wrote to one of your inboxesAdd as lead, link, Not a lead, or 14 days
new_leadA lead assigned to you that nobody has contactedAny call, sent email or message
unassigned_leadA new lead with nobody on it (admins, scope=agency)Someone is assigned
invite_declinedA lead declined or answered maybe to your upcoming meetingThe meeting moves, is cancelled or accepted
brochure_openedSomeone outside your agency opened a brochure you made for one leadAny contact after the view, or 48 hours
reconnectOne of your inboxes needs reconnectingIt is connected again
connect_requestA member asked for an inbox the plan does not include (admins)Allowed or declined
connect_allowedAn admin allowed the inbox you asked forIt connects
co_listing_invitationAnother agency invited you to co-list a homeAccepted or declined
partnership_requestAnother agency asked to partner (admins)Accepted or declined
open_house_tomorrowYour open house is tomorrow and agents said they are goingThe day passes
agent_requestAn agent at another agency asked to message youAccepted or declined
request_replySomeone answered your buyer request in a chatYou reply, or the request closes
post_draftA listing post waits for you: a draft, a failed post, or one whose account needs reconnectingPublished or discarded
team_dmA direct message whose newest message is theirs and unread (with a view)You read or reply
team_mentionAn unread message in a channel or group mentions you (with a view)You read it
team_channelA channel or group that does not wait on you (view=all only)Never waits
lead_threadA lead's conversation that waits on nobody (view=all only)Never waits

You only see chats you are a member of, at every scope; an admin's scope changes which leads show, never whose chats.

Views and order

viewWhat it holds
waitingEvery row that waits, waiting chats included
newnew_lead, new_conversation, unassigned_lead and agent_request
allEvery conversation, newest activity first, with requests to you pinned above the first page

In waiting and new, rows come in this order: a reconnect that blocks a reply, the people waiting (longest first), the team, declined invites, opened brochures, network rows, then post drafts. Ask Fondaro may lift or sink a row inside its group but never removes one. Paging is by position, so a row that clears between pages never shifts the next one.

Count who is waiting

GET /inbox/count

Returns the number on the Inbox icon: people waiting for you, one per lead, plus chats that owe you an answer and requests to you, always in your own scope.

bash
curl "https://api.fondaro.com/inbox/count" \  -H "Authorization: Bearer $SESSION_TOKEN"
json
{ "waitingCount": 3 }

Mark a conversation handled

POST /inbox/items/:ref/handled

Marks a message as needing no reply, or dismisses a row that has no message. DELETE on the same path undoes it.

ParameterInTypeRequiredDescription
refPathstringYesURL-encoded. A message: email:<uuid>, message:<uuid>, or lead:<id> for the lead's newest message (which must be theirs). A row with no message: the row's id.
timeZoneQueryIANA nameNoFinds an open house "tomorrow" where you are. Default UTC.

A handled message holds on every device; the lead's next message is a new row. A dismissal holds for your whole organization until something newer happens on the row (another brochure view, a new answer to the invite), and you can only dismiss a row your Inbox shows you now. New conversations are decided with the new conversation endpoints, and chats clear when you read them.

bash
curl -X POST "https://api.fondaro.com/inbox/items/message%3A6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11/handled" \  -H "Authorization: Bearer $SESSION_TOKEN"
json
{  "messageRef": "message:6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11",  "handled": true,  "handledAt": "2026-09-25T10:02:41.000Z"}

Marking an already marked message keeps the first mark. DELETE returns "handled": false.

Mark many rows at once

POST /inbox/handled

Marks, dismisses or undoes up to 100 rows in one request, each by the rules above.

ParameterInTypeRequiredDescription
refsBodystring[]Yes1 to 100 refs, each what :ref takes above.
handledBodybooleanYestrue to mark or dismiss, false to undo.
timeZoneBodyIANA nameNoDefault UTC.

A ref that no longer resolves is listed in failed; the rest still land.

bash
curl -X POST "https://api.fondaro.com/inbox/handled" \  -H "Authorization: Bearer $SESSION_TOKEN" \  -H "Content-Type: application/json" \  -d '{"refs": ["message:6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11", "new_lead:lead:1042"], "handled": true}'
json
{  "results": [    { "messageRef": "message:6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11", "handled": true, "handledAt": "2026-09-25T10:02:41.000Z" },    { "messageRef": "new_lead:lead:1042", "handled": true, "handledAt": "2026-09-25T10:02:41.000Z" }  ],  "failed": []}

Mark a conversation read

POST /inbox/read

Clears the row's unread dot for you alone. It does not clear a waiting row: that still waits until you answer or mark it handled. Needs no active plan.

ParameterInTypeRequiredDescription
keyBodystringYeslead:<id> for any row of a lead, conversation:<conversationKey> for a new conversation, the row's id for anything else. Chats are read by reading them, not here.
timeZoneBodyIANA nameNoDefault UTC.
bash
curl -X POST "https://api.fondaro.com/inbox/read" \  -H "Authorization: Bearer $SESSION_TOKEN" \  -H "Content-Type: application/json" \  -d '{"key": "lead:1042"}'
json
{ "key": "lead:1042", "readAt": "2026-09-25T10:02:41.000Z" }

Get a profile picture

GET /inbox/faces/:kind/:id

Returns the person's WhatsApp, Instagram, LinkedIn or Telegram profile picture as an image. Use the path in an item's faceUrl with your session token.

ParameterInTypeRequiredDescription
kindPathmessage | conversationYesA lead's chat message id, or a new conversation's key.
idPathstringYesThe message id or conversation key.
bash
curl "https://api.fondaro.com/inbox/faces/message/6b0c9d0e-5d7a-4e0a-9d59-0f3c1e2a7b11" \  -H "Authorization: Bearer $SESSION_TOKEN" -o face.jpg

The image is cached privately for a day with an ETag. It answers 404 when the person has no picture or you cannot see the row.

Answer someone new

A new_conversation row is someone who wrote to one of your inboxes and is not a lead yet. Only the person who owns that inbox, or was given it by an admin, can open and answer it. :key is the row's conversationKey, URL-encoded. A conversation nobody decides on is deleted after 14 days (expiresAt).

Method and pathPurpose
GET /new-conversationsYour new conversations (?channel= narrows to one channel)
GET /new-conversations/:keyOne conversation with its messages
GET /new-conversations/:key/candidatesLeads it might belong to, with best when one is a strong match
POST /new-conversations/:key/replyReply from the inbox they wrote to
POST /new-conversations/:key/add-as-leadThe lead details, prefilled from the messages. Writes nothing
POST /new-conversations/:key/add-as-lead/confirmCreate the lead and move the messages onto it
POST /new-conversations/:key/linkMove the messages onto an existing lead
DELETE /new-conversations/:keyNot a lead: the stored messages are deleted

Reply

POST /new-conversations/:key/reply

Sends from the inbox they wrote to. An email goes out as a reply to their newest message, so it stays in their thread; a chat message goes into their chat. The row stays until you decide, with replyOwed: false.

ParameterInTypeRequiredDescription
bodyBodystringYesPlain text, 1 to 20,000 characters. A chat message is at most 4,000.
subjectBodystringNoEmail only. Default: Re: and their newest subject.
ccBodystring[]NoEmail only. Up to 10 addresses.
bccBodystring[]NoEmail only. Up to 10 addresses.
bodyHtmlBodystringNoEmail only. Formatted body, at most 100,000 characters, cleaned to basic text tags and http, https or mailto links before sending.
bash
curl -X POST "https://api.fondaro.com/new-conversations/email.3f0c6f8e-1c1a-4a7e-9e7b-2d0c7f6a1b11.YnV5ZXJAZXhhbXBsZS5jb20/reply" \  -H "Authorization: Bearer $SESSION_TOKEN" \  -H "Content-Type: application/json" \  -d '{"body": "Hello, the villa is free to view on Saturday at 11."}'
json
{  "message": {    "id": "9a1b2c3d-4e5f-4a6b-8c7d-0e1f2a3b4c5d",    "kind": "email",    "direction": "outbound",    "subject": "Re: Villa in Mijas",    "body": "Hello, the villa is free to view on Saturday at 11.",    "messageAt": "2026-09-25T10:04:00.000Z",    "attachments": []  }}

Add as a lead

POST /new-conversations/:key/add-as-lead/confirm

Creates the lead (or matches an existing one with the same details) and moves the conversation onto it. Get prefilled values first with POST /new-conversations/:key/add-as-lead.

ParameterInTypeRequiredDescription
firstNameBodystringYesUp to 100 characters.
lastNameBodystringNoUp to 100 characters.
emailBodystringNo
phoneNumberBodystringNoUp to 50 characters.
languageBodystringNoLanguage code.
propertyListingIdBodyuuidNoOne of your listings the person asked about.
crmStatus, leadType, companyNameBodystringNoAs on lead create.
assigneeIds, teamIds, unassignedBodyNoWho owns the lead, as on lead create.
bash
curl -X POST "https://api.fondaro.com/new-conversations/email.3f0c6f8e-1c1a-4a7e-9e7b-2d0c7f6a1b11.YnV5ZXJAZXhhbXBsZS5jb20/add-as-lead/confirm" \  -H "Authorization: Bearer $SESSION_TOKEN" \  -H "Content-Type: application/json" \  -d '{"firstName": "Maria", "lastName": "Lopez", "email": "buyer@example.com"}'
json
{ "leadId": 1077, "created": true, "attachedEmails": 2, "attachedMessages": 0 }

POST /new-conversations/:key/link takes { "leadId": 1042 } and answers the same shape with created: false. DELETE /new-conversations/:key answers { "deletedEmails": 2, "deletedMessages": 0 }.

Live updates

When a message reaches a lead, a new conversation arrives or a row is marked, dismissed or brought back, the dashboard's chat socket sends inbox:changed (empty payload) to your organization; after POST /inbox/read it goes to your own sockets only. Refetch GET /inbox on it, and also every 60 seconds to cover a dropped socket.

From an MCP client

The MCP server tool list_inbox (scope crm:read) returns the Inbox as a read-only list. It never returns team chats, and there is no MCP tool to mark a row handled.

Errors

StatusCodeWhen
400Invalid parameters, a :ref or key that is not a message, lead or dismissable row, an empty reply, or a chat reply over 4,000 characters
403SUBSCRIPTION_REQUIREDA write without an active plan
403SANDBOX_OUTBOUND_DISABLEDA reply from a sandbox organization
404No such message, row, lead or conversation that you can see
409mailbox_needs_reconnect, message_needs_reconnect, mailbox_not_connected, message_not_connected, message_account_restrictedThe inbox cannot send. integration names the setup page
409Linking a sender who is already linked to another lead
429message_paced, message_rate_limited, mailbox_rate_limitedSending is paused; try again later
502mailbox_send_failed, message_send_failedThe provider did not take the reply; try again

Errors use the standard body: { "statusCode", "message", "error" }, plus code where listed. Authenticated GET requests share a limit of 120 requests per endpoint per 10 seconds per person; a 429 carries Retry-After.