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.
Three views of the same OpenAPI 3 schema, generated from the code so it never goes stale.
From zero to a placed order in five calls.
POST /auth/login with email + password, or POST /auth/signup then POST /auth/otp/verify (dev code 123456). Keep token and refreshToken.
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.
POST /bag/items with productId, size, color. For tailoring, pass custom.sew with measurements and a fitting. Apply POST /bag/promo WELCOME10.
GET /checkout/options, then POST /orders with method, addressId, pin and expectedTotal. The server re-prices and locks stock atomically.
GET /orders/{id} returns the timeline. Staff move orders through steps with POST /staff/orders/{id}/status; the shopper gets a notification.
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
import requests
API = "https://api.xn--ador-yva.com/api/v1"
s = requests.Session()
token = s.post(f"{API}/auth/login", json={"email": "[email protected]", "password": "adore123"}).json()["token"]
s.headers["Authorization"] = f"Bearer {token}"
r = s.get(f"{API}/products", params={"collection": "couples", "sort": "priceAsc"})
for p in r.json()["items"]:
print(p["name"], p["price"])
TOKEN=$(curl -s -X POST https://api.xn--ador-yva.com/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"[email protected]","password":"adore123"}' | jq -r .token)
curl -s https://api.xn--ador-yva.com/api/v1/orders -H "Authorization: Bearer $TOKEN" | jq '.orders[0].timeline'
All paths are relative to /api/v1. 🔓 public · 🔐 shopper · 🛡️ staff
Every error answers { code, message, status, requestId, details? }. The message is safe to show to shoppers.
| Code | Message |
|---|---|
NETWORK | You're offline. Check your connection and try again. |
TIMEOUT | This is taking longer than usual. Please try again. |
SERVER | Something went wrong on our side. Please try again. |
NOT_FOUND | We couldn't find that. |
UNAUTHORIZED | Please sign in to continue. |
TOKEN_EXPIRED | Your session has expired. Please sign in again. |
TOKEN_INVALID | Your session is no longer valid. Please sign in again. |
FORBIDDEN | You don't have access to this. |
RATE_LIMITED | Too many requests. Please wait a moment and try again. |
METHOD_NOT_ALLOWED | That action is not supported here. |
INVALID_CREDENTIALS | That email or password is not right. |
ACCOUNT_DISABLED | This account has been disabled. Contact support. |
EMAIL_TAKEN | An account with this email already exists. |
INVALID_OTP | That code is not right. Check the SMS and try again. |
OTP_EXPIRED | That code has expired. Request a new one. |
OUT_OF_STOCK | Sorry, that size just sold out. |
PRICE_CHANGED | A price in your bag changed. Please review your order. |
PAYMENT_DECLINED | Your bank declined this payment. Try another method. |
AI_CREDIT | This store's AI credit has run out. |
INSUFFICIENT_FUNDS | There isn't enough store credit for this order. |
PROMO_INVALID | That promo code doesn't exist. |
PROMO_EXPIRED | That promo code has expired. |
PROMO_MIN_SPEND | Your bag doesn't meet the minimum spend for this code. |
WRONG_PIN | Wrong PIN. |
PIN_LOCKED | Too many wrong PINs. Payments are locked for 15 minutes. |
NO_CREDITS | You're out of try-on credits. Swap points or buy more. |
PHOTO_TOO_DARK | Your photo is too dark. Try again in brighter light. |
BODY_NOT_VISIBLE | We could not see your full body. Stand back so head to feet is in frame. |
NO_PHOTO | Add a photo of yourself first. |
VALIDATION | Please check the highlighted fields. |
RETURN_WINDOW | This order is past the 14-day return window. |
CONFLICT | That conflicts with existing data. |