Skip to main content

Tiny, production-minded helper for the Shopify Admin GraphQL API

Project description

Shopify GraphQL Helper

PyPI TestPyPI Python Versions License: MIT CI Publish GitHub Release

Tiny, production‑minded helpers for the Shopify Admin GraphQL API. Shopify's official Python SDK exposes GraphQL().execute only; this package adds sessions, automatic cursor pagination, and per‑shop throttling.

Features:

  • 🚀 Simple, focused API for Shopify GraphQL Admin API
  • 🔄 Automatic cursor-based pagination
  • ⚡ Built-in request throttling
  • 🔒 Thread-safe implementation
  • 🧩 Transport layer abstraction

Note: This is not an official Shopify package.

Installation

pip install shopify-gql-helper

Quickstart

query = """
query ($first:Int!, $after:String) {
  products(first:$first, after:$after, query:"status:ACTIVE") {
    pageInfo { hasNextPage endCursor }
    nodes { id legacyResourceId title handle }
  }
}
"""

from shopify_gql_helper import ShopifySession, execute, cursor_pages

session = ShopifySession("https://example.myshopify.com", "shpca_123")

# One-off request
data = execute(session, query, {"first": 1})

# Stream all products
for product in cursor_pages(session, query, ["data", "products"]):
    print(product["id"], product["title"])

connection_path lists the keys from the response root to the desired connection, so ["data", "products"] points to data.products above. Additional GraphQL variables can be supplied via the optional variables argument.

Throttling

Shopify uses a leaky bucket policy. ShopifySession coordinates requests per shop through a shared ThrottleController. Adjust min_bucket (default 50) and min_sleep (default 1.0s) to tune how aggressively you consume the bucket. Reuse a single ShopifySession per shop to avoid fighting the throttling limits.

Configuration

ShopifySession

from shopify_gql_helper import ShopifySession

# Required parameters
session = ShopifySession(
    shop_url="https://your-store.myshopify.com",
    access_token="shpca_your_access_token"
)

# Optional parameters
session = ShopifySession(
    shop_url="https://your-store.myshopify.com",
    access_token="shpca_your_access_token",
    api_version="2025-01",  # default
    min_bucket=50,          # minimum available requests before throttling
    min_sleep=1.0,          # minimum sleep time between requests (seconds)
)

Throttling

Shopify uses a leaky bucket policy. ShopifySession coordinates requests per shop through a shared ThrottleController.

Important: Reuse a single ShopifySession per shop to properly respect rate limits.

Retries

Requests use a thread-local requests.Session with urllib3's Retry to handle connect/read errors and 429/5xx responses with exponential backoff. Retry counts can be tuned via SHOPIFY_GQL_RETRIES or RequestsTransport(retries=...). A small amount of random jitter is added to backoff delays (configurable via SHOPIFY_GQL_JITTER or RequestsTransport(jitter=...)), and Retry-After headers are honored. By default, a Connection: close header is sent with each request; pass force_close=False to RequestsTransport to enable persistent connections.

Custom Transport

You can provide a custom transport that implements the Transport protocol:

from shopify_gql_helper.transport import Transport

class CustomTransport(Transport):
    def post(self, url: str, headers: dict, json: dict, timeout: float):
        raise NotImplementedError

Development

# Install with development dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run with coverage
pytest --cov=shopify_gql_helper

Limitations / Roadmap

  • Bulk operations
  • Nested pagination (e.g., products → variants)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.


This project is not affiliated with Shopify Inc. Shopify is a registered trademark of Shopify Inc.

MIT. Not affiliated with Shopify.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

shopify_gql_helper-0.1.3.tar.gz (14.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

shopify_gql_helper-0.1.3-py3-none-any.whl (12.3 kB view details)

Uploaded Python 3

File details

Details for the file shopify_gql_helper-0.1.3.tar.gz.

File metadata

  • Download URL: shopify_gql_helper-0.1.3.tar.gz
  • Upload date:
  • Size: 14.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for shopify_gql_helper-0.1.3.tar.gz
Algorithm Hash digest
SHA256 6bc558b9dca4a5d307b9ebfe018faf1e6be0bc59c1882e92c37d4e6afe0219d6
MD5 19ddda2d902704c128cee8a9a386b2ae
BLAKE2b-256 819f46b2b9c620fa82dd00952e23490678cf9d2349ec5266c00f23865b644acf

See more details on using hashes here.

Provenance

The following attestation bundles were made for shopify_gql_helper-0.1.3.tar.gz:

Publisher: upload-python-package.yml on tulayha/shopify-gql-helper-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file shopify_gql_helper-0.1.3-py3-none-any.whl.

File metadata

File hashes

Hashes for shopify_gql_helper-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 7ebc6c23d2a8bb6e2c381975bb89afd9c159c9e59897a75a6b8310edfdbe9c04
MD5 9144e880d1c6a95cc4de6d0ede3782a2
BLAKE2b-256 be8b71e87489348f615a7290f222ec3b68bb5cc643a11ce0d945772e87d1f99a

See more details on using hashes here.

Provenance

The following attestation bundles were made for shopify_gql_helper-0.1.3-py3-none-any.whl:

Publisher: upload-python-package.yml on tulayha/shopify-gql-helper-py

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page