What it is for
Lexical makes small electrical home appliances in China and exports them, wholesale and under OEM and private label, to distributors in more than 100 countries. A buyer, a price-comparison tool or an AI assistant helping someone source appliances often needs the same few things: which lines Lexical sells, how a line is packed in its carton, and how to reach the export desk.
This API gives those answers as JSON, in the same words and with the same figures as the website, so a program does not have to read the pages. Each line comes with the address of its page, and every product has a link that opens the quote form with the line already filled in.
What it does not include
Prices are not published: they are quoted per order, through the export desk. Barcodes, HS codes and anything kept for verified customers are not available through this API, and neither are lines the website no longer shows.
Where to start
- /openapi.json: the OpenAPI 3.1 description of every endpoint, with its parameters and the shape of every answer. Load it into an API client or hand it to an agent as a tool definition.
- /llms.txt and /llms-full.txt: the whole website in plain text for language models, with the pages and the products.
- /.well-known/mcp: the MCP server. A browser or a script that asks for it with GET sees a short description of the server; an MCP client connects with POST.
- Base address of the API: https://project-26u0v.vercel.app/api/v1
Endpoints
Every endpoint answers with JSON and accepts an optional lang parameter (en, de, es, fr, pt, ru, zh, fa or ar) for names. The examples are shortened; the figures in them are only for illustration.
List products
GET/api/v1/products
The public catalogue, the same lines the Products page shows, in the site's order. Each line has its SKU, name, category, page address, photo and the carton's packing figures. Lines without a SKU are not listed.
| Parameter | Type | What it does |
|---|---|---|
category | string | Keep one category. Use a name from the categories endpoint. |
q | string | Keep lines whose name, SKU or category contains this text. |
lang | string | Language for names. Default en. |
limit | integer | Lines per page, 1 to 100. Default 24. |
offset | integer | Lines to skip. Pass nextOffset from the last answer to read on; it is null on the last page. |
Example request
curl "https://project-26u0v.vercel.app/api/v1/products?category=Air%20Fryers&limit=1"Example response
{
"lang": "en",
"total": 7,
"count": 1,
"offset": 0,
"limit": 1,
"nextOffset": 1,
"products": [
{
"sku": "LAF-3068",
"name": "Air Fryer",
"brand": "Lexical",
"category": "Air Fryers",
"categoryLabel": "Air Fryers",
"url": "https://project-26u0v.vercel.app/products/air-fryer-laf-3068",
"photoUrl": "https://project-26u0v.vercel.app/api/image/…?w=960",
"carton": {
"piecesPerCarton": 4,
"netWeightKg": 11,
"grossWeightKg": 12,
"volumeCbm": 0.65,
"dimensions": null
}
}
]
}Get one product
GET/api/v1/products/{sku}
One line by its SKU, with everything the list gives and, besides, the description, whether it is marked New, whether CE documentation is on file, and the address that opens the quote form for it. An unknown SKU is a 404.
| Parameter | Type | What it does |
|---|---|---|
sku | string, in the path | The SKU, for example LAF-3068. Case does not matter. |
lang | string | Language for the name and the page address. Default en. |
Example request
curl "https://project-26u0v.vercel.app/api/v1/products/LAF-3068"Example response
{
"sku": "LAF-3068",
"name": "Air Fryer",
"brand": "Lexical",
"category": "Air Fryers",
"categoryLabel": "Air Fryers",
"url": "https://project-26u0v.vercel.app/products/air-fryer-laf-3068",
"photoUrl": "https://project-26u0v.vercel.app/api/image/…?w=960",
"carton": {
"piecesPerCarton": 4,
"netWeightKg": 11,
"grossWeightKg": 12,
"volumeCbm": 0.65,
"dimensions": null
},
"description": null,
"isNew": false,
"ceDocumented": true,
"lang": "en",
"quoteUrl": "https://project-26u0v.vercel.app/contact?sku=LAF-3068&product=Air%20Fryer#quote"
}List categories
GET/api/v1/categories
The categories on sale today with the number of lines in each, most lines first. The name of a category is what the category parameter above takes.
| Parameter | Type | What it does |
|---|---|---|
lang | string | Language for category names. Default en. |
Example request
curl "https://project-26u0v.vercel.app/api/v1/categories"Example response
{
"lang": "en",
"count": 2,
"categories": [
{
"name": "Air Fryers",
"label": "Air Fryers",
"count": 4,
"url": "https://project-26u0v.vercel.app/products?category=Air%20Fryers"
},
{
"name": "Kettles",
"label": "Kettles",
"count": 3,
"url": "https://project-26u0v.vercel.app/products?category=Kettles"
}
]
}Search
GET/api/v1/search
The site's own search: products by name, SKU or category, then categories, pages and sections of pages, best match first. A product result carries its SKU.
| Parameter | Type | What it does |
|---|---|---|
q | string, required | What to look for. Required. |
lang | string | Language for names and addresses. Default en. |
limit | integer | Results, 1 to 25. Default 10. |
Example request
curl "https://project-26u0v.vercel.app/api/v1/search?q=air%20fryer&limit=3"Example response
{
"q": "air fryer",
"lang": "en",
"count": 2,
"results": [
{
"kind": "product",
"title": "Air Fryer",
"description": "Air Fryers · LAF-3068",
"url": "https://project-26u0v.vercel.app/products/air-fryer-laf-3068",
"sku": "LAF-3068"
},
{
"kind": "category",
"title": "Air Fryers",
"description": "Category",
"url": "https://project-26u0v.vercel.app/products?category=Air%20Fryers"
}
]
}Company facts
GET/api/v1/company
The business details the website prints: legal name, the head office and showroom address with its opening hours, the shop in the Yiwu International Trade City, and how to reach the export desk.
Example request
curl "https://project-26u0v.vercel.app/api/v1/company"Example response
{
"name": "Lexical",
"legalName": "Yiwu Lexical Electrical Appliances Co., Ltd.",
"website": "https://project-26u0v.vercel.app",
"headquarters": {
"description": "Head office and showroom",
"street": "571 Chouzhou North Road",
"city": "Yiwu",
"country": "China",
"timeZone": "Asia/Shanghai",
"hours": [
{
"days": "Monday – Saturday",
"opens": "09:00",
"closes": "24:00",
"text": "09:00 – 24:00"
}
]
},
"contact": {
"email": "contact@lexical.com.cn",
"quoteForm": "https://project-26u0v.vercel.app/contact#quote"
}
}Errors
Every error is JSON in one shape, with the HTTP status that fits. The hint says what to do next.
| Code | Status | Meaning |
|---|---|---|
bad_request | 400 | A parameter is missing or not valid, for example a limit above 100 or an unknown language. |
not_found | 404 | No product has that SKU in the public catalogue. |
rate_limited | 429 | Too many requests from this address. The Retry-After header says how many seconds to wait. |
server_error | 500 | The catalogue could not be read just now. Try again in a minute. |
Example
{
"error": {
"code": "not_found",
"message": "No product with SKU XYZ-0000 in the public catalogue.",
"hint": "List the SKUs the catalogue holds with GET /api/v1/products."
}
}MCP server
AI agents that speak the Model Context Protocol can use the catalogue directly. The server uses the Streamable HTTP transport, needs no authentication and keeps no session. It answers every request with one JSON object.
Its address is https://project-26u0v.vercel.app/.well-known/mcp, and the same server answers at https://project-26u0v.vercel.app/api/mcp. Add it to an MCP client with a configuration like this one, or with one command:
{
"mcpServers": {
"lexical-catalogue": {
"type": "http",
"url": "https://project-26u0v.vercel.app/.well-known/mcp"
}
}
}claude mcp add --transport http lexical-catalogue https://project-26u0v.vercel.app/.well-known/mcpTools
Each tool does what the endpoint of the same purpose does and returns its JSON as text.
| Tool | What it does |
|---|---|
search_catalogue | Search products, categories, pages and sections. |
list_products | List the catalogue, with category, text, language, limit and offset. |
get_product | One line by SKU. |
list_categories | The categories and their line counts. |
get_company_info | Address, hours and how to reach the export desk. |
Or try the handshake by hand:
curl -X POST "https://project-26u0v.vercel.app/.well-known/mcp" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'The server speaks protocol versions 2025-11-25, 2025-06-18, 2025-03-26.

