API reference

Build on it

Ask a concierge a question, or create and manage events from your own systems. JSON over HTTPS.

Overview

The API is the same concierge behind the web app, in a shape a program can hold: JSON in, JSON out. Base URL is https://askconcierge.ai/api/v1. Everything returns application/json, including errors.

There are two halves, and two kinds of key. The chat endpoint answers attendee questions and takes a chat key, issued for one concierge. The management endpoints create and configure concierges, and take a workspace key.

Every limit that applies in the app applies here: the concierge’s pass, the credits publishing spends, rate limits, and the rule that we never ask an attendee who they are. The API is a second door onto the same rooms, not a way around them.

Authentication

Create a key in your workspace settings. It is shown once, at creation, and cannot be retrieved afterwards — store it somewhere before you close the dialog. Send it as a bearer token:

Authorization: Bearer ac_xxxxxxxxxxxxxxxxxxxx

There are two kinds. A chat key is issued for one concierge and only works on the chat endpoint — it is the key you put in an embed, a kiosk or a partner’s page, so losing it costs one event, never the workspace. A workspace key works on every management endpoint and can reach only that workspace’s concierges. A project id from somewhere else returns 404, not 403 — we do not confirm that an id exists to someone who cannot use it.

A workspace key reaches every concierge in the workspace, including ones marked private to selected people. If you are handing a key to a contractor or a partner, issue a chat key for the one concierge instead.

Revoke a key from the same screen. Revocation takes effect on the next request.

POST /chat/{slug}

Ask a published concierge a question. Requires a chat key issued for this concierge — create one in your workspace settings by choosing the concierge. A workspace key is refused here: chat credentials travel into embeds and kiosks, so their blast radius is kept to one event.

curl https://askconcierge.ai/api/v1/chat/your-event-slug \
  -H "Authorization: Bearer $ASKCONCIERGE_CHAT_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"message": "When does the keynote start?"}'
FieldTypeNotes
messagestringThe question. Required, up to 2000 characters.
conversationIdstringOmit to start a conversation; pass it back to continue one.
{
  "conversationId": "0d8f…",
  "answer": "The keynote starts at 09:00 in Main Room.",
  "widgets": [
    {
      "kind": "schedule",
      "lead": "Two more before lunch.",
      "timeZone": "Europe/London",
      "sessions": [ … ]
    }
  ],
  "escalated": false
}

widgets holds the structured payloads the server resolved — schedule, speakers, directions, logistics, image — so you can render them yourself rather than parsing prose. escalated is true when the concierge could not answer and passed the question to the organizers.

This endpoint does not stream. Answers take a second or two; if you need token-by-token output, use the hosted attendee page.

Managing concierges

MethodPathWhat it does
GET/projectsList every concierge in the key’s workspace.
POST/projectsCreate one. Unlimited on every plan.
GET/projects/{id}Read one back.
PATCH/projects/{id}Update it, including publishing and visibility.
GET/projects/{id}/sourcesWhat it has read, and whether each source is ready.
POST/projects/{id}/sourcesGive it something to read.
curl https://askconcierge.ai/api/v1/projects \
  -H "Authorization: Bearer $ASKCONCIERGE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"title": "Northwind Summit", "eventDate": "2026-09-15"}'

Add knowledge as a URL or as text. Ingestion runs after the response returns 202 — a crawl can take minutes — so poll GET /sources and wait for status to become ready.

curl https://askconcierge.ai/api/v1/projects/$ID/sources \
  -H "Authorization: Bearer $ASKCONCIERGE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"type": "url", "url": "https://your-event.example"}'

Publishing is a PATCH. It is the point at which your plan’s limit on live concierges applies.

curl -X PATCH https://askconcierge.ai/api/v1/projects/$ID \
  -H "Authorization: Bearer $ASKCONCIERGE_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"published": true}'

Errors

Errors are JSON with a stable error code and a message written for a human. Match on the code, show the message.

{ "error": "credits_exhausted", "message": "Publishing this Meetup concierge costs 1 credit and 0 are left…" }
StatusCodeMeaning
400invalid_requestThe body did not match the schema.
401unauthenticatedMissing, malformed or revoked key.
403forbiddenA valid key of the wrong kind or for the wrong concierge — a workspace key on chat, a chat key on management, or another concierge’s chat key.
403plan_ceilingThe concierge needs a pass the workspace’s plan does not reach.
403page_capThe concierge is at the top of the parsed-page ladder.
404not_foundNo such concierge, or not yours, or not published.
402credits_exhaustedPublishing needs more credits than the workspace has left.
429rate_limitedToo many messages from one address. Back off and retry.

Something missing here? The FAQ covers the questions people ask most.