Skip to main content

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)

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 Integrations → Zapier → Manage → API keys.
  2. Name the key after where you'll use it, for example Make, and click Create key.
  3. 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

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 /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​

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.
  • 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?