Skip to content

🛒 Fake Store API

Products, categories and carts for building shop screens before the real backend exists.

The Fake Store API gives you realistic shop data to build product lists, detail pages, search, filters and a cart. It has 69 products in 10 categories, from smartphones and laptops to Kampot pepper, krama scarves and Khmer crafts, each with an English and a Khmer name (titleKm), a USD price, a discount, a rating, stock and image URLs.

Images are PNG placeholders served by the API itself, so they load in Flutter Image.network, Android Glide/Coil and iOS without extra libraries. The data never changes between requests, so your screenshots and tests stay stable. Nothing is saved: the response shows what a real API would return, and the data stays the same for everyone.

Base URL https://toolorca.com/api/v1 No key · CORS open · JSON · conventions and limits

Endpoints

GET /api/v1/products #

List products with search, filters, sorting, field selection and pagination.

Parameter In Type Description
q query string Full-text search in the main text fields.
sortBy query string Field to sort by, e.g. price or rating.rate.
order query string asc (default) or desc.
select query string Comma-separated fields to return, e.g. title,price (id is always included).
limit query integer Items per page (default 30, max 100). 0 returns the maximum.
skip query integer Items to skip, for offset pagination.
page query integer 1-based page number; used when skip is not given.
category query string Category slug, e.g. groceries.
brand query string Brand name.
minPrice / maxPrice query number Price range in USD.
inStock query boolean true for products in stock, false for sold out.
curl 'https://toolorca.com/api/v1/products?limit=2'
GET /products?limit=2
Example response
{
  "data": [
    {
      "id": 1,
      "title": "Orca X1 Smartphone 128GB",
      "titleKm": "ស្មាតហ្វូន Orca X1 128GB",
      "description": "Orca X1 Smartphone 128GB by Orcatech. A bright display and all-day battery for work, study and social media. Takes sharp photos in daylight and decent shots at night.",
      "category": "smartphones",
      "brand": "Orcatech",
      "price": 280.99,
      "currency": "USD",
      "discountPercentage": 18.1,
      "rating": {
        "rate": 5,
        "count": 588
      },
      "stock": 123,
      "sku": "TO-SMA-0001",
      "tags": [
        "smartphones",
        "orcatech"
      ],
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=ORCA%20X1&bg=0f6fde&fg=ffffff",
      "images": [
        "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=ORCA%20X1&bg=0f6fde&fg=ffffff",
        "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=ORCATECH&bg=0f6fde&fg=ffffff"
      ],
      "createdAt": "2025-07-26T00:00:00Z"
    },
    {
      "id": 2,
      "title": "Orca X1 Pro 256GB",
      "titleKm": "ស្មាតហ្វូន Orca X1 Pro 256GB",
      "description": "Orca X1 Pro 256GB by Orcatech. A bright display and all-day battery for work, study and social media. Dual SIM, so you can keep a work number and a personal number on one phone.",
      "category": "smartphones",
      "brand": "Orcatech",
      "price": 515.99,
      "currency": "USD",
      "discountPercentage": 0,
      "rating": {
        "rate": 4.8,
        "count": 667
      },
      "stock": 83,
      "sku": "TO-SMA-0002",
      "tags": [
        "smartphones",
        "orcatech"
      ],
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=X1%20PRO&bg=0f6fde&fg=ffffff",
      "images": [
        "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=X1%20PRO&bg=0f6fde&fg=ffffff",
        "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=ORCATECH&bg=0f6fde&fg=ffffff"
      ],
      "createdAt": "2025-02-15T00:00:00Z"
    }
  ],
  "meta": {
    "total": 69,
    "limit": 2,
    "skip": 0,
    "page": 1,
    "pages": 35
  }
}

GET /api/v1/products?q={text} #

Search products by title (English or Khmer), description, brand or category.

Parameter In Type Description
q required query string Search text.
curl 'https://toolorca.com/api/v1/products?q=krama&select=title,titleKm,price'
GET /products?q=krama&select=title,titleKm,price
Example response
{
  "data": [
    {
      "id": 49,
      "title": "Cotton Krama Scarf",
      "titleKm": "ក្រមាកប្បាស",
      "price": 5.99
    },
    {
      "id": 50,
      "title": "Silk Krama Scarf",
      "titleKm": "ក្រមាសូត្រ",
      "price": 17.99
    }
  ],
  "meta": {
    "total": 2,
    "limit": 30,
    "skip": 0,
    "page": 1,
    "pages": 1
  }
}

GET /api/v1/products/{id} #

One product.

Parameter In Type Description
id required path integer The product id.
curl 'https://toolorca.com/api/v1/products/41'
GET /products/41
Example response
{
  "id": 41,
  "title": "Kampot Black Pepper 100g",
  "titleKm": "ម្រេចខ្មៅកំពត 100g",
  "description": "Kampot Black Pepper 100g by Srey Farm. Packed fresh and sealed to keep its flavour. Sourced from small farms in Cambodia.",
  "category": "groceries",
  "brand": "Srey Farm",
  "price": 8.99,
  "currency": "USD",
  "discountPercentage": 19.8,
  "rating": {
    "rate": 4.7,
    "count": 502
  },
  "stock": 3,
  "sku": "TO-GRO-0041",
  "tags": [
    "groceries",
    "sreyfarm",
    "made-in-cambodia"
  ],
  "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=PEPPER&bg=16a34a&fg=ffffff",
  "images": [
    "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=PEPPER&bg=16a34a&fg=ffffff",
    "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=SREY%20FARM&bg=16a34a&fg=ffffff"
  ],
  "createdAt": "2025-11-16T00:00:00Z"
}

GET /api/v1/products/categories #

All categories with English and Khmer names and product counts.

curl 'https://toolorca.com/api/v1/products/categories'
GET /products/categories
Example response
{
  "data": [
    {
      "slug": "smartphones",
      "name": "Smartphones",
      "nameKm": "ស្មាតហ្វូន",
      "count": 7,
      "url": "https://toolorca.com/api/v1/products/category/smartphones"
    },
    {
      "slug": "laptops",
      "name": "Laptops & Tablets",
      "nameKm": "កុំព្យូទ័រយួរដៃ និងថេប្លេត",
      "count": 7,
      "url": "https://toolorca.com/api/v1/products/category/laptops"
    },
    {
      "slug": "audio",
      "name": "Audio",
      "nameKm": "ឧបករណ៍សំឡេង",
      "count": 6,
      "url": "https://toolorca.com/api/v1/products/category/audio"
    },
    "… 7 more"
  ],
  "meta": {
    "total": 10,
    "limit": 10,
    "skip": 0,
    "page": 1,
    "pages": 1
  }
}

GET /api/v1/products/category/{slug} #

Products in one category. Accepts the same query parameters as the product list.

Parameter In Type Description
slug required path string Category slug from /products/categories.
limit query integer Items per page (default 30, max 100). 0 returns the maximum.
skip query integer Items to skip, for offset pagination.
page query integer 1-based page number; used when skip is not given.
curl 'https://toolorca.com/api/v1/products/category/khmer-crafts?limit=2&select=title,titleKm,price,thumbnail'
GET /products/category/khmer-crafts?limit=2&select=title,titl…
Example response
{
  "data": [
    {
      "id": 49,
      "title": "Cotton Krama Scarf",
      "titleKm": "ក្រមាកប្បាស",
      "price": 5.99,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=KRAMA&bg=a16207&fg=ffffff"
    },
    {
      "id": 50,
      "title": "Silk Krama Scarf",
      "titleKm": "ក្រមាសូត្រ",
      "price": 17.99,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=SILK&bg=a16207&fg=ffffff"
    }
  ],
  "meta": {
    "total": 7,
    "limit": 2,
    "skip": 0,
    "page": 1,
    "pages": 4
  }
}

POST /api/v1/products #

Create a product. Returns 201 with the new id. Nothing is saved: the response shows what a real API would return, and the data stays the same for everyone.

Send title (string) and price (number); anything else is echoed back. Missing fields return 422, so you can test your form validation too.

Parameter In Type Description
title required body string Product name.
price required body number Price in USD.
… body any Any other fields (category, description, …).
curl -X POST 'https://toolorca.com/api/v1/products' \
  -H 'Content-Type: application/json' \
  -d '{"title":"Kampot Pepper Gift Box","titleKm":"ប្រអប់កាដូម្រេចកំពត","price":15.5,"category":"groceries"}'
POST /products
Example response (201)
{
  "id": 70,
  "title": "Kampot Pepper Gift Box",
  "titleKm": "ប្រអប់កាដូម្រេចកំពត",
  "price": 15.5,
  "category": "groceries",
  "createdAt": "2026-11-14T05:15:25Z"
}

PATCH /api/v1/products/{id} #

Change some fields of a product (PUT replaces the whole product). Nothing is saved: the response shows what a real API would return, and the data stays the same for everyone.

Parameter In Type Description
id required path integer The product id.
… body any Fields to change.
curl -X PATCH 'https://toolorca.com/api/v1/products/1' \
  -H 'Content-Type: application/json' \
  -d '{"price":259.99,"stock":10}'
PATCH /products/1
Example response
{
  "id": 1,
  "title": "Orca X1 Smartphone 128GB",
  "titleKm": "ស្មាតហ្វូន Orca X1 128GB",
  "description": "Orca X1 Smartphone 128GB by Orcatech. A bright display and all-day battery for work, study and social media. Takes sharp photos in daylight and decent shots at night.",
  "category": "smartphones",
  "brand": "Orcatech",
  "price": 259.99,
  "currency": "USD",
  "discountPercentage": 18.1,
  "rating": {
    "rate": 5,
    "count": 588
  },
  "stock": 10,
  "sku": "TO-SMA-0001",
  "tags": [
    "smartphones",
    "orcatech"
  ],
  "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=ORCA%20X1&bg=0f6fde&fg=ffffff",
  "images": [
    "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=ORCA%20X1&bg=0f6fde&fg=ffffff",
    "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=ORCATECH&bg=0f6fde&fg=ffffff"
  ],
  "createdAt": "2025-07-26T00:00:00Z",
  "updatedAt": "2026-11-14T05:15:25Z"
}

DELETE /api/v1/products/{id} #

Delete a product. Returns the product with isDeleted: true. Nothing is saved: the response shows what a real API would return, and the data stays the same for everyone.

Parameter In Type Description
id required path integer The product id.
curl -X DELETE 'https://toolorca.com/api/v1/products/2'
DELETE /products/2
Example response
{
  "id": 2,
  "title": "Orca X1 Pro 256GB",
  "titleKm": "ស្មាតហ្វូន Orca X1 Pro 256GB",
  "description": "Orca X1 Pro 256GB by Orcatech. A bright display and all-day battery for work, study and social media. Dual SIM, so you can keep a work number and a personal number on one phone.",
  "category": "smartphones",
  "brand": "Orcatech",
  "price": 515.99,
  "currency": "USD",
  "discountPercentage": 0,
  "rating": {
    "rate": 4.8,
    "count": 667
  },
  "stock": 83,
  "sku": "TO-SMA-0002",
  "tags": [
    "smartphones",
    "orcatech"
  ],
  "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=X1%20PRO&bg=0f6fde&fg=ffffff",
  "images": [
    "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=X1%20PRO&bg=0f6fde&fg=ffffff",
    "https://toolorca.com/api/v1/images/placeholder/800x800.png?text=ORCATECH&bg=0f6fde&fg=ffffff"
  ],
  "createdAt": "2025-02-15T00:00:00Z",
  "isDeleted": true,
  "deletedAt": "2026-11-14T05:15:25Z"
}

GET /api/v1/carts #

List shopping carts with their lines and totals.

Parameter In Type Description
userId query integer Only carts of this user.
limit query integer Items per page (default 30, max 100). 0 returns the maximum.
skip query integer Items to skip, for offset pagination.
page query integer 1-based page number; used when skip is not given.
curl 'https://toolorca.com/api/v1/carts?limit=1'
GET /carts?limit=1
Example response
{
  "data": [
    {
      "id": 1,
      "userId": 15,
      "date": "2026-08-28",
      "products": [
        {
          "productId": 69,
          "title": "English–Khmer Picture Dictionary",
          "price": 14.99,
          "quantity": 2,
          "total": 29.98,
          "discountPercentage": 5.6,
          "discountedTotal": 28.3,
          "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=DICTIONARY&bg=475569&fg=ffffff"
        },
        {
          "productId": 5,
          "title": "Lumina Fold",
          "price": 988.99,
          "quantity": 1,
          "total": 988.99,
          "discountPercentage": 18.3,
          "discountedTotal": 808,
          "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=FOLD&bg=0f6fde&fg=ffffff"
        }
      ],
      "totalProducts": 2,
      "totalQuantity": 3,
      "total": 1018.97,
      "discountedTotal": 836.3,
      "currency": "USD"
    }
  ],
  "meta": {
    "total": 20,
    "limit": 1,
    "skip": 0,
    "page": 1,
    "pages": 20
  }
}

GET /api/v1/carts/{id} #

One cart. Also available per user: /users/{id}/carts.

Parameter In Type Description
id required path integer The cart id.
curl 'https://toolorca.com/api/v1/carts/3'
GET /carts/3
Example response
{
  "id": 3,
  "userId": 22,
  "date": "2025-11-05",
  "products": [
    {
      "productId": 48,
      "title": "Lemongrass Tea 20 Bags",
      "price": 4.99,
      "quantity": 2,
      "total": 9.98,
      "discountPercentage": 0,
      "discountedTotal": 9.98,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=TEA&bg=16a34a&fg=ffffff"
    },
    {
      "productId": 17,
      "title": "Bluetooth Party Speaker",
      "price": 180.99,
      "quantity": 1,
      "total": 180.99,
      "discountPercentage": 7.4,
      "discountedTotal": 167.6,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=SPEAKER&bg=7c3aed&fg=ffffff"
    },
    {
      "productId": 60,
      "title": "Stainless Water Bottle 750ml",
      "price": 11.99,
      "quantity": 3,
      "total": 35.97,
      "discountPercentage": 20.5,
      "discountedTotal": 28.6,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=BOTTLE&bg=0891b2&fg=ffffff"
    }
  ],
  "totalProducts": 3,
  "totalQuantity": 6,
  "total": 226.94,
  "discountedTotal": 206.18,
  "currency": "USD"
}

POST /api/v1/carts #

Create a cart. The API looks up each product and calculates line totals, discounts and the cart total. Nothing is saved: the response shows what a real API would return, and the data stays the same for everyone.

Parameter In Type Description
userId required body integer Owner of the cart.
products required body array Lines: [{ "id": 1, "quantity": 2 }].
curl -X POST 'https://toolorca.com/api/v1/carts' \
  -H 'Content-Type: application/json' \
  -d '{"userId":1,"products":[{"id":41,"quantity":2},{"id":49,"quantity":1}]}'
POST /carts
Example response (201)
{
  "id": 21,
  "userId": 1,
  "products": [
    {
      "productId": 41,
      "title": "Kampot Black Pepper 100g",
      "price": 8.99,
      "quantity": 2,
      "total": 17.98,
      "discountPercentage": 19.8,
      "discountedTotal": 14.42,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=PEPPER&bg=16a34a&fg=ffffff"
    },
    {
      "productId": 49,
      "title": "Cotton Krama Scarf",
      "price": 5.99,
      "quantity": 1,
      "total": 5.99,
      "discountPercentage": 0,
      "discountedTotal": 5.99,
      "thumbnail": "https://toolorca.com/api/v1/images/placeholder/300x300.png?text=KRAMA&bg=a16207&fg=ffffff"
    }
  ],
  "totalProducts": 2,
  "totalQuantity": 3,
  "total": 23.97,
  "discountedTotal": 20.41,
  "currency": "USD",
  "createdAt": "2026-11-14T05:15:25Z"
}

Tips for shop prototypes

Load the list with select=title,price,thumbnail,rating to keep responses small, then fetch /products/{id} on the detail screen. Use skip and limit for infinite scroll and stop when meta.page equals meta.pages.

Prices are in USD, the currency most Cambodian shops quote online. Show discountPercentage as a sale badge and stock: 0 as "sold out" to test those states.

Frequently asked questions

Is this like FakeStoreAPI or DummyJSON?

It works the same way, with original data, Khmer product names, Cambodian products and USD prices. Everything is generated by ToolOrca.

Are POST and DELETE requests saved?

No. They return realistic responses (201 with a new id, the updated or deleted object) but the data never changes.

Why are the images plain colours with text?

They are placeholders generated by /images/placeholder, so there are no copyright issues and they always load fast.

Can I use it in a tutorial or course?

Yes, that is what it is for. A link back to ToolOrca is appreciated.

More free APIs