Skip to main content

shoply

Shoply's API from your own server. Every route of the API reference is a method, with types your editor and mypy read, safe retries, lists a page at a time or all at once, and checking that a webhook came from Shoply.

pip install shoply

Python 3.9 or later. No dependencies.

import shoply

client = shoply.Client()  # SHOPLY_API_KEY from the environment

order = client.orders.show("ORDER_ID")

for customer in client.customers.list(search="gmail.com"):
    print(customer["emailAddress"])

coupon = client.coupons.create(code="SPRING10", value=10)

Make the key under Developers, API Keys in the dashboard, with the permissions your code needs. Keep it on your server.

A route's method is its id: Get an order is orders.show, so client.orders.show(order_id). The address's IDs come first, in order, then the fields as keyword arguments, by the names the reference gives them, then options. A field whose name is a Python keyword takes an underscore: from_.

Errors

A refusal is a shoply.ShoplyError, with status, code (not_found, missing_scope, validation_failed...), errors for each field that is wrong, and request_id.

try:
    client.coupons.create(code="SPRING10", value=10)
except shoply.ShoplyError as error:
    if error.code == "validation_failed":
        print(error.errors)

A change is sent with an Idempotency-Key, the same on every try, so a try whose answer was lost is never carried out twice. Pass idempotency_key=... to use your own.

Webhooks

import os

import shoply
from flask import Flask, request

app = Flask(__name__)


@app.post("/webhooks/shoply")
def shoply_webhook() -> tuple[str, int]:
    try:
        event = shoply.webhooks.verify(request.get_data(), request.headers, os.environ["SHOPLY_WEBHOOK_SECRET"])
    except shoply.ShoplyError:
        return "", 401

    if event["event"] == "order.paid":
        ...  # event["data"] is the order

    return "", 200

The Customer API

shoply.Customer signs a buyer in with a code emailed to them, and reads their own orders, keys and subscriptions. It holds the buyer's token and no key.

buyer = shoply.Customer("YOUR_STORE_ID")

buyer.login(email=email)
buyer.verify(email=email, code=code)
me = buyer.show()

The whole guide: https://docs.shoply.gg/api-reference/python

Metadata

Release files for shoply 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for shoply 0.1.0
File Size Uploaded Provenance
shoply-0.1.0.tar.gz 100.5 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for shoply 0.1.0
File Interpreter ABI Platform
shoply-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 199.5 kB

Release files / shoply-0.1.0.tar.gz

Download URL shoply-0.1.0.tar.gz
Size 100.5 kB
Tags Source
SHA-256 checksum
How to use checksums
c7e085dc4dc3e4e4a009277bba2dd5aae5c31b72351ce2d5fab87b0ae7ceb885
BLAKE2b-256 checksum
How to use checksums
b8e86882e25474f1e88ea6c68cf3f7175444cdb397236f32419c621910b06552
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Release files / shoply-0.1.0-py3-none-any.whl

Download URL shoply-0.1.0-py3-none-any.whl
Size 99.0 kB
Tags Python 3
SHA-256 checksum
How to use checksums
829698d566339358348fba2caee938c03c76e1ca420c4a200a8a47d180fcb7ee
BLAKE2b-256 checksum
How to use checksums
06e65b8e6ce879d7067568f7c4a306736eb3ff47da162724947875ad3087870c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.6

Security for shoply 0.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page