Endpoints
Forty-seven endpoints, all relative to https://aov-cart-drawer.firebaseapp.com/store-api/v1. Thirteen
are GET and work with any key. The other thirty-four change the cart drawer and need a
read and write key.
Every request carries Authorization: Bearer aov_sk_…. See Overview
for creating a key and for the response envelope.
Each endpoint is the HTTP form of an MCP tool. The MCP tool column names it and links to the tool guide, which explains what the fields mean. This page covers only the HTTP side: paths, parameters and rules.
| Endpoint | Does | MCP tool | Key |
|---|---|---|---|
GET /context | The store, its plan and drawer generation | get_store_context | Read |
GET /configuration-options | The styles, block types, locales and markets you can use | get_configuration_options | Read |
GET /setup-health | Whether the drawer is installed and working | get_setup_health | Read |
GET /drawer-settings | The saved cart drawer configuration | get_drawer_settings | Read |
GET /products | Search products | search_products | Read |
GET /products/variants | Variants of one product | get_product_variants | Read |
GET /collections | Search collections | search_collections | Read |
GET /discounts | Search discounts | search_discounts | Read |
GET /analytics | Cart drawer performance for a date range | get_analytics | Read |
GET /templates | The cart drawer templates (first generation only) | get_all_templates | Read |
GET /translations | Translated wording for one language | get_translations | Read |
GET /plan | Plan and access status | get_plan_status | Read |
GET /operation-status | The outcome of an earlier change | get_operation_status | Read |
| Write endpoints | Change settings, blocks, rewards, upsells, wording | One per endpoint, named below | Read and write |
Query parameters on a GET go in the URL. pageSize is 1–50 wherever it is accepted. Where a read
returns a page and there is more, the response includes a cursor to pass back unchanged.
GET /store-api/v1 returns this list for the key you call it with — only the endpoints that key can
use on this store. Use it when a path here and your store disagree.
Two cart drawer generations
A store's cart drawer is either the first generation (built from templates) or the second generation (built from zone styles). Most endpoints work on both. A few belong to one:
| Only on the first generation | Only on the second generation |
|---|---|
GET /templates | PATCH /drawer-settings/zone-design |
PATCH /drawer-settings/design | PUT /drawer-settings/quick-style |
POST /template/switch | PUT /drawer-settings/zone-style |
Calling one on the wrong generation returns TOOL_UNAVAILABLE_FOR_STATE (409), and the message names
the generation the store uses. GET /context tells you which one you have before you try.
/context
No parameters. A good first call. What it returns is described under
get_store_context.
curl "https://aov-cart-drawer.firebaseapp.com/store-api/v1/context" \
-H "Authorization: Bearer aov_sk_YOUR_KEY"/configuration-options
The values the write endpoints accept, so you do not have to guess identifiers. What each domain lists
is described under
get_configuration_options.
Query:
| Name | Meaning |
|---|---|
domain | styles, blockTypes, locales or markets |
kind | For styles: quickStyle, zoneStyle, colorPreset or themeScheme |
pageSize | 1–50 |
offset | Where to start in the list |
/setup-health
No parameters. What it checks, and the issue codes it returns, are described under
get_setup_health.
/drawer-settings
The saved cart drawer configuration, together with its revision. Read it before you write. What each
section holds is described under
get_drawer_settings.
Query:
| Name | Meaning |
|---|---|
sections | Comma-separated: general, design, content, rewards, upsell, addons, validation |
schemaVersion | 2 |
pageSize | 1–50 |
cursor | From a previous response |
expectedRevision | Fail if the configuration is no longer at this revision |
blockKey | Read one block |
htmlOffset | Where to continue reading a long custom HTML block |
Ask for only the sections you need. The whole configuration is large.
The MCP tool also takes offsets. This API does not: to page through a long list, send the cursor from the
previous response.
{"success": true, "data": {"revision": 42, "…": "…"}, "error": null}/products
Search products by name, handle, vendor or status.
Query:
| Name | Meaning |
|---|---|
name | Words in the title |
handle | The exact handle |
vendor | The vendor |
status | ACTIVE, ARCHIVED, DRAFT or UNLISTED |
pageSize | 1–50 |
cursor | From a previous response |
Send at least one of name, handle, vendor or status. name and handle cannot be combined.
What each result contains is described under
Finding products, collections and discounts,
which also covers /products/variants, /collections and /discounts.
/products/variants
The variants of one product, with their ids.
Query:
| Name | Meaning |
|---|---|
name, handle or productId | Exactly one of these |
vendor, status | Only together with name |
pageSize, cursor | Paging |
/collections
Query: name (required), pageSize, cursor.
/discounts
Query: name (required), pageSize.
Only the first 100 eligible discounts are searched, so a store with more may not see every match.
Narrow name rather than assuming a missing discount does not exist.
/analytics
Cart drawer performance over a date range. What each figure means is described under
get_analytics.
Query:
| Name | Meaning |
|---|---|
start | YYYY-MM-DD, in the store's timezone |
end | YYYY-MM-DD, in the store's timezone |
Leave both out for the last 30 days. The range can be at most 400 days. A longer one is refused with
INVALID_INPUT and the message "that window is longer than 400 days. Ask for a shorter period."
curl "https://aov-cart-drawer.firebaseapp.com/store-api/v1/analytics?start=2026-08-01&end=2026-08-31" \
-H "Authorization: Bearer aov_sk_YOUR_KEY"/templates
First generation only. What it lists is described under
get_all_templates.
/translations
The wording the drawer shows in one language.
Query: template and locale (for example fr or pt-BR). What text and translations hold is
described under get_translations.
/plan
The store's plan and whether it includes the Store API. No parameters. What the plan state means is
described under get_plan_status.
/operation-status
Query: operationId — the 64-character id a write returned. What it reports is described under
get_operation_status.
Writing
Write endpoints take a JSON object as the body. Send Content-Type: application/json. The body
mirrors the input of the matching MCP tool, named in the
MCP tool column of the tables below, so the field meanings are in the
MCP tool guide and how every change behaves is in
Writing: how every change behaves;
this API adds only the HTTP shape.
curl -X PATCH "https://aov-cart-drawer.firebaseapp.com/store-api/v1/reward-bar/settings" \
-H "Authorization: Bearer aov_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"expectedRevision": 42, "requestId": "reward-bar-2026-08-31"}'Saved, and what it returns
A write that commits returns:
{"success": true, "data": {"status": "saved", "revision": 43, "changed": ["…"], "operationId": "…"}, "error": null}revision is the new revision. changed lists which documents were touched. When an operationId is present you
can follow it with GET /operation-status?operationId=…. A saved change is then published to the
storefront; if publishing is still running or did not finish, POST /configuration-publication/retry
with the revision you were given as expectedRevision retries it.
A write that did not commit returns success: false with a 409 (or 422) and the reason in
error.code. Nothing was changed. See
A write that was not saved.
expectedRevision and requestId
Both are optional on every write, with one exception: POST /configuration-publication/retry requires
expectedRevision.
| Field | Type | Meaning |
|---|---|---|
expectedRevision | integer, 0 or more | Refuse if the configuration is no longer at this revision. Protects work saved by someone else. |
requestId | string, up to 255 characters | Names one intended change. Repeating it does not apply the change twice; reusing it for a different change is refused. Upsell changes generate one for you when you leave it out. |
Confirming deletions
Removing a reward tier or an upsell rule, and switching template, needs ?confirm=true on the URL.
Without it the request is refused and nothing is removed.
Write endpoints
Every one needs a read and write key. Paths marked 1st or 2nd generation work only on that generation.
Settings
| Endpoint | Changes | MCP tool |
|---|---|---|
PATCH /drawer-settings/general | General settings | update_general_settings |
PATCH /drawer-settings/features | Turn features on or off: cart-drawer, upsell, reward-bar, announcement, shipping-protection — body updates: [{feature, enabled}] | update_drawer_features |
PATCH /drawer-settings/style | Colours, as a map of hex values | update_drawer_style |
PATCH /drawer-settings/design | Design (1st generation) | update_drawer_design |
PATCH /drawer-settings/zone-design | Zone design (2nd generation) | update_zone_design |
PUT /drawer-settings/quick-style | Apply a quick style by styleId (2nd generation) | set_quick_style |
PUT /drawer-settings/zone-style | Apply a style to one zone by styleId (2nd generation) | set_zone_style |
PUT /drawer-settings/color-preset | Apply a colour preset | apply_color_preset |
POST /template/switch?confirm=true | Switch template; body template (1st generation) | switch_template |
PATCH /global-display-settings | Where the drawer shows | update_global_display_settings |
PATCH /cart-validation | Cart validation rules | update_cart_validation |
PATCH /sticky-cart | The sticky cart | update_sticky_cart |
PATCH /wording | Drawer wording | update_wording |
PATCH /translations/:locale | Wording for one language, for example fr or pt-BR | update_translation |
Blocks
| Endpoint | Changes | MCP tool |
|---|---|---|
POST /blocks | Add a block. Exactly one of blockType, name or html (up to 20,000 characters); optional label, view (fullCart or emptyCart), zone (header, body or footer) | add_drawer_block |
PATCH /blocks/:blockKey | Edit a custom HTML block: send html, or resetToOriginal: true | update_imported_block |
DELETE /blocks/:blockKey | Remove a block | remove_drawer_block |
PUT /blocks/order | Reorder blocks in a view and zone; body order, 1–30 entries | set_block_order |
PATCH /blocks/settings | One block's settings: block, view, enabled and the block's own fields | update_block_settings |
PATCH /content-block-settings | Content block settings | update_content_block_settings |
Rewards
| Endpoint | Changes | MCP tool |
|---|---|---|
PATCH /reward-bar/settings | The reward bar | update_reward_bar_settings |
POST /reward-tiers | Add a tier: rewardType, goalValue, title, discount and product fields, goalByMarket, goalBySpecificCurrency, icon | add_reward_tier |
PATCH /reward-tiers/:tierId | Edit a tier. A number is treated as a legacy position | update_reward_tier |
PUT /reward-tiers/order | Reorder; body tierIds, 1–20 entries | reorder_reward_tiers |
DELETE /reward-tiers/:tierId?confirm=true | Remove a tier | remove_reward_tier |
Upsell
| Endpoint | Changes | MCP tool |
|---|---|---|
PATCH /upsell/settings | Upsell settings | update_upsell_settings |
POST /upsell-rules | Add a rule | add_upsell_rule |
PATCH /upsell-rules/:id | Edit a rule | update_upsell_rule |
PUT /upsell-rules/order | Reorder; body ruleIds | reorder_upsell_rules |
DELETE /upsell-rules/:id?confirm=true | Remove a rule | remove_upsell_rule |
PUT /upsell-default-slots | The default upsell slots and their discount settings | update_upsell_default_slots |
Add-ons and publishing
| Endpoint | Changes | MCP tool |
|---|---|---|
PATCH /gift-wrap/settings | Gift wrap | update_gift_wrap_settings |
PATCH /shipping-protection/settings | Shipping protection | update_shipping_protection_settings |
POST /configuration-publication/retry | Retry publishing the saved revision; body expectedRevision (required), optional requestId | retry_configuration_publication |
Write endpoints change the live cart drawer. Read /drawer-settings first, send its revision as
expectedRevision, and test an integration on a development store before pointing it at a real one.
The write limits are under Limits. See Errors for what a refused write looks like.