Build with The Lesson Stand

Sellers and the tools they use can work with their own store through our API, get a call the moment a sale happens, and show their resources on their own blog or website.

API keys

Make a key on your API keys page (you will need two-step sign-in). Send it with every call:

Authorization: Api-Key ls_your_key_here

Keys are shown once, can be revoked at any time, and are limited to 600 calls an hour each.

Seller API (Pro)

The Seller API comes with the Pro plan. Sellers on Free can still use the widgets below.

CallWhat it does
GET /api/v1/seller/products/Your listings, every status.
GET /api/v1/seller/products/ID/One listing.
PATCH /api/v1/seller/products/ID/Change title, summary, price, grades, subject, season; send "publish": true or false.
GET /api/v1/seller/sales/Your sales with your share, the card fee and your net. Never buyer names or emails.
GET /api/v1/seller/stats/The last 30 days: views, sales, earnings, followers, balances.
GET, POST /api/v1/seller/webhooks/List or add a webhook address.
DELETE /api/v1/seller/webhooks/ID/Remove one.

Every call, with the fields it takes and returns, is in the interactive API reference.

Webhooks

Add an https:// address and choose the events you want: sale.created and sale.refunded. We send a JSON body and sign it, so you can check it came from us. The header looks like X-LessonStand-Signature: t=1700000000,v1=abc..., where v1 is HMAC-SHA256 of t, a dot, and the raw body, made with your webhook's secret.

import hashlib, hmac

def is_from_the_lesson_stand(body: bytes, header: str, secret: str) -> bool:
    parts = dict(item.split("=", 1) for item in header.split(","))
    signed = parts["t"].encode() + b"." + body
    expected = hmac.new(secret.encode(), signed, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, parts["v1"])

If your address does not answer with a 2xx status, we try again, up to 5 times.

Widgets for your blog or website

Show one product, or your store's newest resources, on your own site. Copy the code from your seller dashboard, or use:

<iframe src="https://lessonstand.com/embed/store/YOUR-STORE/" width="100%" height="320" title="My store" loading="lazy"></iframe>
<iframe src="https://lessonstand.com/embed/product/PRODUCT-ID/" width="260" height="340" title="My resource" loading="lazy"></iframe>

Widgets are for every seller, Free and Pro. They always carry a small "From The Lesson Stand" credit link. Pro sellers' widgets use their referral link, so those sales pay them 90 percent.

Catalog API (no key needed)

Search live resources and read product details: GET /api/v1/catalog/products/?q=fractions&grade=3&standard=3.NF and GET /api/v1/catalog/products/ID/. Approved apps add &app=YOUR-APP-ID and each result carries a referral_url that earns the app its referral reward.

Sign in with The Lesson Stand (OAuth 2)

Register your app in the developer portal. Once our team approves it, send teachers to /oauth/authorize/ (authorization code flow with PKCE, https redirect addresses only), swap the code at /oauth/token/, then call /api/v1/oauth/me/ (scope profile) or /api/v1/oauth/library/ (scope library:read, titles and links of what they own, never the files). Access tokens last an hour; refresh tokens rotate.

Good manners

Use the API for your own store and the tools you run. Do not try to collect buyers' details, and do not copy other sellers' listings. Keys that break these rules are revoked.