ShopperQuiz API
The ShopperQuiz API lets your tools read quiz data: look up a shopper's answers, list quizzes, fetch recent events, or subscribe a URL to events. It powers the Zapier integration, and you can call it from Make, n8n, Pabbly or your own code with an API key.
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 Integrations → Zapier → Manage → API keys.
- Name the key after where you'll use it, for example
Make, and click Create key. - Copy the key (it starts with
sq_key_). It is shown once.
Each key appears in the drawer 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/zapier/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 /zapier/me
{ "id": "…", "store_name": "ARTINIQ", "store_url": "artiniq.myshopify.com", "platform": "shopify", "currency": "AUD", "plan": "growth", "connection_type": "api_key" }
List quizzes
GET /zapier/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 /zapier/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 /zapier/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 /zapier/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 /zapier/quizzes/{quiz_id}/answer-fields
[{ "key": "answer_b1c2d3e4_0000_4000_8000_000000000001", "label": "Answer: What's your hair type?" }]
Recent events
GET /zapier/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), in the same flat shape Zapier receives. If there are none yet, it returns one realistic sample. quiz_id is optional.
Subscribe a URL to events
POST /zapier/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 /zapier/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.
- The
/zapier/path prefix is permanent and is used by all API clients, not only Zapier.
OAuth (Zapier)
The Zapier integration authenticates with OAuth 2.0 instead of API keys. 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?