v1 · Stable

The storeVero API

A predictable, resource-oriented REST API plus a Shopify-shaped GraphQL Storefront API. JSON everywhere, Bearer-token auth, HMAC-signed webhooks, and generous rate limits. Everything you can do in the dashboard, you can do over the API.

BASE https://storevero.com/api/v1

Introduction

The storeVero API lets you build themes, apps and integrations on top of every storeVero store. It is organised around REST: predictable resource URLs, form- or JSON-encoded request bodies, JSON responses, and standard HTTP verbs and status codes. If you have called Stripe or Shopify, this will feel familiar.

JSON
Every request and response is JSON.
Bearer auth
Scoped tokens, test & live.
Webhooks
React to events in real time.

Base URL & versioning

All Admin API requests are made to the versioned base URL below. The Storefront API is public and scoped to a single store by its handle.

endpoints
Admin API      https://storevero.com/api/v1
Storefront API https://storevero.com/api/v1/ecommerce/storefront/{store-handle}
GraphQL        https://storevero.com/api/v1/storefront/graphql

The current version is v1. Breaking changes ship under a new version prefix; additive changes (new fields, new endpoints) can arrive within v1, so write tolerant parsers that ignore unknown fields.

Authentication

The Admin API authenticates with a Bearer token. Create one in Settings → API keys, or exchange email + password at the auth endpoint. Send it in the Authorization header on every request. Never expose an admin token in client-side code.

Get a token

POST/auth/login
curl -X POST https://storevero.com/api/v1/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"you@store.com","password":"••••••••"}'
const res = await fetch('https://storevero.com/api/v1/auth/login', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ email: 'you@store.com', password: '••••••••' })
});
const { token } = await res.json();
$res = Http::post('https://storevero.com/api/v1/auth/login', [
  'email' => 'you@store.com',
  'password' => '••••••••',
]);
$token = $res->json('token');

Authenticate a request

curl https://storevero.com/api/v1/ecommerce/products \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Accept: application/json"
const res = await fetch('https://storevero.com/api/v1/ecommerce/products', {
  headers: {
    'Authorization': `Bearer ${token}`,
    'Accept': 'application/json'
  }
});
$res = Http::withToken($token)
  ->acceptJson()
  ->get('https://storevero.com/api/v1/ecommerce/products');
Storefront tokens are different: they are public, read-mostly and scoped to one store. Pass them in the X-Shopify-Storefront-Access-Token header for GraphQL, or simply call the store-scoped REST routes under your store handle.

Rate limits

The Admin API uses a leaky-bucket limiter. Every response carries your current budget in headers, so you can back off before you are throttled.

PlanRequests / minuteBurst
Starter12040
Growth600120
EnterpriseCustomCustom

When you exceed the limit you receive 429 Too Many Requests with a Retry-After header. Watch X-RateLimit-Remaining and slow down as it approaches zero.

Errors

storeVero uses conventional HTTP status codes. 2xx means success, 4xx means the request was rejected (a missing field, a bad token), and 5xx means something went wrong on our side. Validation errors return 422 with a field-keyed errors object.

422 Unprocessable Entity
{
  "message": "The name field is required.",
  "errors": {
    "name": ["The name field is required."],
    "price": ["The price must be a number."]
  }
}
200OK
201Created
401Unauthenticated — bad or missing token
403Forbidden — token lacks scope
404Resource not found
422Validation failed
429Rate limited
500Server error

Pagination

List endpoints are paginated. Pass page and per_page (max 100). Responses include a meta block with totals and the current page so you can build a pager or loop until you have everything.

GET /ecommerce/products?page=2&per_page=25
{
  "data": [ /* … 25 products … */ ],
  "meta": { "current_page": 2, "per_page": 25, "total": 214, "last_page": 9 }
}
Admin API

Products

Create, read, update and delete products, including variants, images, pricing and inventory. Products belong to the store tied to your token.

GET/ecommerce/products
POST/ecommerce/products
GET/ecommerce/products/{id}
PUT/ecommerce/products/{id}
DELETE/ecommerce/products/{id}

Create a product

curl -X POST https://storevero.com/api/v1/ecommerce/products \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Aroma Diffuser",
    "price": 1499,
    "sku": "AD-001",
    "stock": 50,
    "category_id": 3,
    "is_active": true
  }'
await fetch('https://storevero.com/api/v1/ecommerce/products', {
  method: 'POST',
  headers: {
    'Authorization': `Bearer ${token}`,
    'Content-Type': 'application/json'
  },
  body: JSON.stringify({
    name: 'Aroma Diffuser', price: 1499,
    sku: 'AD-001', stock: 50, category_id: 3, is_active: true
  })
});
Http::withToken($token)->post(
  'https://storevero.com/api/v1/ecommerce/products', [
    'name' => 'Aroma Diffuser', 'price' => 1499,
    'sku' => 'AD-001', 'stock' => 50, 'category_id' => 3, 'is_active' => true,
]);

Response

201 Created
{
  "data": {
    "id": 41, "name": "Aroma Diffuser", "slug": "aroma-diffuser",
    "price": "1499.00", "sku": "AD-001", "stock": 50,
    "category_id": 3, "is_active": true,
    "created_at": "2026-07-29T10:20:31Z"
  }
}
Admin API

Collections & categories

Organise your catalogue with collections, categories and brands. All three share the same CRUD shape and require only a name.

GET/ecommerce/collections
POST/ecommerce/collections
GET/ecommerce/categories
POST/ecommerce/categories
GET/ecommerce/brands
POST/ecommerce/brands
Admin API

Orders

Read orders, filter by status or customer, fulfil, refund and export. Orders are immutable ledgers — you transition their state rather than editing line items after the fact.

GET/orders
GET/orders/{id}
PUT/orders/{id}
POST/orders/{id}/fulfill
POST/orders/{id}/refund
GET/orders/export

Fulfil an order

curl -X POST https://storevero.com/api/v1/orders/1042/fulfill \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "tracking_number": "IN123456789", "carrier": "Delhivery" }'
await fetch('https://storevero.com/api/v1/orders/1042/fulfill', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ tracking_number: 'IN123456789', carrier: 'Delhivery' })
});
Http::withToken($token)->post(
  'https://storevero.com/api/v1/orders/1042/fulfill', [
    'tracking_number' => 'IN123456789', 'carrier' => 'Delhivery',
]);
Admin API

Customers

Look up customers, their order history and lifetime value, and honour privacy requests with a one-call GDPR export.

GET/customers
GET/customers/{id}
PUT/customers/{id}
GET/customers/{id}/orders
POST/customers/{id}/gdpr-export
Admin API

Inventory

Adjust stock with an auditable movement. You send a delta (positive or negative) and a reason; storeVero records the movement and updates the on-hand balance.

POST/ecommerce/inventory/adjust
curl -X POST https://storevero.com/api/v1/ecommerce/inventory/adjust \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "product_id": 41, "quantity": -3, "reason": "sale" }'
await fetch('https://storevero.com/api/v1/ecommerce/inventory/adjust', {
  method: 'POST',
  headers: { 'Authorization': `Bearer ${token}`, 'Content-Type': 'application/json' },
  body: JSON.stringify({ product_id: 41, quantity: -3, reason: 'sale' })
});
Http::withToken($token)->post(
  'https://storevero.com/api/v1/ecommerce/inventory/adjust', [
    'product_id' => 41, 'quantity' => -3, 'reason' => 'sale',
]);

reason is one of purchase, sale, return, adjustment or transfer.

Admin API

Reviews

Moderate product reviews. Reviews arrive pending from the storefront (see the Storefront API); approve, reply or remove them here.

GET/ecommerce/reviews
PUT/ecommerce/reviews/{id}
DELETE/ecommerce/reviews/{id}
Admin API

Bulk operations

Import or mutate many records in one call — ideal for migrations and nightly syncs. Send an array of operations and receive a per-row result set.

POST/bulk/products
POST/bulk/orders
POST/bulk/customers
Storefront API

Storefront REST

Public, store-scoped endpoints for building custom storefronts, mobile apps and headless experiences. Every route is prefixed with the store handle. No admin token required.

GET/…/{store}/products
GET/…/{store}/products/{slug}
GET/…/{store}/categories
GET/…/{store}/search?q=
GET/…/{store}/autocomplete?q=
GET/…/{store}/delivery-options
GET/…/{store}/reviews/{product}
POST/…/{store}/reviews
POST/…/{store}/orders

Place an order

curl -X POST https://storevero.com/api/v1/ecommerce/storefront/demo/orders \
  -H "Content-Type: application/json" \
  -d '{
    "customer_email": "buyer@example.com",
    "items": [{ "product_id": 41, "quantity": 2 }],
    "shipping_address": { "name": "A. Kumar", "city": "Pune", "pincode": "411001" }
  }'
await fetch('https://storevero.com/api/v1/ecommerce/storefront/demo/orders', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    customer_email: 'buyer@example.com',
    items: [{ product_id: 41, quantity: 2 }],
    shipping_address: { name: 'A. Kumar', city: 'Pune', pincode: '411001' }
  })
});
Http::post('https://storevero.com/api/v1/ecommerce/storefront/demo/orders', [
  'customer_email' => 'buyer@example.com',
  'items' => [['product_id' => 41, 'quantity' => 2]],
  'shipping_address' => ['name' => 'A. Kumar', 'city' => 'Pune', 'pincode' => '411001'],
]);
Storefront API

Storefront GraphQL

A Shopify-shaped GraphQL Storefront API — edges, nodes and cart mutations — so tools and snippets from the Shopify ecosystem port over with minimal changes. Authenticate with a storefront access token.

POST/storefront/graphql
query ProductByHandle($handle: String!) {
  productByHandle(handle: $handle) {
    id
    title
    handle
    priceRange { minVariantPrice { amount currencyCode } }
    images(first: 3) { edges { node { url altText } } }
  }
}
curl -X POST https://storevero.com/api/v1/storefront/graphql \
  -H "X-Shopify-Storefront-Access-Token: YOUR_STOREFRONT_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "query": "{ productByHandle(handle: \"aroma-diffuser\") { title } }" }'
mutation {
  cartCreate(input: { lines: [{ merchandiseId: "41", quantity: 2 }] }) {
    cart { id checkoutUrl
      lines(first: 10) { edges { node { quantity } } }
    }
  }
}
Automation

Webhooks

Subscribe to events and storeVero will POST a JSON payload to your endpoint the moment they happen. Every delivery is signed with HMAC-SHA256 in the X-StoreVero-Hmac-Sha256 header — always verify it before trusting the body.

orders/create
orders/paid
orders/fulfilled
orders/cancelled
products/create
products/update
customers/create
carts/abandoned
app/uninstalled
reviews/create

Verify a signature

$payload = file_get_contents('php://input');
$signature = $_SERVER['HTTP_X_STOREVERO_HMAC_SHA256'] ?? '';
$expected = base64_encode(hash_hmac('sha256', $payload, $webhookSecret, true));
if (! hash_equals($expected, $signature)) {
  http_response_code(401); exit;
}
// ✓ verified — parse and handle
$event = json_decode($payload, true);
import crypto from 'crypto';
function verify(rawBody, signature, secret) {
  const expected = crypto.createHmac('sha256', secret)
    .update(rawBody, 'utf8').digest('base64');
  return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
Automation

SDKs & libraries

The API is plain HTTP + JSON, so any HTTP client works. These helpers make it faster.

Node / JS
npm i @storevero/sdk
PHP / Laravel
composer require storevero/sdk
REST clients
Postman collection
Automation

Changelog

2026-07-29
Reviews API
Public storefront reviews endpoints (submit + list with average) and admin moderation.
2026-07-20
Analytics reports
New GET /dashboard/reports with real daily sales, channel split and top products.
2026-06-30
GraphQL Storefront
productByHandle, cartCreate and cartLinesAdd reach general availability.
2026-06-01
Bulk operations
POST /bulk/* endpoints for products, orders and customers.

Ready to build?

Create a free store, generate an API key, and make your first call in minutes.

Get your API key