1. Overview
N(DATA) exposes its entire product archive as a single, publicly accessible JSON file. There is no authentication, no API key, and no rate limit. You fetch the file, you get all the data.
The data lives at a static path on the same domain. This design keeps things simple and fast for everyone. The file is updated whenever new items are added to the archive.
2. Data Endpoint
One endpoint. Returns the full product array as JSON.
Response is an array of product objects. HTTP 200 on success.
RESPONSE HEADERS
Access-Control-Allow-Origin: *
UPDATES ENDPOINT
Changelog and update records for the archive.
3. Data Schema
Each item in the array follows this structure:
| Field | Type | Description |
|---|---|---|
id |
string | Unique identifier. Format: prefix-NNNNNN (e.g. phn-000001). Auto-assigned if not present in source data. |
name |
string | Full product name. |
brand |
string | Manufacturer or brand name. |
category |
string | Product category slug. See Categories section. |
price |
number | Base price in USD at time of indexing. |
description |
string | Short product description. |
images |
array | Array of image URLs. May be empty. |
specs |
object | Key-value map of technical specifications. Keys use snake_case. Values are strings. |
diy_resources |
array | Optional. Array of repair/guide objects with title, url, description, icon, and type fields. |
date_added |
string | Optional. ISO date string (YYYY-MM-DD) when item was indexed. |
EXAMPLE OBJECT
"id": "phn-000001",
"name": "Phone (2a)",
"brand": "Nothing",
"category": "smartphones",
"price": 349,
"description": "A uniquely designed smartphone...",
"images": ["https://..."],
"specs": {
"processor": "MediaTek Dimensity 7200 Pro",
"ram": "12GB",
"display": "6.7-inch AMOLED 120Hz"
},
"diy_resources": [
{
"title": "Teardown Guide",
"url": "https://...",
"icon": "wrench",
"description": "Step-by-step teardown.",
"type": "REPAIR GUIDE"
}
]
}
4. Categories
Valid values for the category field:
| Slug | Label |
|---|---|
smartphones | Smartphones and mobile phones |
laptops | Laptops and portable computers |
tablets | Tablets and e-readers |
wearables | Smartwatches, earbuds, and audio gear |
components | CPUs, GPUs, RAM, storage |
cameras | Digital cameras and lenses |
gaming | Consoles, handhelds, and peripherals |
monitors | Displays and projectors |
networking | Routers, switches, and access points |
5. Code Examples
JAVASCRIPT (FETCH)
const res = await fetch('/api/data/data.json');
const items = await res.json();
// Filter by category
const phones = items.filter(i => i.category === 'smartphones');
// Get by ID
const item = items.find(i => i.id === 'phn-000001');
PYTHON (REQUESTS)
res = requests.get('https://your-domain.com/api/data/data.json')
items = res.json()
# Filter by brand
samsung = [i for i in items if i['brand'] == 'Samsung']
# Sort by price
by_price = sorted(items, key=lambda x: x['price'])
CURL
# Pretty print with jq
curl https://your-domain.com/api/data/data.json | jq '.[0]'
6. Client-Side Filtering
Since the API returns all data in one request, filtering and searching happen on the client side. Below are common patterns:
function search(items, query) {
const q = query.toLowerCase();
return items.filter(item => {
const fields = [item.name, item.brand, item.description];
const specVals = Object.values(item.specs || {});
return [...fields, ...specVals].some(v =>
String(v).toLowerCase().includes(q)
);
});
}
// Sort by price ascending
items.sort((a, b) => a.price - b.price);
7. Changelog
Added bookmarks, compare (up to 4 items), sort by price/date, halftone card image shaders, auto image scroll on hover, keyboard shortcut (/), multi-language support (EN/AR/JP/DE), auto ID assignment, new categories (gaming, monitors, networking), EUR and GBP currencies, full docs and API pages.
Previous release. Base feature set with search, category filters, product modal, lightbox, dark mode, currency conversion.