The Shopify Admin API is what you use when you need to build apps that actually integrate with Shopify stores without making everyone's life miserable. Been around since 2009, so they've had 16 fucking years to work out most of the stupid bugs that plague newer APIs. You get both GraphQL and REST because Shopify couldn't pick a fucking side. Honestly? That's fine - means you're not stuck with whatever architectural decision some principal engineer thought was revolutionary in 2015. The official developer documentation covers everything from basic integration guides to advanced API usage patterns.
What This Thing Actually Does
Here's what you can access: products (including the nightmare that is variant management), orders (and the joy of order states that change when you're not looking), customers (with all their address formatting quirks), payments (good luck with refund edge cases), shipping (because tax calculations weren't complicated enough), and analytics (when the data actually makes sense).
The dual API approach means you can use GraphQL when you need to be efficient and don't want to make 47 REST calls to get related data, or stick with REST when you just want to CRUD some shit without learning query languages.
We're on 2025-07 as of September 1st. Quarterly releases, 12 months support each. Actually reasonable compared to APIs that break shit weekly. Check the 2025-01 release notes to see what changed from previous versions.
2025-07 fixed some bulk operations stuff and improved webhook reliability. The important part: update your version strings in prod or everything breaks. Finding out your app died because you're still hitting deprecated endpoints is Monday morning hell. Had this happen on a Friday evening when 2024-04 finally got killed - spent my entire weekend migrating a client's inventory sync app while their store was down. Cost them $15K in missed sales.
The Authentication Dance
OAuth 2.0 for public apps, simple access tokens for custom apps. Sounds easy, right? Fuck no. The OAuth flow will make you question your career choices at 2am on a Tuesday. You'll spend more time debugging redirect URIs and token refresh logic than actually building features. The OAuth docs are decent, but you'll still hit invalid_client
error exactly 3 times before you realize your redirect URI can't have a trailing slash. I learned this the hard way after a 4-hour debugging session that ended with me staring at a single character difference.
Scopes are granular, which is good and bad. Good because you're not requesting god-level permissions for simple apps. Bad because you'll inevitably forget the scope you need and have to go through the OAuth dance again. Popular ones: read_products
, write_orders
, read_analytics
. There are over 40 scopes total, so plan accordingly. For custom apps, you can generate access tokens directly in the Shopify admin and skip the OAuth complexity entirely.
All requests need the X-Shopify-Access-Token
header. Endpoints are https://{store-name}.myshopify.com/admin/api/{version}/{resource}.json
for REST and https://{store-name}.myshopify.com/admin/api/{version}/graphql.json
for GraphQL. Memorize these patterns because you'll be typing them a lot.
Rate Limits Will Ruin Your Day
API Rate Limiting: The Bucket That Leaks - Shopify uses a "leaky bucket" algorithm where requests fill up your quota bucket, and it drains at a steady rate. When the bucket overflows, you get 429 errors and everything stops working.
REST gets you 40 requests per minute (400 for Plus stores). Sounds like a lot until you're syncing a 500-product catalog and hitting 429 errors every 30 seconds. GraphQL uses "cost" instead of request count - 50 points per second, 500 for Plus. One complex query can eat your entire budget. Shopify's engineering team wrote an excellent deep-dive on rate limiting GraphQL APIs by calculating query complexity that explains the cost system better than the official docs.
The cost system is both brilliant and infuriating. Brilliant because it stops people from writing queries that fetch the entire fucking catalog in one request. Infuriating because figuring out query costs feels like doing taxes while drunk. I learned this the hard way when a single product query with inventory levels across 12 locations cost 89 points and blew through our entire daily budget in 3 requests. The GraphQL rate limits guide explains that simple objects cost 1 point while mutations typically cost 10 points. For complex scenarios, check this Stack Overflow discussion about managing cost calculations in production apps.
Fun fact: the Storefront API gets 500 requests per minute because it's read-only customer-facing stuff. The Admin API is more restrictive because you can actually break things. The comprehensive rate limits introduction covers Shopify's leaky bucket approach in detail.
In practice, this means a standard store syncing 1,000 products with variants and inventory levels will take about 25 minutes using REST (assuming you batch efficiently and don't hit errors). With GraphQL, the same sync can complete in 3-5 minutes if your queries are well-optimized, but poorly designed queries can blow your entire budget on the first request. The GraphQL query complexity analyzer helps predict costs, but real-world testing is essential. For developers managing complex apps, Lunar's developer guide provides practical strategies for handling rate limits at scale. Plan your integration accordingly, and implement retry logic with exponential backoff because you will hit rate limits.
GraphQL or REST? Both will frustrate you in different ways. Here's the breakdown: