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)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| shoply-0.1.0.tar.gz | 100.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| 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.