v1 · live

The commerce engine behind Adorė.

One fast, secure REST API for the mobile app, the website and the staff dashboard: tailoring orders, 360° catalogue, wallets, plazas, try-on and Adorė AI.

# sign in as the demo shopper curl -X POST https://api.xn--ador-yva.com/api/v1/auth/login \ -H 'Content-Type: application/json' \ -d '{"email":"[email protected]","password":"adore123"}' # → { "token": "eyJ…", "refreshToken": "eyJ…", "user": {…} } curl https://api.xn--ador-yva.com/api/v1/products?q=red+agbada+under+150k # → { "items": [...], "total": 6, "facets": {...} }
133documented operations
JWTrotating refresh tokens
orjson+ gzip + versioned cache
1error shape everywhere

Documentation

Three views of the same OpenAPI 3 schema, generated from the code so it never goes stale.

Quick start

From zero to a placed order in five calls.

Sign in

POST /auth/login with email + password, or POST /auth/signup then POST /auth/otp/verify (dev code 123456). Keep token and refreshToken.

Browse

GET /home for the whole Home screen, GET /products?category=clothing&gender=men&sort=popular for the shop, GET /products/{id} for details and size advice.

Fill the bag

POST /bag/items with productId, size, color. For tailoring, pass custom.sew with measurements and a fitting. Apply POST /bag/promo WELCOME10.

Check out

GET /checkout/options, then POST /orders with method, addressId, pin and expectedTotal. The server re-prices and locks stock atomically.

Track

GET /orders/{id} returns the timeline. Staff move orders through steps with POST /staff/orders/{id}/status; the shopper gets a notification.

Call it from anywhere

Bearer tokens, JSON in, JSON out.

const API = 'https://api.xn--ador-yva.com/api/v1';

const { token } = await fetch(`${API}/auth/login`, {
  method: 'POST', headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ email: '[email protected]', password: 'adore123' }),
}).then(r => r.json());

const bag = await fetch(`${API}/bag/items`, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` },
  body: JSON.stringify({ productId: 'p028', size: 'L', color: 'Green' }),
}).then(r => r.json());

console.log(bag.total); // naira, VAT and delivery included

Endpoint map

All paths are relative to /api/v1. 🔓 public · 🔐 shopper · 🛡️ staff

Auth 🔓

POST/auth/signup
POST/auth/otp/verify
POST/auth/login
POST/auth/refresh
POST/auth/forgot · /auth/reset
POST/auth/logout

Catalogue 🔓

GET/home
GET/products?q=&category=&collection=&sort=
GET/products/{id}
GET/categories · /collections · /brands
GET/search?q=
POST/products/{id}/reviews 🔐

Bag & checkout 🔐

GET/bag
POST/bag/items
PATCH/bag/items/{id}
POST/bag/promo
GET/checkout/options
POST/orders

Orders & wallet 🔐

GET/orders · /orders/{id}
POST/orders/{id}/cancel · /return
GET/wallet
POST/wallet/topup
POST/giftcards/redeem · /send
GET/notifications

Studio & AI 🔐

POST/tryon/photo · /tryon/video
GET/tryon/jobs/{id}
POST/body/measure
POST/beauty/apply
POST/ai/chat 🔓
GET/wishlist · /wardrobe · /looks

Staff 🛡️

GET/staff/overview?days=30
GET/staff/orders
POST/staff/orders/{id}/status
GET/staff/products · /inventory
GET/staff/customers · /vendors · /reviews
POST/staff/broadcast

Error codes

Every error answers { code, message, status, requestId, details? }. The message is safe to show to shoppers.

CodeMessage
NETWORKYou're offline. Check your connection and try again.
TIMEOUTThis is taking longer than usual. Please try again.
SERVERSomething went wrong on our side. Please try again.
NOT_FOUNDWe couldn't find that.
UNAUTHORIZEDPlease sign in to continue.
TOKEN_EXPIREDYour session has expired. Please sign in again.
TOKEN_INVALIDYour session is no longer valid. Please sign in again.
FORBIDDENYou don't have access to this.
RATE_LIMITEDToo many requests. Please wait a moment and try again.
METHOD_NOT_ALLOWEDThat action is not supported here.
INVALID_CREDENTIALSThat email or password is not right.
ACCOUNT_DISABLEDThis account has been disabled. Contact support.
EMAIL_TAKENAn account with this email already exists.
INVALID_OTPThat code is not right. Check the SMS and try again.
OTP_EXPIREDThat code has expired. Request a new one.
OUT_OF_STOCKSorry, that size just sold out.
PRICE_CHANGEDA price in your bag changed. Please review your order.
PAYMENT_DECLINEDYour bank declined this payment. Try another method.
AI_CREDITThis store's AI credit has run out.
INSUFFICIENT_FUNDSThere isn't enough store credit for this order.
PROMO_INVALIDThat promo code doesn't exist.
PROMO_EXPIREDThat promo code has expired.
PROMO_MIN_SPENDYour bag doesn't meet the minimum spend for this code.
WRONG_PINWrong PIN.
PIN_LOCKEDToo many wrong PINs. Payments are locked for 15 minutes.
NO_CREDITSYou're out of try-on credits. Swap points or buy more.
PHOTO_TOO_DARKYour photo is too dark. Try again in brighter light.
BODY_NOT_VISIBLEWe could not see your full body. Stand back so head to feet is in frame.
NO_PHOTOAdd a photo of yourself first.
VALIDATIONPlease check the highlighted fields.
RETURN_WINDOWThis order is past the 14-day return window.
CONFLICTThat conflicts with existing data.