Agency API v1
Appifyer Agency API
Build mobile apps and integrations on top of your merchants' real Shopify and WooCommerce data — one API key, unified catalog, two-way order sync.
Base URL
https://appifyer-6fx410cje-infiniotics.vercel.app/login?redirect=%2F/api/v1
Authentication
Create a key in the Appifyer portal → API Keys. The full secret is shown once.
Authorization: Bearer appifyer_sk_YOUR_KEYAlso accepted: x-api-key: appifyer_sk_YOUR_KEY
| Scope | Access |
|---|---|
| Agency | All merchants under your agency. Pass merchant_id to filter or write. |
| Merchant | Locked to one merchant. |
Writes with an agency key require merchant_id in the JSON body.
Response format
{
"success": true,
"data": {},
"meta": {
"page": 1,
"limit": 50,
"total": 123,
"has_more": true
}
}{
"success": false,
"error": {
"code": "unauthorized",
"message": "Invalid API key"
}
}Common query parameters
| Param | Description |
|---|---|
merchant_id | UUID — filter to one merchant (agency keys) |
page | Default 1 |
limit | Default 50, max 100 |
search / q | Text search where supported |
platform | e.g. shopify, woocommerce |
updated_after | ISO date for incremental sync |
status | Orders filter |
Products
| Method | Path | Description |
|---|---|---|
| GET | /products | List products |
| GET | /products/:id | Product detail |
{
"id": "uuid",
"merchant_id": "uuid",
"external_id": "platform-id",
"platform": "shopify",
"name": "Classic Tee",
"price": 29,
"inventory": 42,
"category": "Apparel",
"image_url": "https://…",
"created_at": "…",
"updated_at": "…"
}Orders
| Method | Path | Description |
|---|---|---|
| GET | /orders | List orders |
| GET | /orders/:id | Order detail |
| POST | /orders | Create order + push to store |
| PATCH | /orders/:id | Update status / shipping / items + push |
platform_sync.status: synced · pending · failed · skipped
{
"merchant_id": "uuid",
"status": "pending",
"customer_email": "buyer@example.com",
"line_items": [
{ "name": "Classic Tee", "quantity": 2, "price": 29 }
],
"shipping": {
"name": "Alex Rivera",
"address1": "12 Market St",
"city": "Austin",
"country": "US",
"zip": "78701"
}
}Customers
| Method | Path | Description |
|---|---|---|
| GET | /customers | List customers |
| POST | /customers | Create customer |
| GET | /customers/:id | Customer detail |
| PATCH | /customers/:id | Update customer |
Merchants
| Method | Path | Description |
|---|---|---|
| GET | /merchants | List merchants (agency keys only) |
Sync
| Method | Path | Description |
|---|---|---|
| GET | /sync/status | Recent sync jobs |
Incoming webhooks
| Path | Status |
|---|---|
POST /api/webhooks/shopify?merchant_id=… | Live (HMAC) |
POST /api/webhooks/woocommerce?merchant_id=… | Live (signature) |
POST /api/webhooks/magento | Stub |
POST /api/webhooks/bigcommerce | Stub |
Registered automatically on store connect when possible. Manual Sync Now remains the fallback.
Errors & rate limits
| HTTP / code | Meaning |
|---|---|
401 unauthorized | Missing or invalid API key |
402 payment_required | Subscription inactive / API access denied |
403 forbidden | Agency suspended or out of scope |
429 rate_limited | Quota exceeded (Retry-After header) |
| Plan | Per minute | Per month |
|---|---|---|
| Starter | 60 | 100,000 |
| Growth | 120 | 500,000 |
| Agency | 300 | 1,000,000 |
Examples
curl "https://appifyer-6fx410cje-infiniotics.vercel.app/login?redirect=%2F/api/v1/products?limit=20" \
-H "Authorization: Bearer appifyer_sk_YOUR_KEY"const res = await fetch(
"https://appifyer-6fx410cje-infiniotics.vercel.app/login?redirect=%2F/api/v1/orders?merchant_id=MERCHANT_UUID",
{ headers: { Authorization: "Bearer appifyer_sk_YOUR_KEY" } }
);
const json = await res.json();
if (!json.success) throw new Error(json.error.message);final response = await http.get(
Uri.parse('https://appifyer-6fx410cje-infiniotics.vercel.app/login?redirect=%2F/api/v1/customers?page=1&limit=50'),
headers: {'Authorization': 'Bearer appifyer_sk_YOUR_KEY'},
);App projects
Agencies can wrap a connected merchant in a mobile storefront template via the Appifyer portal (/app-projects). Live previews use the same synced catalog as GET /api/v1/products — templates are presentation only; the API is the data layer.