Request validation, token exchange, and Admin GraphQL, delivered as three framework-agnostic building blocks. Works with Laravel / Symfony / Django / FastAPI, or plain PHP and Python. The older shopify-api-php / shopify_python_api are now deprecated.
shopify/shopify-app-php and PyPI's shopifyapp.Install with composer for PHP and pip for Python. Both are generally available (GA).
Runs on any stack: Laravel / Symfony / Django / FastAPI, or plain PHP and Python.
shopify-api-php is abandoned andshopify_python_api is now inactive. They still work, but no new features or security fixes are coming.
Both packagesthe same primitivesare exposed. You don't have to adopt the whole framework — you compose only the pieces you need.
This covers webhooks, App Home, App Bridge requests, App Proxy requests, and requests from Checkout / POS / Admin / Customer Account / Flow extensions.
Token exchange.client credentials , plusrefreshof already-exchanged access tokens.
Automatic retry handlingbuilt into the Admin GraphQL client.
shop / idToken returned by verification as-is— that is the correct usage. Do not re-parse or re-verify the request yourself (an explicit instruction in the article).| Item | Old: shopify-api-php / shopify_python_api | New: shopify-app-php / shopifyapp |
|---|---|---|
| Status | Deprecated Abandoned on Packagist, inactive on PyPI | GA Reached v1.0 |
| New features | Not coming | Actively developed |
| Security fixes | Not coming | Provided |
| Behavior | Keeps working | — |
| Migration deadline | None No forced migration and no removal date have been set. When you're ready, follow the upgrade notes in the README andmigrate gradually | |
| App templates | — | None No templates are provided for PHP / Python — you scaffold the project yourself |
For new projects, adopt the new packages. Existing apps keep running withno immediate action required.
Nothing changes for them with this update.
React Router remains the "recommended path for most new apps."
Exactly the steps from the article's "Starting a new PHP / Python app" section.
Install the package for your language.
Build it yourself with your preferred framework / stack.
Example: verify the request → exchange the token.
Confirm that validation succeeds and that the token exchange returns an access token.
composer require shopify/shopify-app-php
pip install shopifyapp
$shopify = new Shopify\App\ShopifyApp($clientId, $clientSecret);
$result = $shopify->verifyAppHomeReq($request);
$result gives you
$result->shop : the validated shop
$result->idToken : an ID token you can exchange for an access token
log, plus the response
Webhook / App Home / App Bridge / App Proxy / Checkout / POS / Admin / Customer Account / Flow ── pick the matching method. Use the returned valuesas-is(don't parse or re-validate them yourself).
Rather than "adopt an all-in-one framework," the design lets youcompose only the pieces you need. You can drop it into an existing project without breaking its structure.
It's designed so you migrate one route at a time, not rewrite the whole app. There's no forced migration or removal date for users of the older libraries, so you can plan the move at your own pace.
Both packagesimplement the same contract and pass the same test suite. An improvement to one benefits the other, and your PHP and Python teams won't have to debate behavioral differences.
The client includesautomatic retry handling. Any place where you wrote your own backoff is a candidate for replacement. The exact retry conditions arenot specified ── check the README.
No app template is provided for PHP / Python. Instead, the README documents every primitive, andpassing it as context to AI coding toolsis an officially intended way to use it. That is consistent with the design intent: a small, explicit API is readable by humans and AI alike.
shopify-api-php / shopify_python_api . It still works, but it is treated as abandoned / inactive, sono security fixes are coming.