La documentation développeur n’existe qu’en anglais pour l’instant. Le reste du site est en français.

API reference

Generated from the schemas the API validates against, so a field listed here is a field the API accepts.

OpenAPI 3.1: https://api.50heads.com/openapi.json. Generated from the same schemas, so it never drifts from this page. Load it into Postman, Insomnia or a client generator.

Pricing and config

Unauthenticated and rate limited. Estimate as often as you like; it never spends.

POST/v1/billing/estimate

Price, time and validation for a question draft.

No authentication.

Counts as half a request against the rate limit. validation lists anything that would stop the ask, one issue per field.

Request body (JSON)
FieldTypeNotes
draftobjectrequired
draft.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
draft.textstringrequired up to 600 characters
draft.contextstring up to 120 characters
draft.languagestring pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
draft.optionsobject[] up to 8 items, default []
draft.options[].labelstringrequired up to 40 characters
draft.options[].imageUrlstring (URL)
draft.neitherboolean default false
draft.stimulusobject
draft.stimulus.imageUrlstring (URL)
draft.stimulus.audioUrlstring (URL)
draft.stimulus.textstring up to 120 characters
draft.stimulus.exposureMsinteger 2000–10000
draft.ninteger 10–5000, default 50
draft.tier1 | 2 | 3 default 1
draft.rushboolean default false
draft.targetingobject
draft.targeting.countriesstring[] up to 50 items, default []
draft.targeting.tagsstring[] up to 20 items, default []
draft.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
draft.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
draft.targeting.verifiedAgeboolean
draft.clickTestobject
draft.clickTest.maxTapsinteger 1–5, default 1
draft.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
draft.publicResultsboolean default false
draft.reason"off" | "optional" | "required" default "off"
draft.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
surface"app" | "web"
Response (JSON)
FieldTypeNotes
creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
creditsTotalintegerrequired -9007199254740991–9007199254740991
payPerAnswerintegerrequired -9007199254740991–9007199254740991
etaMinutesintegerrequired -9007199254740991–9007199254740991
traitsintegerrequired -9007199254740991–9007199254740991
breakdownobject[]required
breakdown[].labelstringrequired
breakdown[].valuestringrequired
breakdownLinestringrequired
validationobject[]required
validation[].fieldstringrequired
validation[].codestringrequired
validation[].messagestringrequired
poolSizeinteger | nullrequired

GET/v1/config

Credit exchange rates, the country table and question languages.

No authentication.

Response (JSON)
FieldTypeNotes
ratesmap of numberrequired
ratesDatestringrequired
countriesmap of objectrequired
defaultCountryobjectrequired
defaultCountry.payMultipliernumberrequired
defaultCountry.minWithdrawalPenceintegerrequired -9007199254740991–9007199254740991
defaultCountry.payoutRailsstring[]required
defaultCountry.otpChannel"sms" | "whatsapp"required
defaultCountry.taxFieldsstring[]required
defaultCountry.tier2Availablebooleanrequired
defaultCountry.currency"GBP" | "USD" | "EUR" | "CAD"required
defaultCountry.wiseFieldsobject[]
defaultCountry.wiseFields[].keystringrequired
defaultCountry.wiseFields[].labelstringrequired
defaultCountry.wiseFields[].examplestring
defaultCountry.wiseFields[].patternstring
questionLanguages"en" | "es" | "pt" | "hi" | "fr" | "de" | "id" | "tl"[]required
reverifyDaysintegerrequired -9007199254740991–9007199254740991
tier1PayPenceintegerrequired -9007199254740991–9007199254740991
tier2PayMultipliernumberrequired
answeringCountriesstring[]

GET/v1/templates

Fixed-price question templates.

No authentication.

Response (JSON)
FieldTypeNotes
templatesobject[]required
templates[].idstringrequired
templates[].namestringrequired
templates[].descriptionstringrequired
templates[].draftobjectrequired
templates[].draft.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
templates[].draft.textstringrequired up to 600 characters
templates[].draft.contextstring up to 120 characters
templates[].draft.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
templates[].draft.optionsobject[]required up to 8 items, default []
templates[].draft.neitherbooleanrequired default false
templates[].draft.stimulusobject
templates[].draft.nintegerrequired 10–5000, default 50
templates[].draft.tier1 | 2 | 3required default 1
templates[].draft.rushbooleanrequired default false
templates[].draft.targetingobject
templates[].draft.clickTestobject
templates[].draft.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
templates[].draft.publicResultsbooleanrequired default false
templates[].draft.reason"off" | "optional" | "required"required default "off"
templates[].draft.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
templates[].priceCreditsintegerrequired -9007199254740991–9007199254740991

GET/v1/public/countries

Where heads answer from, the languages they read and pool size bands by tier.

No authentication.

Response (JSON)
FieldTypeNotes
countriesobject[]required
countries[].codestringrequired up to 2 characters, at least 2 characters
countries[].namestringrequired
countries[].languagesstring[]required
countries[].tier2Availablebooleanrequired
countries[].poolBandsobjectrequired
countries[].poolBands.tier1string | nullrequired
countries[].poolBands.tier2string | nullrequired
countries[].poolBands.tier3string | nullrequired
updatedAtstringrequired

GET/v1/tags

The self-declared tags you can target at any tier, by group (one trait per group).

No authentication.

Response (JSON)
FieldTypeNotes
groupsobject[]required
groups[].id"life_stage" | "household" | "income" | "education" | "occupation" | "interests" | "habits" | "shopping" | "health" | "media" | "pets" | "tech"required
groups[].labelstringrequired
groups[].whystringrequired
groups[].maxintegerrequired -9007199254740991–9007199254740991
tagsobject[]required
tags[].idstringrequired
tags[].group"life_stage" | "household" | "income" | "education" | "occupation" | "interests" | "habits" | "shopping" | "health" | "media" | "pets" | "tech"required
tags[].labelstringrequired

GET/v1/public/stats

Heads online now, answers this week and the median time to fifty answers.

No authentication.

Response (JSON)
FieldTypeNotes
headsOnlineNowintegerrequired -9007199254740991–9007199254740991
answersThisWeekintegerrequired -9007199254740991–9007199254740991
medianMinutesTo50numberrequired
headEarningsPerHourobjectrequired
headEarningsPerHour.lowintegerrequired -9007199254740991–9007199254740991
headEarningsPerHour.highintegerrequired -9007199254740991–9007199254740991
updatedAtstringrequired

Questions

Ask, wait and read results. Asking reserves the full price from your credits; answers not given are refunded when the question closes.

POST/v2/questions

Ask a question.

API key or OAuth token with questions:write. Idempotency-Key header required.

Requires an Idempotency-Key header (a UUID). The same key returns the same question for 24 hours; a different body with the same key is idempotency_conflict. Fails with insufficient_credits, spend_cap_exceeded or content_refused without spending anything.

Request body (JSON)
FieldTypeNotes
draftobjectrequired
draft.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
draft.textstringrequired up to 600 characters
draft.contextstring up to 120 characters
draft.languagestring pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
draft.optionsobject[] up to 8 items, default []
draft.options[].labelstringrequired up to 40 characters
draft.options[].imageUrlstring (URL)
draft.neitherboolean default false
draft.stimulusobject
draft.stimulus.imageUrlstring (URL)
draft.stimulus.audioUrlstring (URL)
draft.stimulus.textstring up to 120 characters
draft.stimulus.exposureMsinteger 2000–10000
draft.ninteger 10–5000, default 50
draft.tier1 | 2 | 3 default 1
draft.rushboolean default false
draft.targetingobject
draft.targeting.countriesstring[] up to 50 items, default []
draft.targeting.tagsstring[] up to 20 items, default []
draft.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
draft.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
draft.targeting.verifiedAgeboolean
draft.clickTestobject
draft.clickTest.maxTapsinteger 1–5, default 1
draft.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
draft.publicResultsboolean default false
draft.reason"off" | "optional" | "required" default "off"
draft.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
fromDraftIdstring
thenobject[] up to 3 items
then[].type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction" default "free_text"
then[].textstringrequired up to 600 characters, at least 8 characters
then[].optionsobject[] up to 8 items, default []
then[].options[].labelstringrequired up to 40 characters
then[].options[].imageUrlstring (URL)
then[].ninteger 10–5000, default 20
then[].tier1 | 2 | 3 default 2
then[].minConfidence"low" | "medium" | "high"
then[].reason"off" | "optional" | "required"
variantOfstring
templateIdstring
projectIdstring | null
labelsstring[] up to 10 items
externalRefstring up to 100 characters, pattern ^[\w.:\-/#@+]+$
Response (JSON)
FieldTypeNotes
questionobjectrequired
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null

GET/v2/questions

Your questions, newest first.

API key or OAuth token with questions:read.

Query parameters
FieldTypeNotes
status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"
sincestring
limitinteger 1–100
cursorstring
projectIdstring
labelstring
externalRefstring
archived"exclude" | "only" | "include"
bookmarkedboolean
mineboolean
Response (JSON)
FieldTypeNotes
questionsobject[]required
questions[].type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
questions[].textstringrequired up to 600 characters
questions[].contextstring up to 120 characters
questions[].languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
questions[].optionsobject[]required up to 8 items, default []
questions[].options[].labelstringrequired up to 40 characters
questions[].options[].imageUrlstring (URL)
questions[].neitherbooleanrequired default false
questions[].stimulusobject
questions[].stimulus.imageUrlstring (URL)
questions[].stimulus.audioUrlstring (URL)
questions[].stimulus.textstring up to 120 characters
questions[].stimulus.exposureMsinteger 2000–10000
questions[].nintegerrequired 10–5000, default 50
questions[].tier1 | 2 | 3required default 1
questions[].rushbooleanrequired default false
questions[].targetingobject
questions[].targeting.countriesstring[]required up to 50 items, default []
questions[].targeting.tagsstring[]required up to 20 items, default []
questions[].targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
questions[].targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
questions[].targeting.verifiedAgeboolean
questions[].clickTestobject
questions[].clickTest.maxTapsintegerrequired 1–5, default 1
questions[].scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
questions[].publicResultsbooleanrequired default false
questions[].reason"off" | "optional" | "required"required default "off"
questions[].contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
questions[].idstringrequired
questions[].status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
questions[].source"app" | "portal" | "api" | "mcp"required
questions[].answeredintegerrequired -9007199254740991–9007199254740991
questions[].creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
questions[].creditsReservedintegerrequired -9007199254740991–9007199254740991
questions[].creditsSpentintegerrequired -9007199254740991–9007199254740991
questions[].etaMinutesintegerrequired -9007199254740991–9007199254740991
questions[].leaderLinestring | nullrequired
questions[].refusedCategorystring | nullrequired
questions[].publicCodestring | nullrequired
questions[].createdAtstringrequired
questions[].liveAtstring | nullrequired
questions[].closedAtstring | nullrequired
questions[].teamIdstring | null
questions[].askedByobject | null
questions[].askedBy.idstringrequired
questions[].askedBy.namestring | nullrequired
questions[].projectIdstring | null
questions[].labelsstring[]
questions[].archivedboolean
questions[].bookmarkedboolean
questions[].externalRefstring | null
nextCursorstring | nullrequired

GET/v2/questions/{id}

One question and its progress.

API key or OAuth token with questions:read.

Response (JSON)
FieldTypeNotes
questionobjectrequired
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null

PATCH/v2/questions/{id}

Complete early once minAnswers heads have answered, or file it: project, labels, archive, bookmark and a set-once externalRef.

API key or OAuth token with questions:write.

If that many have already answered, the question closes now and what was not answered is refunded. Changing an externalRef once set is refused with 409 external_ref_set.

Request body (JSON)
FieldTypeNotes
minAnswersinteger 1–5000
projectIdstring | null
labelsstring[] up to 10 items
archivedboolean
bookmarkedboolean
externalRefstring up to 100 characters, pattern ^[\w.:\-/#@+]+$
Response (JSON)
FieldTypeNotes
questionobjectrequired
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null

GET/v2/questions/labels

Labels in use in the account, most used first.

API key or OAuth token with questions:read.

Response (JSON)
FieldTypeNotes
labelsobject[]required
labels[].labelstringrequired
labels[].countintegerrequired -9007199254740991–9007199254740991

GET/v2/questions/{id}/result

The result so far. Partial while the question is live.

API key or OAuth token with questions:read.

With a filter, the distribution, breakdowns and answers are of matching answers only; nUnfiltered counts them all and suppressed is true when a country or age band matched too few to show. insights is the summary of written answers once there is one.

Query parameters
FieldTypeNotes
optioninteger 0–8
tierinteger 1–3
countrystring up to 2 characters, at least 2 characters
age_bandstring
qstring up to 100 characters
Response (JSON)
FieldTypeNotes
resultobjectrequired
result.questionIdstringrequired
result.status"in_progress" | "complete" | "underfilled" | "cancelled"required
result.nRequestedintegerrequired -9007199254740991–9007199254740991
result.nAcceptedintegerrequired -9007199254740991–9007199254740991
result.distributionobject[]required
result.distribution[].optionstringrequired
result.distribution[].countintegerrequired -9007199254740991–9007199254740991
result.distribution[].sharenumberrequired
result.distribution[].averageRanknumber
result.distribution[].appearancesinteger -9007199254740991–9007199254740991
result.distribution[].strengthnumber
result.distribution[].rankinteger -9007199254740991–9007199254740991
result.meannumber | nullrequired
result.summaryobjectrequired
result.summary.winnerstring | nullrequired
result.summary.marginnumber | nullrequired
result.summary.confidence"low" | "medium" | "high" | nullrequired
result.summary.notestringrequired
result.summary.suggestedFollowUpstring | nullrequired
result.tierintegerrequired -9007199254740991–9007199254740991
result.languagestringrequired
result.verificationLinestringrequired
result.medianSecondsnumber | nullrequired
result.creditsSpentintegerrequired -9007199254740991–9007199254740991
result.answersobject[]required
result.answers[].optionstring | nullrequired
result.answers[].textstring | nullrequired
result.answers[].translatedTextstring | null
result.answers[].reasonstring | null
result.answers[].translatedReasonstring | null
result.answers[].tierintegerrequired -9007199254740991–9007199254740991
result.answers[].attestationRefstringrequired
result.answers[].answeredAtstringrequired
result.answers[].pinnedboolean
result.answers[].flagobject | null
result.answers[].tapsobject[]
result.breakdownobject[]
result.breakdown[].tagIdstringrequired
result.breakdown[].labelstringrequired
result.breakdown[].nintegerrequired -9007199254740991–9007199254740991
result.breakdown[].distributionobject[]required
result.refundCreditsintegerrequired -9007199254740991–9007199254740991
result.breakdownsobject[]
result.breakdowns[].dimension"country" | "tier" | "age_band" | "gender" | "tag"required
result.breakdowns[].segmentsobject[]required
result.clicksobject
result.clicks.imageUrlstring | nullrequired
result.clicks.tapsintegerrequired -9007199254740991–9007199254740991
result.clicks.pointsobject[]required
result.clicks.gridinteger[]required
result.clicks.gridSizeintegerrequired -9007199254740991–9007199254740991
result.clicks.hotspotsobject[]required
result.clicks.heatmapUrlstring | nullrequired
result.sentimentobject
result.sentiment.positivenumberrequired
result.sentiment.neutralnumberrequired
result.sentiment.negativenumberrequired
result.translationLanguagestring | null
result.insightsobject | null
result.insights.questionIdstringrequired
result.insights.languagestringrequired
result.insights.sourceLanguagestringrequired
result.insights.takeawaystringrequired
result.insights.themesobject[]required up to 8 items
result.insights.sentimentobjectrequired
result.insights.basedOnintegerrequired -9007199254740991–9007199254740991
result.insights.answersAtTimeintegerrequired -9007199254740991–9007199254740991
result.insights.originalobject | nullrequired
result.insights.kind"interim" | "final"required
result.insights.generatedAtstringrequired
result.insights.refreshAfterstring | nullrequired
result.insights.enginestringrequired
result.filterobject
result.filter.optioninteger 0–8
result.filter.tierinteger 1–3
result.filter.countryobject
result.filter.ageBandstring pattern ^[0-9]{2}(-[0-9]{2}|\+)$
result.filter.gender"woman" | "man" | "non_binary"
result.filter.qstring up to 100 characters
result.nUnfilteredinteger -9007199254740991–9007199254740991
result.suppressedboolean
result.facetsobject
result.facets.tiersobject[]required
result.facets.countriesobject[]required
result.facets.ageBandsobject[]required
result.facets.gendersobject[]

GET/v2/questions/{id}/answers

Matching answers, newest first, a page at a time, with reasons and translations.

API key or OAuth token with questions:read.

Query parameters
FieldTypeNotes
optioninteger 0–8
tierinteger 1–3
countrystring up to 2 characters, at least 2 characters
age_bandstring
qstring up to 100 characters
limitinteger 1–200
cursorstring up to 200 characters
Response (JSON)
FieldTypeNotes
questionIdstringrequired
filterobjectrequired
filter.optioninteger 0–8
filter.tierinteger 1–3
filter.countryobject
filter.ageBandstring pattern ^[0-9]{2}(-[0-9]{2}|\+)$
filter.gender"woman" | "man" | "non_binary"
filter.qstring up to 100 characters
totalintegerrequired -9007199254740991–9007199254740991
nUnfilteredintegerrequired -9007199254740991–9007199254740991
suppressedbooleanrequired
answersobject[]required
answers[].optionstring | nullrequired
answers[].textstring | nullrequired
answers[].translatedTextstring | null
answers[].reasonstring | null
answers[].translatedReasonstring | null
answers[].tierintegerrequired -9007199254740991–9007199254740991
answers[].attestationRefstringrequired
answers[].answeredAtstringrequired
answers[].pinnedboolean
answers[].flagobject | null
answers[].flag.reason"off_topic" | "low_effort" | "abusive" | "automated"required
answers[].flag.status"open" | "upheld" | "dismissed"required
answers[].flag.refundCreditsintegerrequired -9007199254740991–9007199254740991
answers[].flag.createdAtstringrequired
answers[].flag.decidedAtstring | nullrequired
answers[].tapsobject[]
answers[].taps[].xnumberrequired 0–1
answers[].taps[].ynumberrequired 0–1
translationLanguagestring | nullrequired
nextCursorstring | nullrequired

GET/v2/questions/{id}/insights

The summary of the written answers: themes with counts and quotes, sentiment, a takeaway.

API key or OAuth token with questions:read.

Made by a machine from the reasons and free text, never from who answered; counts and quotes are computed from the answers. Written in the account's language, with the question-language original.

Response (JSON)
FieldTypeNotes
insightsobject | nullrequired
insights.questionIdstringrequired
insights.languagestringrequired
insights.sourceLanguagestringrequired
insights.takeawaystringrequired
insights.themesobject[]required up to 8 items
insights.themes[].labelstringrequired
insights.themes[].countintegerrequired -9007199254740991–9007199254740991
insights.themes[].sharenumberrequired
insights.themes[].sentiment"positive" | "neutral" | "negative"required
insights.themes[].optionstring | nullrequired
insights.themes[].quotesstring[]required up to 3 items
insights.sentimentobjectrequired
insights.sentiment.positiveintegerrequired -9007199254740991–9007199254740991
insights.sentiment.neutralintegerrequired -9007199254740991–9007199254740991
insights.sentiment.negativeintegerrequired -9007199254740991–9007199254740991
insights.basedOnintegerrequired -9007199254740991–9007199254740991
insights.answersAtTimeintegerrequired -9007199254740991–9007199254740991
insights.originalobject | nullrequired
insights.original.takeawaystringrequired
insights.original.themesobject[]required
insights.kind"interim" | "final"required
insights.generatedAtstringrequired
insights.refreshAfterstring | nullrequired
insights.enginestringrequired

POST/v2/questions/{id}/insights

Make a fresh summary now: once every 10 minutes while live; the final one when it closes.

API key or OAuth token with questions:read.

429 rate_limited with retryAfterMs while a recent summary stands; 409 too_few_answers under three written answers.

Response (JSON)
FieldTypeNotes
insightsobject | nullrequired
insights.questionIdstringrequired
insights.languagestringrequired
insights.sourceLanguagestringrequired
insights.takeawaystringrequired
insights.themesobject[]required up to 8 items
insights.themes[].labelstringrequired
insights.themes[].countintegerrequired -9007199254740991–9007199254740991
insights.themes[].sharenumberrequired
insights.themes[].sentiment"positive" | "neutral" | "negative"required
insights.themes[].optionstring | nullrequired
insights.themes[].quotesstring[]required up to 3 items
insights.sentimentobjectrequired
insights.sentiment.positiveintegerrequired -9007199254740991–9007199254740991
insights.sentiment.neutralintegerrequired -9007199254740991–9007199254740991
insights.sentiment.negativeintegerrequired -9007199254740991–9007199254740991
insights.basedOnintegerrequired -9007199254740991–9007199254740991
insights.answersAtTimeintegerrequired -9007199254740991–9007199254740991
insights.originalobject | nullrequired
insights.original.takeawaystringrequired
insights.original.themesobject[]required
insights.kind"interim" | "final"required
insights.generatedAtstringrequired
insights.refreshAfterstring | nullrequired
insights.enginestringrequired

GET/v2/questions/{id}/wait

Hold the request until the question is answered, up to 25 seconds a call.

API key or OAuth token with questions:read.

Call again while done is false. minAnswers completes early once that many heads have answered.

Query parameters
FieldTypeNotes
secondsinteger 1–25
minAnswersinteger 1–9007199254740991
Response (JSON)
FieldTypeNotes
resultobjectrequired
result.questionIdstringrequired
result.status"in_progress" | "complete" | "underfilled" | "cancelled"required
result.nRequestedintegerrequired -9007199254740991–9007199254740991
result.nAcceptedintegerrequired -9007199254740991–9007199254740991
result.distributionobject[]required
result.distribution[].optionstringrequired
result.distribution[].countintegerrequired -9007199254740991–9007199254740991
result.distribution[].sharenumberrequired
result.distribution[].averageRanknumber
result.distribution[].appearancesinteger -9007199254740991–9007199254740991
result.distribution[].strengthnumber
result.distribution[].rankinteger -9007199254740991–9007199254740991
result.meannumber | nullrequired
result.summaryobjectrequired
result.summary.winnerstring | nullrequired
result.summary.marginnumber | nullrequired
result.summary.confidence"low" | "medium" | "high" | nullrequired
result.summary.notestringrequired
result.summary.suggestedFollowUpstring | nullrequired
result.tierintegerrequired -9007199254740991–9007199254740991
result.languagestringrequired
result.verificationLinestringrequired
result.medianSecondsnumber | nullrequired
result.creditsSpentintegerrequired -9007199254740991–9007199254740991
result.answersobject[]required
result.answers[].optionstring | nullrequired
result.answers[].textstring | nullrequired
result.answers[].translatedTextstring | null
result.answers[].reasonstring | null
result.answers[].translatedReasonstring | null
result.answers[].tierintegerrequired -9007199254740991–9007199254740991
result.answers[].attestationRefstringrequired
result.answers[].answeredAtstringrequired
result.answers[].pinnedboolean
result.answers[].flagobject | null
result.answers[].tapsobject[]
result.breakdownobject[]
result.breakdown[].tagIdstringrequired
result.breakdown[].labelstringrequired
result.breakdown[].nintegerrequired -9007199254740991–9007199254740991
result.breakdown[].distributionobject[]required
result.refundCreditsintegerrequired -9007199254740991–9007199254740991
result.breakdownsobject[]
result.breakdowns[].dimension"country" | "tier" | "age_band" | "gender" | "tag"required
result.breakdowns[].segmentsobject[]required
result.clicksobject
result.clicks.imageUrlstring | nullrequired
result.clicks.tapsintegerrequired -9007199254740991–9007199254740991
result.clicks.pointsobject[]required
result.clicks.gridinteger[]required
result.clicks.gridSizeintegerrequired -9007199254740991–9007199254740991
result.clicks.hotspotsobject[]required
result.clicks.heatmapUrlstring | nullrequired
result.sentimentobject
result.sentiment.positivenumberrequired
result.sentiment.neutralnumberrequired
result.sentiment.negativenumberrequired
result.translationLanguagestring | null
result.insightsobject | null
result.insights.questionIdstringrequired
result.insights.languagestringrequired
result.insights.sourceLanguagestringrequired
result.insights.takeawaystringrequired
result.insights.themesobject[]required up to 8 items
result.insights.sentimentobjectrequired
result.insights.basedOnintegerrequired -9007199254740991–9007199254740991
result.insights.answersAtTimeintegerrequired -9007199254740991–9007199254740991
result.insights.originalobject | nullrequired
result.insights.kind"interim" | "final"required
result.insights.generatedAtstringrequired
result.insights.refreshAfterstring | nullrequired
result.insights.enginestringrequired
result.filterobject
result.filter.optioninteger 0–8
result.filter.tierinteger 1–3
result.filter.countryobject
result.filter.ageBandstring pattern ^[0-9]{2}(-[0-9]{2}|\+)$
result.filter.gender"woman" | "man" | "non_binary"
result.filter.qstring up to 100 characters
result.nUnfilteredinteger -9007199254740991–9007199254740991
result.suppressedboolean
result.facetsobject
result.facets.tiersobject[]required
result.facets.countriesobject[]required
result.facets.ageBandsobject[]required
result.facets.gendersobject[]
donebooleanrequired

POST/v2/questions/{id}/cancel

Stop a live question and refund the answers not given.

API key or OAuth token with questions:write.

Response (JSON)
FieldTypeNotes
questionobjectrequired
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null
refundCreditsintegerrequired -9007199254740991–9007199254740991

POST/v2/questions/{id}/share

Turn the public results page on or off.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
publicbooleanrequired
Response (JSON)
FieldTypeNotes
publicCodestring | nullrequired
urlstring | nullrequired

GET/v2/questions/{id}/export.csv

Every answer as CSV: option or text, reason, translations, tier, attestation reference, time, and taps for a click test.

API key or OAuth token with questions:read.

Query parameters
FieldTypeNotes
optioninteger 0–8
tierinteger 1–3
countrystring up to 2 characters, at least 2 characters
age_bandstring
qstring up to 100 characters

GET/v2/questions/{id}/export.pdf

A one-page PDF report: the question, the chart, what it means and the answers (pinned first).

API key or OAuth token with questions:read.

GET/v2/questions/{id}/export.png

The chart as a PNG to share: size=square (1080×1080, default), wide (1200×675) or story (1080×1920).

API key or OAuth token with questions:read.

Query parameters
FieldTypeNotes
size"square" | "wide" | "story"

POST/v2/questions/{id}/heads

Reopen a finished question for n more heads, same wording and targeting; answers merge. dryRun quotes only.

API key or OAuth token with questions:write. Idempotency-Key header required.

Needs an Idempotency-Key unless dryRun. The question must be complete or underfilled.

Request body (JSON)
FieldTypeNotes
nintegerrequired 1–5000
dryRunboolean
Response (JSON)
FieldTypeNotes
questionobject
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null
quoteobjectrequired
quote.nintegerrequired -9007199254740991–9007199254740991
quote.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
quote.creditsTotalintegerrequired -9007199254740991–9007199254740991
quote.etaMinutesintegerrequired -9007199254740991–9007199254740991
quote.newTargetintegerrequired -9007199254740991–9007199254740991
quote.linestringrequired
creditsReservedinteger -9007199254740991–9007199254740991

POST/v2/questions/{id}/answers/{ref}/flag

Flag one answer, named by its attestation reference, for review. Upheld: removed and refunded.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
reason"off_topic" | "low_effort" | "abusive" | "automated"required
notestring up to 500 characters
Response (JSON)
FieldTypeNotes
flagobjectrequired
flag.reason"off_topic" | "low_effort" | "abusive" | "automated"required
flag.status"open" | "upheld" | "dismissed"required
flag.refundCreditsintegerrequired -9007199254740991–9007199254740991
flag.createdAtstringrequired
flag.decidedAtstring | nullrequired
flag.idstringrequired
flag.attestationRefstringrequired

POST/v2/questions/{id}/answers/{ref}/pin

Pin an answer to the top of the results and the PDF report, or unpin it.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
pinnedbooleanrequired
Response (JSON)
FieldTypeNotes
pinnedbooleanrequired

GET/v1/public/shared/{token}

The results behind a private share link. No sign-in; never cached; noindex.

No authentication.

Response (JSON)
FieldTypeNotes
questionobjectrequired
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null
resultobjectrequired
result.questionIdstringrequired
result.status"in_progress" | "complete" | "underfilled" | "cancelled"required
result.nRequestedintegerrequired -9007199254740991–9007199254740991
result.nAcceptedintegerrequired -9007199254740991–9007199254740991
result.distributionobject[]required
result.distribution[].optionstringrequired
result.distribution[].countintegerrequired -9007199254740991–9007199254740991
result.distribution[].sharenumberrequired
result.distribution[].averageRanknumber
result.distribution[].appearancesinteger -9007199254740991–9007199254740991
result.distribution[].strengthnumber
result.distribution[].rankinteger -9007199254740991–9007199254740991
result.meannumber | nullrequired
result.summaryobjectrequired
result.summary.winnerstring | nullrequired
result.summary.marginnumber | nullrequired
result.summary.confidence"low" | "medium" | "high" | nullrequired
result.summary.notestringrequired
result.summary.suggestedFollowUpstring | nullrequired
result.tierintegerrequired -9007199254740991–9007199254740991
result.languagestringrequired
result.verificationLinestringrequired
result.medianSecondsnumber | nullrequired
result.creditsSpentintegerrequired -9007199254740991–9007199254740991
result.answersobject[]required
result.answers[].optionstring | nullrequired
result.answers[].textstring | nullrequired
result.answers[].translatedTextstring | null
result.answers[].reasonstring | null
result.answers[].translatedReasonstring | null
result.answers[].tierintegerrequired -9007199254740991–9007199254740991
result.answers[].attestationRefstringrequired
result.answers[].answeredAtstringrequired
result.answers[].pinnedboolean
result.answers[].flagobject | null
result.answers[].tapsobject[]
result.breakdownobject[]
result.breakdown[].tagIdstringrequired
result.breakdown[].labelstringrequired
result.breakdown[].nintegerrequired -9007199254740991–9007199254740991
result.breakdown[].distributionobject[]required
result.refundCreditsintegerrequired -9007199254740991–9007199254740991
result.breakdownsobject[]
result.breakdowns[].dimension"country" | "tier" | "age_band" | "gender" | "tag"required
result.breakdowns[].segmentsobject[]required
result.clicksobject
result.clicks.imageUrlstring | nullrequired
result.clicks.tapsintegerrequired -9007199254740991–9007199254740991
result.clicks.pointsobject[]required
result.clicks.gridinteger[]required
result.clicks.gridSizeintegerrequired -9007199254740991–9007199254740991
result.clicks.hotspotsobject[]required
result.clicks.heatmapUrlstring | nullrequired
result.sentimentobject
result.sentiment.positivenumberrequired
result.sentiment.neutralnumberrequired
result.sentiment.negativenumberrequired
result.translationLanguagestring | null
result.insightsobject | null
result.insights.questionIdstringrequired
result.insights.languagestringrequired
result.insights.sourceLanguagestringrequired
result.insights.takeawaystringrequired
result.insights.themesobject[]required up to 8 items
result.insights.sentimentobjectrequired
result.insights.basedOnintegerrequired -9007199254740991–9007199254740991
result.insights.answersAtTimeintegerrequired -9007199254740991–9007199254740991
result.insights.originalobject | nullrequired
result.insights.kind"interim" | "final"required
result.insights.generatedAtstringrequired
result.insights.refreshAfterstring | nullrequired
result.insights.enginestringrequired
result.filterobject
result.filter.optioninteger 0–8
result.filter.tierinteger 1–3
result.filter.countryobject
result.filter.ageBandstring pattern ^[0-9]{2}(-[0-9]{2}|\+)$
result.filter.gender"woman" | "man" | "non_binary"
result.filter.qstring up to 100 characters
result.nUnfilteredinteger -9007199254740991–9007199254740991
result.suppressedboolean
result.facetsobject
result.facets.tiersobject[]required
result.facets.countriesobject[]required
result.facets.ageBandsobject[]required
result.facets.gendersobject[]
expiresAtstringrequired

GET/v2/questions/{id}/heatmap.png

A click test's heatmap as a transparent PNG to lay over the image. Add ?aspect=width/height to match it.

API key or OAuth token with questions:read.

POST/v2/questions/{id}/dispute

Dispute a result within 7 days of it closing.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
reasonstringrequired up to 2000 characters, at least 10 characters
Response (JSON)
FieldTypeNotes
oktruerequired

GET/v1/public/results/{code}

A result its requester made public.

No authentication.

Response (JSON)
FieldTypeNotes
questionobjectrequired
question.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
question.textstringrequired up to 600 characters
question.contextstring up to 120 characters
question.languagestringrequired pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
question.optionsobject[]required up to 8 items, default []
question.options[].labelstringrequired up to 40 characters
question.options[].imageUrlstring (URL)
question.neitherbooleanrequired default false
question.stimulusobject
question.stimulus.imageUrlstring (URL)
question.stimulus.audioUrlstring (URL)
question.stimulus.textstring up to 120 characters
question.stimulus.exposureMsinteger 2000–10000
question.nintegerrequired 10–5000, default 50
question.tier1 | 2 | 3required default 1
question.rushbooleanrequired default false
question.targetingobject
question.targeting.countriesstring[]required up to 50 items, default []
question.targeting.tagsstring[]required up to 20 items, default []
question.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
question.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
question.targeting.verifiedAgeboolean
question.clickTestobject
question.clickTest.maxTapsintegerrequired 1–5, default 1
question.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
question.publicResultsbooleanrequired default false
question.reason"off" | "optional" | "required"required default "off"
question.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
question.idstringrequired
question.status"draft" | "scheduled" | "live" | "complete" | "underfilled" | "cancelled" | "refused"required
question.source"app" | "portal" | "api" | "mcp"required
question.answeredintegerrequired -9007199254740991–9007199254740991
question.creditsPerAnswerintegerrequired -9007199254740991–9007199254740991
question.creditsReservedintegerrequired -9007199254740991–9007199254740991
question.creditsSpentintegerrequired -9007199254740991–9007199254740991
question.etaMinutesintegerrequired -9007199254740991–9007199254740991
question.leaderLinestring | nullrequired
question.refusedCategorystring | nullrequired
question.publicCodestring | nullrequired
question.createdAtstringrequired
question.liveAtstring | nullrequired
question.closedAtstring | nullrequired
question.teamIdstring | null
question.askedByobject | null
question.askedBy.idstringrequired
question.askedBy.namestring | nullrequired
question.projectIdstring | null
question.labelsstring[]
question.archivedboolean
question.bookmarkedboolean
question.externalRefstring | null
resultobjectrequired
result.questionIdstringrequired
result.status"in_progress" | "complete" | "underfilled" | "cancelled"required
result.nRequestedintegerrequired -9007199254740991–9007199254740991
result.nAcceptedintegerrequired -9007199254740991–9007199254740991
result.distributionobject[]required
result.distribution[].optionstringrequired
result.distribution[].countintegerrequired -9007199254740991–9007199254740991
result.distribution[].sharenumberrequired
result.distribution[].averageRanknumber
result.distribution[].appearancesinteger -9007199254740991–9007199254740991
result.distribution[].strengthnumber
result.distribution[].rankinteger -9007199254740991–9007199254740991
result.meannumber | nullrequired
result.summaryobjectrequired
result.summary.winnerstring | nullrequired
result.summary.marginnumber | nullrequired
result.summary.confidence"low" | "medium" | "high" | nullrequired
result.summary.notestringrequired
result.summary.suggestedFollowUpstring | nullrequired
result.tierintegerrequired -9007199254740991–9007199254740991
result.languagestringrequired
result.verificationLinestringrequired
result.medianSecondsnumber | nullrequired
result.creditsSpentintegerrequired -9007199254740991–9007199254740991
result.answersobject[]required
result.answers[].optionstring | nullrequired
result.answers[].textstring | nullrequired
result.answers[].translatedTextstring | null
result.answers[].reasonstring | null
result.answers[].translatedReasonstring | null
result.answers[].tierintegerrequired -9007199254740991–9007199254740991
result.answers[].attestationRefstringrequired
result.answers[].answeredAtstringrequired
result.answers[].pinnedboolean
result.answers[].flagobject | null
result.answers[].tapsobject[]
result.breakdownobject[]
result.breakdown[].tagIdstringrequired
result.breakdown[].labelstringrequired
result.breakdown[].nintegerrequired -9007199254740991–9007199254740991
result.breakdown[].distributionobject[]required
result.refundCreditsintegerrequired -9007199254740991–9007199254740991
result.breakdownsobject[]
result.breakdowns[].dimension"country" | "tier" | "age_band" | "gender" | "tag"required
result.breakdowns[].segmentsobject[]required
result.clicksobject
result.clicks.imageUrlstring | nullrequired
result.clicks.tapsintegerrequired -9007199254740991–9007199254740991
result.clicks.pointsobject[]required
result.clicks.gridinteger[]required
result.clicks.gridSizeintegerrequired -9007199254740991–9007199254740991
result.clicks.hotspotsobject[]required
result.clicks.heatmapUrlstring | nullrequired
result.sentimentobject
result.sentiment.positivenumberrequired
result.sentiment.neutralnumberrequired
result.sentiment.negativenumberrequired
result.translationLanguagestring | null
result.insightsobject | null
result.insights.questionIdstringrequired
result.insights.languagestringrequired
result.insights.sourceLanguagestringrequired
result.insights.takeawaystringrequired
result.insights.themesobject[]required up to 8 items
result.insights.sentimentobjectrequired
result.insights.basedOnintegerrequired -9007199254740991–9007199254740991
result.insights.answersAtTimeintegerrequired -9007199254740991–9007199254740991
result.insights.originalobject | nullrequired
result.insights.kind"interim" | "final"required
result.insights.generatedAtstringrequired
result.insights.refreshAfterstring | nullrequired
result.insights.enginestringrequired
result.filterobject
result.filter.optioninteger 0–8
result.filter.tierinteger 1–3
result.filter.countryobject
result.filter.ageBandstring pattern ^[0-9]{2}(-[0-9]{2}|\+)$
result.filter.gender"woman" | "man" | "non_binary"
result.filter.qstring up to 100 characters
result.nUnfilteredinteger -9007199254740991–9007199254740991
result.suppressedboolean
result.facetsobject
result.facets.tiersobject[]required
result.facets.countriesobject[]required
result.facets.ageBandsobject[]required
result.facets.gendersobject[]

Drafts and uploads

Save work in progress and upload images before you ask.

GET/v1/drafts

Saved drafts.

API key or OAuth token with questions:read.

Response (JSON)
FieldTypeNotes
draftsobject[]required
drafts[].idstringrequired
drafts[].draftobjectrequired
drafts[].draft.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
drafts[].draft.textstring up to 600 characters
drafts[].draft.contextstring up to 120 characters
drafts[].draft.languagestring pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
drafts[].draft.optionsobject[] up to 8 items, default []
drafts[].draft.neitherboolean default false
drafts[].draft.stimulusobject
drafts[].draft.ninteger 10–5000, default 50
drafts[].draft.tier1 | 2 | 3 default 1
drafts[].draft.rushboolean default false
drafts[].draft.targetingobject
drafts[].draft.clickTestobject
drafts[].draft.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
drafts[].draft.publicResultsboolean default false
drafts[].draft.reason"off" | "optional" | "required" default "off"
drafts[].draft.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
drafts[].updatedAtstringrequired

POST/v1/drafts

Save a draft. PUT /v1/drafts/{id} updates one; DELETE removes it.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
textstring up to 600 characters
contextstring up to 120 characters
languagestring pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
optionsobject[] up to 8 items, default []
options[].labelstringrequired up to 40 characters
options[].imageUrlstring (URL)
neitherboolean default false
stimulusobject
stimulus.imageUrlstring (URL)
stimulus.audioUrlstring (URL)
stimulus.textstring up to 120 characters
stimulus.exposureMsinteger 2000–10000
ninteger 10–5000, default 50
tier1 | 2 | 3 default 1
rushboolean default false
targetingobject
targeting.countriesstring[] up to 50 items, default []
targeting.tagsstring[] up to 20 items, default []
targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
targeting.verifiedAgeboolean
clickTestobject
clickTest.maxTapsinteger 1–5, default 1
scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
publicResultsboolean default false
reason"off" | "optional" | "required" default "off"
contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
Response (JSON)
FieldTypeNotes
idstringrequired
draftobjectrequired
draft.type"single_choice" | "multi_choice" | "ab_image" | "pairwise" | "scale_1_5" | "ranking" | "yes_mostly_no" | "free_text" | "click_test" | "reaction"required
draft.textstring up to 600 characters
draft.contextstring up to 120 characters
draft.languagestring pattern ^[a-z]{2}(-[A-Z]{2})?$, default "en"
draft.optionsobject[] up to 8 items, default []
draft.options[].labelstringrequired up to 40 characters
draft.options[].imageUrlstring (URL)
draft.neitherboolean default false
draft.stimulusobject
draft.stimulus.imageUrlstring (URL)
draft.stimulus.audioUrlstring (URL)
draft.stimulus.textstring up to 120 characters
draft.stimulus.exposureMsinteger 2000–10000
draft.ninteger 10–5000, default 50
draft.tier1 | 2 | 3 default 1
draft.rushboolean default false
draft.targetingobject
draft.targeting.countriesstring[]required up to 50 items, default []
draft.targeting.tagsstring[]required up to 20 items, default []
draft.targeting.ageBands"18-24" | "25-34" | "35-44" | "45-54" | "55-64" | "65+"[] up to 6 items
draft.targeting.genders"woman" | "man" | "non_binary"[] up to 3 items
draft.targeting.verifiedAgeboolean
draft.clickTestobject
draft.clickTest.maxTapsintegerrequired 1–5, default 1
draft.scheduledForstring (date-time) pattern ^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d(?:\.\d+)?(?:Z))$
draft.publicResultsboolean default false
draft.reason"off" | "optional" | "required" default "off"
draft.contentFlag"none" | "medical" | "violence" | "distressing" | "alcohol_gambling" | "political"
updatedAtstringrequired

POST/v1/uploads

A pre-signed URL to upload an image or sound clip.

API key or OAuth token with questions:write.

PUT the file to uploadUrl with the returned headers (the URL is the credential, for 15 minutes), then use publicUrl in the question. Images are checked and their metadata stripped before heads see them.

Request body (JSON)
FieldTypeNotes
kind"image" | "audio"required
contentTypestringrequired
bytesintegerrequired -9007199254740991–9007199254740991
Response (JSON)
FieldTypeNotes
uploadUrlstringrequired
publicUrlstringrequired
headersmap of stringrequired

POST/v1/uploads/import

Copy an image from a public https link into 50heads.

API key or OAuth token with questions:write.

The image is fetched on our side (public https hosts only, three redirects at most), checked like an upload and stored. JPEG, PNG or WebP up to 5 MB.

Request body (JSON)
FieldTypeNotes
urlstring (URL)required
Response (JSON)
FieldTypeNotes
publicUrlstringrequired
widthinteger | nullrequired
heightinteger | nullrequired

Projects

Group questions into projects in the account the key belongs to (yours or a team's). Label, archive and give each question your own reference with the question routes.

GET/v1/projects

Projects in use, or the archived ones.

API key or OAuth token with questions:read.

Query parameters
FieldTypeNotes
archivedboolean
Response (JSON)
FieldTypeNotes
projectsobject[]required
projects[].idstringrequired
projects[].namestringrequired
projects[].descriptionstring | nullrequired
projects[].goalstring | nullrequired
projects[].bookmarkedbooleanrequired
projects[].archivedbooleanrequired
projects[].questionCountintegerrequired -9007199254740991–9007199254740991
projects[].createdAtstringrequired
projects[].updatedAtstringrequired

POST/v1/projects

Make a project.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
namestringrequired up to 80 characters
descriptionstring | null
goalstring | null
Response (JSON)
FieldTypeNotes
projectobjectrequired
project.idstringrequired
project.namestringrequired
project.descriptionstring | nullrequired
project.goalstring | nullrequired
project.bookmarkedbooleanrequired
project.archivedbooleanrequired
project.questionCountintegerrequired -9007199254740991–9007199254740991
project.createdAtstringrequired
project.updatedAtstringrequired

PATCH/v1/projects/{id}

Rename, bookmark or archive a project.

API key or OAuth token with questions:write.

Request body (JSON)
FieldTypeNotes
namestring up to 80 characters
descriptionstring | null
goalstring | null
bookmarkedboolean
archivedboolean
Response (JSON)
FieldTypeNotes
projectobjectrequired
project.idstringrequired
project.namestringrequired
project.descriptionstring | nullrequired
project.goalstring | nullrequired
project.bookmarkedbooleanrequired
project.archivedbooleanrequired
project.questionCountintegerrequired -9007199254740991–9007199254740991
project.createdAtstringrequired
project.updatedAtstringrequired

DELETE/v1/projects/{id}

Delete a project. Its questions stay, outside any project.

API key or OAuth token with questions:write.

Response (JSON)
FieldTypeNotes
oktruerequired

Credits

Balance and ledger. Credits are bought on the web; the API spends them.

GET/v1/billing/balance

Credits, what is reserved by live questions, and what is left under this key's daily cap.

API key or OAuth token with account:read.

Response (JSON)
FieldTypeNotes
creditsintegerrequired -9007199254740991–9007199254740991
reservedintegerrequired -9007199254740991–9007199254740991
expiringobject[]required
expiring[].creditsintegerrequired -9007199254740991–9007199254740991
expiring[].expiresAtstringrequired
currency"GBP" | "USD" | "EUR" | "CAD"required
capRemaininginteger | nullrequired
freeQuestionTodaybooleanrequired

GET/v1/billing/ledger

Every credit movement, newest first.

API key or OAuth token with account:read.

Query parameters
FieldTypeNotes
cursorstring
Response (JSON)
FieldTypeNotes
rowsobject[]required
rows[].idstringrequired
rows[].atstringrequired
rows[].kind"purchase" | "ask" | "refund" | "say" | "bonus" | "referral" | "payout" | "payout_returned" | "fee" | "expiry" | "clawback" | "adjustment" | "tier2_fee" | "not_paid"required
rows[].titlestringrequired
rows[].state"pending" | "available" | "in_flight" | "paid" | "reversed" | "not_paid"required
rows[].amountintegerrequired -9007199254740991–9007199254740991
rows[].refstring | nullrequired
rows[].notPaidobject | null
rows[].notPaid.idstringrequired
rows[].notPaid.source"rejected" | "clawback"required
rows[].notPaid.reason"too_fast" | "repeat" | "check_question" | "automated" | "linked_accounts" | "shared_payout_method" | "confirmed_fraud"required
rows[].notPaid.amountintegerrequired -9007199254740991–9007199254740991
rows[].notPaid.status"not_paid" | "appealed" | "upheld" | "not_upheld"required
rows[].notPaid.appealBystring | nullrequired
rows[].notPaid.decisionBystring | nullrequired
rows[].bystring | null
rows[].releaseAtstring | null
nextCursorstring | nullrequired

POST/v1/billing/checkout

Start a card or bank-transfer purchase (portal session only).

Portal session only.

Not available to API keys: buying credits needs a signed-in person.

Request body (JSON)
FieldTypeNotes
packstringrequired
currency"GBP" | "USD" | "EUR" | "CAD"required
method"card" | "bank_transfer"required
returnPathstring pattern ^\/app(\/[\w\-/]*)?$

Support

Open a ticket from a script or an agent. Replies come by email and in the portal.

POST/v1/support/tickets

Open a support ticket.

API key or OAuth token.

Signed in (key, OAuth or session), the reply goes to the account's email. Without a token, send email. 10 tickets an hour.

Request body (JSON)
FieldTypeNotes
subjectstringrequired up to 140 characters, at least 3 characters
bodystringrequired up to 5000 characters, at least 10 characters
appVersionstring up to 40 characters
category"payout" | "payout_failed" | "account" | "account_frozen" | "verification" | "question" | "billing" | "api" | "security" | "privacy" | "other"
emailstring (email) pattern ^(?:[A-Za-z0-9_'+\-]+\.)*[A-Za-z0-9_'+\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\-]*\.)+[A-Za-z]{2,}$
localestring up to 10 characters
Response (JSON)
FieldTypeNotes
ticketIdstringrequired

Webhook endpoints

Managed in the portal under Developers; listed here for completeness.

GET/v1/webhooks/endpoints

Your webhook endpoints.

Portal session only.

Response (JSON)
FieldTypeNotes
endpointsobject[]required
endpoints[].idstringrequired
endpoints[].urlstring (URL)required
endpoints[].events"question.reserved" | "question.completed" | "question.underfilled" | "question.cancelled" | "question.refused" | "credits.purchased" | "credits.low" | "credits.expiring" | "dispute.resolved" | "connection.cap_warning"[]required
endpoints[].secretstringrequired
endpoints[].createdAtstringrequired
endpoints[].lastDeliveryAtstring | nullrequired
endpoints[].lastStatusinteger | nullrequired
endpoints[].descriptionstring | null
endpoints[].enabledboolean
endpoints[].disabledReasonstring | null
endpoints[].lastSuccessAtstring | null

POST/v1/webhooks/endpoints

Add an endpoint. The secret is shown once.

Portal session only.

Request body (JSON)
FieldTypeNotes
urlstring (URL)required
events"question.reserved" | "question.completed" | "question.underfilled" | "question.cancelled" | "question.refused" | "credits.purchased" | "credits.low" | "credits.expiring" | "dispute.resolved" | "connection.cap_warning"[]required
Response (JSON)
FieldTypeNotes
endpointobjectrequired
endpoint.idstringrequired
endpoint.urlstring (URL)required
endpoint.events"question.reserved" | "question.completed" | "question.underfilled" | "question.cancelled" | "question.refused" | "credits.purchased" | "credits.low" | "credits.expiring" | "dispute.resolved" | "connection.cap_warning"[]required
endpoint.secretstringrequired
endpoint.createdAtstringrequired
endpoint.lastDeliveryAtstring | nullrequired
endpoint.lastStatusinteger | nullrequired
endpoint.descriptionstring | null
endpoint.enabledboolean
endpoint.disabledReasonstring | null
endpoint.lastSuccessAtstring | null