ShopperQuiz API
Read quiz data from your own tools: shoppers’ answers and recommendations, quizzes, recent events and real-time subscriptions.
The ShopperQuiz API lets your own tools read quiz data: look up a shopper's answers and recommendations, list quizzes, fetch recent events, or subscribe a URL to real-time events. Use it from anything that can make an HTTPS request with an API key:
- Automation tools: the HTTP step in Make, n8n, Pabbly Connect or Pipedream
- Your own code: a backend, script or scheduled job (Node, Python, PHP, Google Apps Script and so on)
- Internal tools: Retool, Appsmith or your own dashboards
- CRMs and helpdesks with custom-code or HTTP steps, for example to show a customer's quiz answers next to their profile
Create keys and see a quick start on the Developers page in your dashboard.
Available on: Starter plan and above · Platforms: Shopify and WooCommerce (identical)
To receive events when something happens, Webhooks are simpler. Use the API when a workflow that started elsewhere needs quiz data, for example "when a customer is created in my CRM, fetch their quiz answers".
Create an API key
- Go to Developers in the sidebar (under Settings).
- Name the key after where you'll use it, for example
Make, and click Create API key. - Copy the key (it starts with
sq_key_). It is shown once.
Each key appears on the Developers page with when it was created and last used. Revoke stops it immediately. You can have up to 10 active keys. Treat keys like passwords: anyone with a key can read your store's quiz responses, including shopper emails.
Authentication
Send the key in the Authorization header on every request:
Authorization: Bearer sq_key_…
Base URL: https://api.shopper-quiz.com
Use it in Make or n8n
Make: add an HTTP → Make a request module.
- URL: for example
https://api.shopper-quiz.com/v1/search/responses - Method: GET
- Headers:
Authorization=Bearer sq_key_… - Query string:
email= the shopper's email (map it from an earlier module) - Parse response: Yes
n8n: add an HTTP Request node with the same URL, method, header and query parameter. Under Authentication, you can use Generic Credential Type → Header Auth with the name Authorization and the value Bearer sq_key_….
The response is a JSON array. Map fields such as [0].answers_text or [0].recommended_product_names.
Endpoints
All responses are JSON. Searches return an array, which is empty when nothing matches.
Get the connected store
GET /v1/me
{ "id": "…", "store_name": "ARTINIQ", "store_url": "artiniq.myshopify.com", "platform": "shopify", "currency": "AUD", "plan": "growth", "connection_type": "api_key" }
List quizzes
GET /v1/quizzes returns up to 200 quizzes, newest first.
[{ "id": "3a9b8c7d-…", "name": "Hair Discovery Quiz", "status": "live", "created_at": "2026-09-01T08:00:00.000Z" }]
Find quizzes by name
GET /v1/search/quizzes?name=hair returns up to 5 quizzes whose name contains the text (case-insensitive), in the same shape.
Find a shopper's responses
GET /v1/search/responses
| Parameter | Required | Description |
|---|---|---|
email | One of email / response_id | Shopper email (case-insensitive) |
response_id | One of email / response_id | A specific response |
quiz_id | No | Limit to one quiz |
Returns up to 5 responses, newest first. Each has the same fields as a quiz.completed event: shopper, every answer (answer_<question id>, answers, answers_text) and recommended products. If you pass both email and response_id, a response must match both.
List recent responses
GET /v1/responses returns the 50 most recent responses as { id, label, created_at }, where label is "email · quiz · date". It's useful for dropdowns.
Answer fields for a quiz
GET /v1/quizzes/{quiz_id}/answer-fields
[{ "key": "answer_b1c2d3e4_0000_4000_8000_000000000001", "label": "Answer: What's your hair type?" }]
Recent events
GET /v1/events/{event}/samples?quiz_id=…
Returns up to 3 recent real events of that type (lead.created, quiz.completed, cart.added, checkout.started or order.created), with the same fields as a webhook event, flattened into one object. If there are none yet, it returns one realistic sample. quiz_id is optional.
Subscribe a URL to events
POST /v1/hooks with a JSON body:
{ "target_url": "https://example.com/shopperquiz", "event": "quiz.completed", "quiz_id": null }
It responds 201 with { "id": "…", "event": "…", "quiz_id": null, "target_url": "…", "created_at": "…", "signing_secret": "sq_whsec_…" }. Events are then delivered to target_url in the webhook format, signed with the returned signing_secret. Subscriptions created this way are tied to the key: revoking the key removes them.
Unsubscribe
DELETE /v1/hooks/{id} responds 200 { "id": "…", "deleted": true }. It is safe to call more than once.
Errors
| Status | Meaning |
|---|---|
400 | Invalid input. The error message says what to fix |
401 | Missing, invalid, revoked or expired key or token |
403 | The store's plan doesn't include integrations (Starter or above required) |
429 | Rate limit reached. Wait for the number of seconds in Retry-After |
500 | Something went wrong on our side. Retry shortly |
Error bodies look like { "error": "Enter a shopper email or a response ID to search for." }.
Limits
- 240 requests per minute per key.
- 200 active subscriptions per store.
- Use the
/v1/paths. The same endpoints also answer under/zapier/…for compatibility with the official Zapier app.
OAuth (official Zapier app only)
Your own tools use API keys. Only the official Zapier integration signs in with OAuth 2.0 instead. Authorize at https://app.shopper-quiz.com/oauth/authorize; exchange and refresh tokens at POST /zapier/oauth/token. OAuth is reserved for the official Zapier integration.
Was this page helpful?
Need more help? Open Ask Ana AI in your dashboard, or email support@shopper-quiz.com.