Quickstart
Create an API key and generate your first research report.
1. Create an API key
Open the research workspace, go to API keys in your account menu, and create a key. The full key is shown only once — store it somewhere safe.
Keys look like this:
moe_sk_live_ followed by 43 random characters
2. Check your credits
curl https://api.moevox.com/api/v1/credits \ -H "Authorization: Bearer moe_sk_live_your_key_here"
{
"credits_left": 1000
}3. Submit a report
curl -X POST https://api.moevox.com/api/v1/reports \
-H "Authorization: Bearer moe_sk_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"question": "Which landing page headline converts best?",
"options": [
"AI research for product teams",
"Market validation, automated",
"Know your market in minutes"
],
"sample_size": 100
}'The response contains a request_id. The pipeline runs async and takes a few minutes.
4. Poll for the result
curl https://api.moevox.com/api/v1/reports/req_4f3a9c21e8b7d6c5 \ -H "Authorization: Bearer moe_sk_live_your_key_here"
Poll every 5 seconds while the questionnaire is being generated, then every 15 seconds during sampling. The status moves through queued → generating_questionnaire → sampling → completed. When completed, the response embeds the full result:
{
"request_id": "req_4f3a9c21e8b7d6c5",
"status": "completed",
"result": {
"report_url": "https://moevox.com/report/...",
"title": "Which pricing plan should we launch first?",
"analysis": { "overview": { "headline": "..." } },
"sample_data": {
"questionnaire": { "questions": [] },
"respondents": []
},
"credits_used": 100,
"credits_left": 900
}
}5. Use the report
Open report_url in a browser for the public report page. The analysis JSON contains the structured findings (winner, confidence, segment breakdown, risks, recommendation), and sample_data contains every respondent answer.
6. The whole flow in JavaScript
The same submit-and-poll loop in one snippet (Node.js 18+, no dependencies). Save it as .mjs or wrap the code in anasync function (it uses top-level await):
const BASE_URL = 'https://api.moevox.com';
const API_KEY = 'moe_sk_live_your_key_here';
const headers = { Authorization: `Bearer ${API_KEY}` };
async function createReport() {
const res = await fetch(`${BASE_URL}/api/v1/reports`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json' },
body: JSON.stringify({
question: 'Which pricing plan should we launch first?',
options: ['Monthly $29', 'Monthly $49', 'Annual $299'],
sample_size: 100,
}),
});
if (!res.ok) throw new Error(`HTTP ${res.status}: ${await res.text()}`);
return res.json(); // { request_id, status: 'queued', credits_estimated, credits_left }
}
async function pollUntilDone(requestId) {
for (;;) {
const res = await fetch(`${BASE_URL}/api/v1/reports/${requestId}`, { headers });
const data = await res.json();
if (data.status === 'completed' || data.status === 'failed') return data;
await new Promise((r) => setTimeout(r, 5000));
}
}
const { request_id } = await createReport();
const report = await pollUntilDone(request_id);
console.log(report.result); // report_url, analysis, sample_data, credits_used, credits_leftThis mirrors the curl flow above. For a polling loop that also handles credits and errors, copy the AI Prompt.