Revio

Revio Product API

Product details and outright prices from the Revio catalogue, the same prices customers pay on revio.me.

Base URL https://api.revio.me

Overview

The API is read-only. Every request is a GET and every response is JSON.

All prices are outright purchase prices in Qatari riyals (QAR), whole numbers. Subscription and monthly prices are not part of this API.

Only products currently for sale on revio.me are returned. Pre-order items are not included. When a deal is running, the price you get is the deal price.

How prices vary

Try it in Postman

Download the ready-made collection with every endpoint set up:

Download Postman collection

  1. In Postman, choose Import and select the downloaded file.
  2. Open the Revio Product API collection, go to Variables, and paste your key into apiKey.
  3. Save, then run any request. The key is sent automatically.

Authentication

Every request to /v1 needs your secret API key in the x-api-key header. Revio gives each partner their own key.

curl https://api.revio.me/v1/products \
  -H "x-api-key: YOUR_API_KEY"

A missing or wrong key returns 401:

{ "error": "unauthorized" }
Keep your key secret. Call the API from your server, never from a browser or mobile app, where anyone could read the key. If a key leaks, tell Revio and we'll replace it.

Endpoints

GET /v1/products

Every product for sale, as a short summary without the per-colour detail.

Query parameterValuesWhat it does
categoryphone, laptop, tablet, watchOnly that type of device
brande.g. appleOnly that brand (not case-sensitive)
inStocktrueOnly products that can be bought right now
curl "https://api.revio.me/v1/products?category=phone&inStock=true" \
  -H "x-api-key: YOUR_API_KEY"
{
  "currency": "QAR",
  "count": 6,
  "products": [
    {
      "id": "iphone-17-pro",
      "url": "https://revio.me/product/iphone-17-pro",
      "name": "iPhone 17 Pro",
      "brand": "Apple",
      "category": "phone",
      "condition": "new",
      "currency": "QAR",
      "purchasable": true,
      "onDeal": false,
      "priceFrom": 4349,
      "compareAtPriceFrom": null,
      "image": "https://storage.googleapis.com/revioflex-media-2026/products/iphone-17-pro/…jpg",
      "colors": ["Cosmic Orange", "Deep Blue", "Silver"],
      "storages": ["256 GB", "512 GB"]
    }
  ]
}

GET /v1/products/{id}

One product, with a price and stock status for every colour and storage combination. {id} is the product's id from the list, e.g. iphone-17.

curl https://api.revio.me/v1/products/iphone-17 \
  -H "x-api-key: YOUR_API_KEY"
{
  "id": "iphone-17",
  "url": "https://revio.me/product/iphone-17",
  "name": "iPhone 17",
  "brand": "Apple",
  "tagline": "",
  "description": "",
  "category": "phone",
  "condition": "new",
  "currency": "QAR",
  "purchasable": true,
  "onDeal": false,
  "priceFrom": 3249,
  "compareAtPriceFrom": null,
  "images": [{ "url": "https://storage.googleapis.com/…/black-v3.webp", "alt": "iPhone 17" }],
  "colors": [
    { "name": "Black", "hex": "#1F1F1F", "image": "https://storage.googleapis.com/…/black-v3.webp" },
    { "name": "Sage", "hex": "#B7C4B0", "image": "https://storage.googleapis.com/…/sage-v3.webp" }
  ],
  "storages": [
    { "label": "256 GB", "price": 3249, "compareAtPrice": null, "onDeal": false, "inStock": true },
    { "label": "512 GB", "price": 3899, "compareAtPrice": null, "onDeal": false, "inStock": true }
  ],
  "variants": [
    { "id": "256 GB__Black", "color": "Black", "storage": "256 GB", "price": 3249,
      "compareAtPrice": null, "onDeal": false, "inStock": true },
    { "id": "256 GB__Sage", "color": "Sage", "storage": "256 GB", "price": 3249,
      "compareAtPrice": null, "onDeal": false, "inStock": true }
  ]
}

GET /health

Returns { "ok": true } when the service is up. No key needed.

JavaScript example (server side)

const res = await fetch('https://api.revio.me/v1/products/iphone-17', {
  headers: { 'x-api-key': process.env.REVIO_API_KEY },
})
if (!res.ok) throw new Error(`Revio API ${res.status}`)
const product = await res.json()
const black256 = product.variants.find((v) => v.color === 'Black' && v.storage === '256 GB')
console.log(black256.price, product.currency) // 3249 'QAR'

Response fields

Product

FieldTypeMeaning
idstringPermanent product id, used in /v1/products/{id}
urlstringThe product's page on revio.me
name, brand, taglinestringAs shown on revio.me. tagline may be empty
descriptionstringPlain text, detail only. May be empty
categorystringphone, laptop, tablet, watch or other
conditionstring | nullnew, open_box, refurbished, pre_owned, or null if not set
currencystringAlways QAR
purchasablebooleanAt least one option is in stock and can be bought now
onDealbooleanA deal is lowering at least one price right now
priceFromnumber | nullLowest price among in-stock options, or among all options if none is in stock
compareAtPriceFromnumber | nullThe struck-through "was" price for that option, if any
imagestring | nullMain image URL (list only)
imagesarray{ url, alt }, the first one is the main image (detail only)
colorsarrayNames in the list. In the detail: { name, hex, image }, where image is that colour's photo or null
storagesarrayLabels in the list. In the detail: one entry per storage size, cheapest first (below)
variantsarrayDetail only: every colour × storage combination (below)

Storage (detail)

FieldTypeMeaning
labelstringe.g. 256 GB
pricenumberBase price for this size in QAR. A colour can cost more, so use variants for the exact price
compareAtPricenumber | nullStruck-through "was" price
onDealbooleanThis size is on a deal
inStockbooleanAt least one colour in this size is in stock

Variant (detail)

FieldTypeMeaning
idstringStable id for this combination
colorstring | nullColour name, null if the product has no colours
storagestringStorage label
pricenumberThe price the customer pays for this exact combination, in QAR, including any deal
compareAtPricenumber | nullStruck-through "was" price; only present when higher than price
onDealbooleanThe price is a deal price
inStockbooleanCan be bought right now

Errors

Errors return a JSON body like { "error": "not_found" }.

StatuserrorWhen
400invalid_handleThe product id isn't valid: only lowercase letters, numbers and hyphens
401unauthorizedThe x-api-key header is missing or wrong
404not_foundNo such product, or it is no longer for sale
500internal_errorSomething went wrong on our side. Retry after a short wait

Good to know

Questions, or need a new key? Contact your Revio account manager.