API
Base URL: https://api.artlove365.com. Machine-readable spec: /v1/openapi.json.
| Method | Path | Purpose |
|---|---|---|
| GET | /v1/artists?page= | Published artists (48/page, total) |
| GET | /v1/artists/{slug}?page= | Artist + works + main movements |
| GET | /v1/artworks?q=&artist=&featured=1&page= | Artworks (search in any language) |
| GET | /v1/artworks/by-slugs?slugs=a,b | Cards for a list (favorites) |
| GET | /v1/artworks/{slug} | Artwork + artist + taxa + related |
| GET | /v1/taxa/{museums|movements|subjects|genres}?page= | Browse pages with ≥ 3 works |
| GET | /v1/taxa/{kind}/{slug}?page= | One browse page + works + top artists |
| GET | /v1/seo/sitemaps, /v1/seo/sitemaps/{type}/{chunk} | Sitemap data |
| GET | /v1/account/config, /v1/account/me | Sign-in config, current user |
| POST | /v1/account/auth/google, /v1/account/auth/logout | Sign in / out |
| GET/PUT/DELETE | /v1/account/favorites[/{slug}], POST /merge | Favorites |
| POST | /v1/uploads | Upload a customer photo (body = image bytes, `Content-Type: image/jpeg |
| POST | /v1/orders | Create an order → { code, total, checkoutUrl } |
| GET | /v1/orders/{code}?email= | Order status + history (email must match) |
| POST | /v1/payments/stripe-webhook | Stripe webhook (signature verified) |
| GET | /v1/admin/orders?status= | Staff: list orders (Authorization: Bearer $ADMIN_TOKEN) |
| POST | /v1/admin/orders/{code}/status | Staff: { status, note?, trackingNumber? } |
| GET | /v1/admin/seo/stats · POST /v1/admin/seo/publish {count} | Staff: SEO growth, publish now |
All amounts are integer US cents. Errors: { "error": { "code", "message" } }.