Shopify Admin API
Description
Full read/write access to Shopify Admin REST API for managing orders, products, customers, inventory, fulfillments, refunds, returns, and transactions.
Setup
Environment Variables
SHOPIFY_STORE_DOMAIN- Your store's myshopify.com domain (e.g.,my-store.myshopify.com)SHOPIFY_ACCESS_TOKEN- Admin API access token from custom app
Required API Scopes
| Scope | Access |
|---|---|
read_orders / write_orders |
Orders, Fulfillments, Abandoned Checkouts |
read_products / write_products |
Products, Variants, Collections |
read_customers / write_customers |
Customers, Segments |
read_inventory / write_inventory |
Inventory Levels, Items |
read_returns / write_returns |
Returns |
read_all_orders |
Orders older than 60 days (requires approval) |
Authentication
All requests require this header:
X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN
Getting an Access Token
Go to your Shopify Admin > Settings > Apps and sales channels
Click "Develop apps" > "Create an app"
Configure Admin API scopes based on what you need
Install the app to your store
Copy the Admin API access token
API Reference
Base URL: https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10
Orders
List Orders
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: ids, limit, since_id, created_at_min, created_at_max, updated_at_min, updated_at_max, processed_at_min, processed_at_max, status (open, closed, cancelled, any), financial_status, fulfillment_status, fields
Get Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Order Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Update Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{"order":{"id":{ORDER_ID},"note":"Updated note","tags":"priority,vip"}}'
Close Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/close.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X POST
Re-open Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/open.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X POST
Cancel Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/cancel.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"reason":"customer","email":true,"restock":true}'
Cancel reasons: customer, fraud, inventory, declined, other
Products
List Products
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: ids, limit, since_id, title, vendor, handle, product_type, collection_id, created_at_min, created_at_max, updated_at_min, updated_at_max, published_at_min, published_at_max, published_status (published, unpublished, any), fields, status (active, archived, draft)
Get Product
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/{PRODUCT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Product Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Product
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"product":{"title":"Burton Custom Freestyle","body_html":"<strong>Good snowboard!</strong>","vendor":"Burton","product_type":"Snowboard","status":"draft","variants":[{"price":"99.99","sku":"BOARD-001"}]}}'
Update Product
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/{PRODUCT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{"product":{"id":{PRODUCT_ID},"title":"Updated Product Title","status":"active"}}'
Delete Product
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/{PRODUCT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X DELETE
Product Variants
List Variants for Product
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/{PRODUCT_ID}/variants.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Variant
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/variants/{VARIANT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Variant
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/{PRODUCT_ID}/variants.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"variant":{"option1":"Blue","price":"19.99","sku":"BLUE-001","inventory_management":"shopify"}}'
Update Variant
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/variants/{VARIANT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{"variant":{"id":{VARIANT_ID},"price":"24.99","compare_at_price":"29.99"}}'
Delete Variant
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products/{PRODUCT_ID}/variants/{VARIANT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X DELETE
Customers
List Customers
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: ids, limit, since_id, created_at_min, created_at_max, updated_at_min, updated_at_max, fields
Search Customers
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers/search.json?query=email:[email protected]" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Search fields: email, phone, first_name, last_name, company, orders_count, total_spent, country, state
Get Customer
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers/{CUSTOMER_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Customer Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Customer
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"customer":{"first_name":"John","last_name":"Doe","email":"[email protected]","phone":"+15551234567","addresses":[{"address1":"123 Main St","city":"Ottawa","province":"ON","country":"CA","zip":"K1A 0B1"}]}}'
Update Customer
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers/{CUSTOMER_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{"customer":{"id":{CUSTOMER_ID},"tags":"vip,wholesale","note":"Important customer"}}'
Delete Customer
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers/{CUSTOMER_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X DELETE
Get Customer Orders
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/customers/{CUSTOMER_ID}/orders.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Inventory
List Inventory Levels
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_levels.json?inventory_item_ids={ITEM_ID}" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: inventory_item_ids (required), location_ids, limit, updated_at_min
Adjust Inventory Level
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_levels/adjust.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"location_id":{LOCATION_ID},"inventory_item_id":{ITEM_ID},"available_adjustment":5}'
Set Inventory Level
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_levels/set.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"location_id":{LOCATION_ID},"inventory_item_id":{ITEM_ID},"available":100}'
Connect Inventory to Location
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_levels/connect.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"location_id":{LOCATION_ID},"inventory_item_id":{ITEM_ID}}'
Inventory Items
List Inventory Items
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_items.json?ids={ITEM_IDS}" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Inventory Item
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_items/{ITEM_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Update Inventory Item
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/inventory_items/{ITEM_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{"inventory_item":{"id":{ITEM_ID},"cost":"25.00","tracked":true}}'
Locations
List Locations
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/locations.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Location
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/locations/{LOCATION_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Location Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/locations/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Inventory Levels for Location
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/locations/{LOCATION_ID}/inventory_levels.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Fulfillments
List Fulfillments for Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/fulfillments.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Fulfillment
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/fulfillments/{FULFILLMENT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Fulfillment Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/fulfillments/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Fulfillment
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/fulfillments.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"fulfillment":{"line_items_by_fulfillment_order":[{"fulfillment_order_id":{FULFILLMENT_ORDER_ID}}],"tracking_info":{"number":"1Z999AA10123456784","url":"https://www.ups.com/track?tracknum=1Z999AA10123456784","company":"UPS"}}}'
Update Tracking
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/fulfillments/{FULFILLMENT_ID}/update_tracking.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"fulfillment":{"tracking_info":{"number":"1Z999AA10123456784","url":"https://www.ups.com/track?tracknum=1Z999AA10123456784","company":"UPS"},"notify_customer":true}}'
Cancel Fulfillment
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/fulfillments/{FULFILLMENT_ID}/cancel.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X POST
Fulfillment Orders
List Fulfillment Orders for Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/fulfillment_orders.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Fulfillment Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/fulfillment_orders/{FULFILLMENT_ORDER_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Refunds
List Refunds for Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/refunds.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Refund
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/refunds/{REFUND_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Calculate Refund
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/refunds/calculate.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"refund":{"shipping":{"full_refund":true},"refund_line_items":[{"line_item_id":{LINE_ITEM_ID},"quantity":1,"restock_type":"return"}]}}'
Restock types: no_restock, cancel, return, legacy_restock
Create Refund
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/refunds.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"refund":{"currency":"USD","notify":true,"note":"Customer returned item","shipping":{"full_refund":true},"refund_line_items":[{"line_item_id":{LINE_ITEM_ID},"quantity":1,"restock_type":"return"}],"transactions":[{"parent_id":{TRANSACTION_ID},"amount":"10.00","kind":"refund","gateway":"shopify_payments"}]}}'
Returns
List Returns
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/returns.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: limit, status (open, closed, cancelled, requested, in_progress)
Get Return
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/returns/{RETURN_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Return
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/returns.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"return":{"order_id":{ORDER_ID},"return_line_items":[{"fulfillment_line_item_id":{FULFILLMENT_LINE_ITEM_ID},"quantity":1,"return_reason":"WRONG_ITEM"}]}}'
Return reasons: UNKNOWN, SIZE_TOO_SMALL, SIZE_TOO_LARGE, UNWANTED, NOT_AS_DESCRIBED, WRONG_ITEM, DEFECTIVE, STYLE, COLOR, OTHER
Transactions
List Transactions for Order
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/transactions.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Transaction
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/transactions/{TRANSACTION_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Transaction Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/transactions/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Transaction (Capture)
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/orders/{ORDER_ID}/transactions.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"transaction":{"kind":"capture","amount":"10.00","parent_id":{AUTHORIZATION_ID}}}'
Transaction kinds: authorization, capture, sale, void, refund
Collections
List Custom Collections
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/custom_collections.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Custom Collection
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/custom_collections/{COLLECTION_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Custom Collection
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/custom_collections.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"custom_collection":{"title":"Summer Collection","body_html":"<p>Summer products</p>"}}'
Update Custom Collection
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/custom_collections/{COLLECTION_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X PUT \
-d '{"custom_collection":{"id":{COLLECTION_ID},"title":"Updated Collection"}}'
Delete Custom Collection
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/custom_collections/{COLLECTION_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X DELETE
List Smart Collections
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/smart_collections.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Get Smart Collection
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/smart_collections/{COLLECTION_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Smart Collection
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/smart_collections.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"smart_collection":{"title":"Sale Items","rules":[{"column":"compare_at_price","relation":"greater_than","condition":"0"}]}}'
Rule columns: title, type, vendor, variant_price, tag, compare_at_price, weight, inventory_stock, variant_compare_at_price, variant_weight, variant_inventory, variant_title
Rule relations: equals, not_equals, greater_than, less_than, starts_with, ends_with, contains, not_contains
Collects (Product-Collection Links)
List Collects
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/collects.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: product_id, collection_id, limit, since_id, fields
Create Collect
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/collects.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"collect":{"product_id":{PRODUCT_ID},"collection_id":{COLLECTION_ID}}}'
Delete Collect
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/collects/{COLLECT_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X DELETE
Abandoned Checkouts
List Abandoned Checkouts
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/checkouts.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Query parameters: limit, since_id, created_at_min, created_at_max, updated_at_min, updated_at_max, status (open, closed)
Get Abandoned Checkout Count
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/checkouts/count.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Status Reference
Order Status
| Field | Values |
|---|---|
financial_status |
pending, authorized, partially_paid, paid, partially_refunded, refunded, voided |
fulfillment_status |
null (unfulfilled), partial, fulfilled, restocked |
Product Status
| Status | Description |
|---|---|
active |
Available for sale |
archived |
No longer available, hidden from admin lists |
draft |
Not ready for sale |
Return Status
| Status | Description |
|---|---|
requested |
Return requested by customer |
in_progress |
Return being processed |
open |
Return accepted, awaiting items |
closed |
Return completed |
cancelled |
Return cancelled |
Pagination
Shopify uses cursor-based pagination via the Link header.
Using Page Info
# First request
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products.json?limit=50" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-i
Response includes Link header:
Link: <https://store.myshopify.com/admin/api/2024-10/products.json?page_info=abc123&limit=50>; rel="next"
# Next page
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/products.json?page_info=abc123&limit=50" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Note: When using page_info, you cannot use other query parameters except limit and fields.
Rate Limiting
Shopify uses a leaky bucket algorithm:
Bucket size: 40 requests
Leak rate: 2 requests/second
Restoration: ~20 seconds for full bucket
Response headers:
X-Shopify-Shop-Api-Call-Limit: Current usage (e.g.,32/40)Retry-After: Seconds to wait (on 429 response)
Best Practices
Check
X-Shopify-Shop-Api-Call-LimitheaderIf near limit, add delays between requests
On 429 response, wait for
Retry-AftersecondsUse bulk operations for large data sets
Webhooks
List Webhooks
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/webhooks.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN"
Create Webhook
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/webhooks.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-X POST \
-d '{"webhook":{"topic":"orders/create","address":"https://example.com/webhooks/orders","format":"json"}}'
Common topics: orders/create, orders/updated, orders/fulfilled, orders/cancelled, products/create, products/update, products/delete, customers/create, customers/update, inventory_levels/update, refunds/create
Delete Webhook
curl "https://$SHOPIFY_STORE_DOMAIN/admin/api/2024-10/webhooks/{WEBHOOK_ID}.json" \
-H "X-Shopify-Access-Token: $SHOPIFY_ACCESS_TOKEN" \
-X DELETE
Changelog
v1.0.0
Initial release with full Admin REST API coverage
Orders, Products, Variants, Customers
Inventory management (levels, items, locations)
Fulfillments and fulfillment orders
Refunds, Returns, Transactions
Collections (custom, smart) and collects
Abandoned checkouts
Webhooks management
Status reference tables
Pagination and rate limiting documentation