The Mirubiki API

Create a survey, launch it, read the results, run a focus group, from code. The API is the same surface the application uses. Platform administration routes are not published.

Request field names are in French (titre, contexte, questions). They stay that way: renaming them would break every existing integration. This page is where they are documented in English.

Before the first call

Authentication

Every call carries a key in the X-API-Key header. Keys are issued on the API page of your dashboard, on the Enterprise and Admin plans only.

Rate limit

100 requests per minute per key by default. Above that the API answers 429 with X-RateLimit-Reset, the number of seconds to wait.

One host

Everything lives under https://www.mirubiki.com. There is no separate US endpoint: the panel is the one the account is bound to.

curl -H "X-API-Key: mirubi...key" https://www.mirubiki.com/api/v1/surveys

Response envelope

Every endpoint answers the same shape, success or failure. There is no HTTP 200 carrying an error.

{ "data": { ... }, "error": null }        // success
{ "data": null, "error": "message" }     // failure

401 means the key is missing, invalid or revoked. 429 means the limit above. 404 on a survey you do not own is the same answer as a survey that does not exist.

Surveys

A survey is created as a draft, then launched. Results are available once the run is finished; polling the status endpoint is how you know.

POST /api/v1/surveys

Creates a draft. Returns its id and status.

curl -X POST -H "X-API-Key: mirubi...key" \
  -H "Content-Type: application/json" \
  -d '{
    "titre": "New checkout flow",
    "contexte": "We are testing a two-step checkout against the current one.",
    "questions": [
      { "texte": "Which checkout would you complete?", "type": "choix_unique", "options": ["Two-step", "Current", "Neither"] },
      { "texte": "What would stop you?", "type": "libre" }
    ],
    "nb_personas": 50,
    "filtres": { "age": ["25-34"], "sex": "F" }
  }' \
  https://www.mirubiki.com/api/v1/surveys
FieldTypeWhat it does
titrestringSurvey title. Optional, derived from the context when empty.
contextestringWhat the survey is about. Optional.
questionsarrayRequired. Each item carries texte, type and options.
nb_personasintHow many profiles answer. Default 50, between 1 and 100.
filtresobjectOptional demographic selection.
POST /api/v1/surveys/{id}/launch

Moves a draft to running. A survey already running, done or failed is refused.

curl -X POST -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/surveys/abc123/launch
GET /api/v1/surveys/{id}/status

Status and progress. Poll this rather than guessing a delay.

curl -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/surveys/abc123/status
GET /api/v1/surveys/{id}/results

Answers of a finished survey. Empty or refused while the run is in progress.

curl -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/surveys/abc123/results
GET /api/v1/surveys

Lists your surveys, paged with limit and offset.

curl -H "X-API-Key: mirubi...key" \
  "https://www.mirubiki.com/api/v1/surveys?limit=20&offset=0"
DELETE /api/v1/surveys/{id}

Deletes a survey. There is no undelete.

curl -X DELETE -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/surveys/abc123

Focus groups

Two to eight profiles discuss over rounds, moderated by the model. A session is created, then read: there is no separate launch call, turns run when you ask for the transcript.

POST /api/v1/focus

Creates a session and selects its profiles. Returns the session id and the profiles drawn.

curl -X POST -H "X-API-Key: mirubi...key" \
  -H "Content-Type: application/json" \
  -d '{
    "titre": "Insurance email review",
    "guide": "Compare the two proposals",
    "nb_personas": 4,
    "max_turns": 6,
    "filtres": { "sexe": "F", "ages": ["25-40"] }
  }' \
  https://www.mirubiki.com/api/v1/focus
FieldTypeWhat it does
titrestringSession title.
guidestringModerator guide, optional.
nb_personasintBetween 2 and 8, default 6.
max_turnsintRounds to run, default 6.
filtresobjectOptional: ages, sexe, densites, occupations.
GET /api/v1/focus

Lists your sessions, paged with limit and offset.

curl -H "X-API-Key: mirubi...key" \
  "https://www.mirubiki.com/api/v1/focus?limit=20&offset=0"
GET /api/v1/focus/{id}

One session, with its profiles and settings.

curl -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/focus/abc123
GET /api/v1/focus/{id}/transcript

The discussion as text. Empty until turns have run.

curl -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/focus/abc123/transcript
DELETE /api/v1/focus/{id}

Deletes a session, its profiles and its messages. There is no undelete.

curl -X DELETE -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/focus/abc123

API keys

Keys can be managed from code as well as from the dashboard.

GET /api/v1/api-keys

Lists the keys of the account.

curl -H "X-API-Key: mirubi...key" https://www.mirubiki.com/api/v1/api-keys
POST /api/v1/api-keys

Creates a key. The secret is returned once: it is not readable afterwards.

curl -X POST -H "X-API-Key: mirubi...key" \
  -H "Content-Type: application/json" \
  -d '{"nom": "production"}' \
  https://www.mirubiki.com/api/v1/api-keys
DELETE /api/v1/api-keys/{id}

Revokes a key. Calls already in flight with it are refused at the next request.

curl -X DELETE -H "X-API-Key: mirubi...key" \
  https://www.mirubiki.com/api/v1/api-keys/42

What the API does not do

No human panel

Nothing here fields a questionnaire to real respondents. There is no incidence, no cooperation rate, no field date.

No population estimate

Results are not a share of a population and carry no margin of error. Reporting them as one is a misuse of the tool.

Filters are selection, not quotas

filtres picks profiles from the panel. It does not weight them to match a target distribution.

Answers still need a field check

What a synthetic run is good at is finding a defective item or a wording that pushes an answer. Claim-level numbers are a different job.

For agents and integrations

The same surface, written for a machine.

Last updated 18 October 2026.