Skip to main content

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)

Do you need the API?

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​

  1. Go to Developers in the sidebar (under Settings).
  2. Name the key after where you'll use it, for example Make, and click Create API key.
  3. 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

ParameterRequiredDescription
emailOne of email / response_idShopper email (case-insensitive)
response_idOne of email / response_idA specific response
quiz_idNoLimit 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​

StatusMeaning
400Invalid input. The error message says what to fix
401Missing, invalid, revoked or expired key or token
403The store's plan doesn't include integrations (Starter or above required)
429Rate limit reached. Wait for the number of seconds in Retry-After
500Something 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.