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

Open PortalBook a Live Demo

Authentication

Create a key in the Appifyer portal → API Keys. The full secret is shown once.

HTTP header
Authorization: Bearer appifyer_sk_YOUR_KEY

Also accepted: x-api-key: appifyer_sk_YOUR_KEY

ScopeAccess
AgencyAll merchants under your agency. Pass merchant_id to filter or write.
MerchantLocked to one merchant.

Writes with an agency key require merchant_id in the JSON body.

Response format

Success
{
  "success": true,
  "data": {},
  "meta": {
    "page": 1,
    "limit": 50,
    "total": 123,
    "has_more": true
  }
}
Error
{
  "success": false,
  "error": {
    "code": "unauthorized",
    "message": "Invalid API key"
  }
}

Common query parameters

ParamDescription
merchant_idUUID — filter to one merchant (agency keys)
pageDefault 1
limitDefault 50, max 100
search / qText search where supported
platforme.g. shopify, woocommerce
updated_afterISO date for incremental sync
statusOrders filter

Products

MethodPathDescription
GET/productsList products
GET/products/:idProduct detail
Product object
{
  "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

MethodPathDescription
GET/ordersList orders
GET/orders/:idOrder detail
POST/ordersCreate order + push to store
PATCH/orders/:idUpdate status / shipping / items + push

platform_sync.status: synced · pending · failed · skipped

Create order body
{
  "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

MethodPathDescription
GET/customersList customers
POST/customersCreate customer
GET/customers/:idCustomer detail
PATCH/customers/:idUpdate customer

Merchants

MethodPathDescription
GET/merchantsList merchants (agency keys only)

Sync

MethodPathDescription
GET/sync/statusRecent sync jobs

Incoming webhooks

PathStatus
POST /api/webhooks/shopify?merchant_id=…Live (HMAC)
POST /api/webhooks/woocommerce?merchant_id=…Live (signature)
POST /api/webhooks/magentoStub
POST /api/webhooks/bigcommerceStub

Registered automatically on store connect when possible. Manual Sync Now remains the fallback.

Errors & rate limits

HTTP / codeMeaning
401 unauthorizedMissing or invalid API key
402 payment_requiredSubscription inactive / API access denied
403 forbiddenAgency suspended or out of scope
429 rate_limitedQuota exceeded (Retry-After header)
PlanPer minutePer month
Starter60100,000
Growth120500,000
Agency3001,000,000

Examples

curl — list products
curl "https://appifyer-6fx410cje-infiniotics.vercel.app/login?redirect=%2F/api/v1/products?limit=20" \
  -H "Authorization: Bearer appifyer_sk_YOUR_KEY"
JavaScript
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);
Flutter
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.