Skip to the reference
Techfleet AtlasAPI

Start

Atlas API

The sourced reference catalog of consumer electronics, as JSON. Every fact comes with its source, the source's own words, its kind and a confidence, so you can show it, check it and cite it.

Keys are required: send yours on every request. To get one, sign in with your Techfleet account at devicedatabase.org/account.
curl "https://api.devicedatabase.org/v1/devices?q=galaxy+s25"

Base URL https://api.devicedatabase.org/v1. Ids are opaque and permanent (dev_…); slugs work too. The machine-readable description is at /v1/openapi.json (OpenAPI 3.1).

Keys and authentication

To get a key, sign in with your Techfleet account at devicedatabase.org/account. That is also where you choose a plan, upgrade, and make, rotate or revoke keys. Every account starts on Free.

Keys look like atlas_live_… and end in a checksum, so a mistyped key is refused at once. Send one as Authorization: Bearer atlas_live_…, never in a URL. We store only a keyed hash of each key: it is shown to you once, and a lost key is replaced, not recovered. A revoked key stops working within 15 seconds. Test keys (atlas_test_…) are not served yet and are refused with test_keys_unavailable.

Limits and quotas

Every response says where you stand: RateLimit-Policy names the limit and RateLimit the requests left (an estimate) and seconds until the window resets. Over the limit you get a 429 with Retry-After.

With a key, each request also counts toward your plan's requests a month, by calendar month in UTC, and the same headers carry a second policy, "month": its q is the plan's requests a month and its w the seconds left in the month, as in RateLimit-Policy: "free";q=20;w=10, "month";q=10000;w=561600. Free stops at 10,000: the rest of the month gets a 429 quota_exceeded, with Retry-After set to the first of next month; upgrade at devicedatabase.org/account. Paid plans are never refused for volume: requests past the included ones are counted for overage at the plan's rate. Counts are right to within a few requests.

PlanRequests a monthRatePrice (CAD a month, plus GST/HST)Policy
Free10,0002/s$0"free";q=20;w=10
Starter100,00010/s$39"starter";q=100;w=10
Pro1,000,00025/s$199"pro";q=250;w=10
Business5,000,00050/s$799"business";q=500;w=10
InternalBy agreement100/s$0"internal";q=1000;w=10

Responses carry an ETag: send it back as If-None-Match and an unchanged answer is a bodiless 304. Lists page with an opaque cursor: pass next_cursor back until it is null.

Errors

Every error is an RFC 9457 problem document (application/problem+json) with a stable type to switch on.

{
  "type": "https://api.devicedatabase.org/problems/device_not_found",
  "title": "Device not found",
  "status": 404,
  "detail": "No device has the id or slug \"galaxy-s99\".",
  "instance": "/v1/devices/galaxy-s99"
}
StatusTypeMeaning
400invalid_parameterA query parameter is missing, malformed or out of range. detail names it.
400invalid_cursorThe cursor was not issued by this API, or was edited. Start again without one.
401missing_keySend your key as Authorization: Bearer atlas_live_….
401invalid_keyThe key is malformed, unknown, revoked or expired.
403test_keys_unavailableTest keys (atlas_test_…) are not served yet. Use a live key (atlas_live_…).
403origin_not_allowedBrowsers may call the MCP server only from devicedatabase.org or localhost. Server-to-server calls send no Origin.
404device_not_foundNo device has this id or slug.
404model_number_not_foundNo regional model has this model number yet.
404route_not_foundNo route matches this method and path.
405method_not_allowedThe MCP endpoint takes POST only: it is stateless and opens no event stream.
429rate_limitedSlow down: the RateLimit and Retry-After headers say when to try again.
429quota_exceededThe Free plan's monthly requests are used up. Upgrade at devicedatabase.org/account, or wait for the month to turn (UTC): Retry-After says when.
500internal_errorSomething failed on our side. It is logged; try again shortly.
503catalog_unavailableThe catalog database cannot be reached right now. Try again shortly.
503database_unavailableYour key cannot be checked right now because the account database cannot be reached. It is not refused: try again shortly.

Sources, kinds and confidence

A fact's kind says what sort of claim it is: claimed, rated, typical, measured, regulatory, derived or rumoured. Kinds never compete: a rated and a typical battery capacity are both returned.

For each kind and scope one value is shown (rank: preferred); others are kept and come back with expand=all_values. When sources disagree, the lower tier wins: 1 a regulator, 2 the maker, 3 a lab, 4 open data, 5 a partner or the press, 6 a retailer, 7 the community. A value an editor reviewed is never replaced by an automatic reading.

Core facts are open under CC BY 4.0: show "Data: Techfleet Atlas, devicedatabase.org" with a link. Every fact repeats its licence, so a copied fact keeps its terms. Images are not covered by CC BY: each image carries its own licence and credit, and one marked example is a render standing for the model, not a photo of a particular unit. The change feed is proprietary, under the API terms.

Reference / Devices

GET/v1/devicesAll plans

List devices

Devices by name or model number, filtered by department or brand, sorted by name. Every word of q must appear in the brand and name ("samsung s25" finds the Galaxy S25 Ultra), or q may be an exact model number. Merged devices are left out. Page with cursor.

Parameters

NameInDescription
qqueryWords of the name, or an exact model number.
departmentqueryOne department.
brandqueryA brand slug (apple) or id (brd_…).
limitqueryItems per page, 1 to 100. Default 20.
cursorquerynext_cursor from the previous page. Opaque: pass it back as it came.

Response

FieldTypeMeaning
dataDeviceSummaryStrict[]
next_cursorstring · null
linksNextLinks

Errors

  • 400 A parameter is missing or malformed (invalid_parameter), or the cursor is not one we issued (invalid_cursor).
  • 401 No key (missing_key) or a bad one (invalid_key), when keys are required.
  • 403 A test key (test_keys_unavailable), when keys are required. Test keys are not served yet.
  • 429 Over the burst limit (rate_limited), or the Free plan's requests for the month are used (quota_exceeded: upgrade at https://devicedatabase.org/account). Retry-After says when to try again.
  • 503 The catalog database cannot be reached (catalog_unavailable), or your key cannot be checked (database_unavailable). Try again shortly.

Reference / Devices

GET/v1/devices/{id}All plans

Get a device

One device with its variants, regional models, identifiers and facts. facts has a key for every property of the device's department, in display order. Each is a list, because kinds never compete (a rated and a typical battery capacity are both shown) and scoped values sit side by side; or null when nothing is sourced yet, in which case the key is also in pending.

Every fact carries its value, unit, kind, confidence, source id, quote and licence. Add expand=sources for the full source records. A device that was merged into another answers with that device, and says so in merged_from.

Facts we know about but haven't sourced come back as null and are listed in pending. We never fill them with a guess.

Parameters

NameInDescription
id requiredpathAn Atlas device id (dev_…) or its slug. Ids of merged devices answer with the device they merged into.
fieldsqueryProperty keys to return, comma-separated, such as display_in,battery_mah. See /v1/properties.
expandquerysources adds the full source records; all_values adds values that are not shown (rank normal or deprecated), with the reason.

Response

FieldTypeMeaning
idstring
slugstring
namestring
departmentDepartmentOne of phones, tablets, watches, laptops, consoles, audio, cameras, monitors.
statusenumOne of rumoured, announced, released, discontinued.
announced_onDate
released_onDate
brandRef
familyRef · null
updated_atstring
imageImage · nullThe first image, or null when the device has none yet.
linksobject
merged_fromstringThe id or slug you asked for, when it was merged into this device.
variantsobject[]
regional_modelsRegionalModel[]
identifiersobject[]
imagesImage[]Every image, in display order.
factsobjectProperty key to its values, or null when nothing is sourced yet.
pendingstring[]Properties with no sourced value yet.
sourcesSource[]With expand=sources.
licenceLicence

The fact object

FieldTypeMeaning
valuenumber · string · boolean · arrayA number, text, true/false, a list of numbers, or a date as YYYY-MM-DD; see the property's type.
unitstring · nullSI unit from the vocabulary, or null.
kindenumOne of claimed, rated, typical, measured, regulatory, derived, rumoured.
confidenceenumOne of high, medium, low.
rankenumpreferred is the value shown; the others appear only with expand=all_values. One of preferred, normal, deprecated.
rank_reasonstring · null
scopeScopeWhat the value is limited to. Empty means the whole subject.
subjectstringThe device, variant (var_…) or regional model (rgm_…) the value is about.
sourcestringThe source's id; expand=sources for the record.
quotestring · nullThe source's own words. Null only for open data and partner records.
retrieved_atstring · nullWhen we read the source.
archived_urlstring · nullThe Wayback Machine copy of the source as read.
valid_fromDate
valid_toDate
recorded_atstringWhen Atlas recorded the value.
reviewedbooleanAn editor checked it.
licence"CC-BY-4.0"

The source object

FieldTypeMeaning
idstring
kindenumOne of regulator, maker_page, maker_press, maker_store, open_data, partner, lab, press, retailer, community.
publisherstring
urlstring
tierintegerPrecedence when sources disagree: 1 (a regulator) wins.

Errors

  • 400 A parameter is missing or malformed (invalid_parameter), or the cursor is not one we issued (invalid_cursor).
  • 401 No key (missing_key) or a bad one (invalid_key), when keys are required.
  • 403 A test key (test_keys_unavailable), when keys are required. Test keys are not served yet.
  • 404 No such device (device_not_found) or model number (model_number_not_found).
  • 429 Over the burst limit (rate_limited), or the Free plan's requests for the month are used (quota_exceeded: upgrade at https://devicedatabase.org/account). Retry-After says when to try again.
  • 503 The catalog database cannot be reached (catalog_unavailable), or your key cannot be checked (database_unavailable). Try again shortly.

Reference / Devices

GET/v1/devices/{id}/historyAll plans

Device history

Every fact recorded or superseded on the device, its variants and its regional models, newest first, with the changeset that wrote it. Capped at the newest 1,000 entries.

Parameters

NameInDescription
id requiredpathAn Atlas device id (dev_…) or its slug. Ids of merged devices answer with the device they merged into.

Response

FieldTypeMeaning
deviceDeviceSummaryStrict
merged_fromstring
dataHistoryEntry[]

Errors

  • 401 No key (missing_key) or a bad one (invalid_key), when keys are required.
  • 403 A test key (test_keys_unavailable), when keys are required. Test keys are not served yet.
  • 404 No such device (device_not_found) or model number (model_number_not_found).
  • 429 Over the burst limit (rate_limited), or the Free plan's requests for the month are used (quota_exceeded: upgrade at https://devicedatabase.org/account). Retry-After says when to try again.
  • 503 The catalog database cannot be reached (catalog_unavailable), or your key cannot be checked (database_unavailable). Try again shortly.

Reference / Identify

GET/v1/identifyAll plans

Identify a model number

A model number (A3256, SM-S938W) to its device and regional model. Any letter case.

Parameters

NameInDescription
model_number requiredqueryThe model number printed on the device, its box or in its settings.

Response

FieldTypeMeaning
deviceDeviceSummaryStrict
merged_fromstringThe device the model number is filed under, when it was merged into device.
regional_modelRegionalModel

Errors

  • 400 A parameter is missing or malformed (invalid_parameter), or the cursor is not one we issued (invalid_cursor).
  • 401 No key (missing_key) or a bad one (invalid_key), when keys are required.
  • 403 A test key (test_keys_unavailable), when keys are required. Test keys are not served yet.
  • 404 No such device (device_not_found) or model number (model_number_not_found).
  • 429 Over the burst limit (rate_limited), or the Free plan's requests for the month are used (quota_exceeded: upgrade at https://devicedatabase.org/account). Retry-After says when to try again.
  • 503 The catalog database cannot be reached (catalog_unavailable), or your key cannot be checked (database_unavailable). Try again shortly.

Reference / Vocabulary

GET/v1/propertiesAll plans

List properties

The vocabulary a fact may name, in display order, with each property's type and SI unit.

Parameters

NameInDescription
departmentqueryOne department.

Response

FieldTypeMeaning
dataProperty[]

Errors

  • 400 A parameter is missing or malformed (invalid_parameter), or the cursor is not one we issued (invalid_cursor).
  • 401 No key (missing_key) or a bad one (invalid_key), when keys are required.
  • 403 A test key (test_keys_unavailable), when keys are required. Test keys are not served yet.
  • 429 Over the burst limit (rate_limited), or the Free plan's requests for the month are used (quota_exceeded: upgrade at https://devicedatabase.org/account). Retry-After says when to try again.
  • 503 The catalog database cannot be reached (catalog_unavailable), or your key cannot be checked (database_unavailable). Try again shortly.

Reference / Changes

GET/v1/changesAll plans

Changes since

Devices that changed after since (an edit, or a fact recorded or superseded on them), oldest change first. Page with cursor, keeping the same since; store the last changed_at you saw and pass it next time. A device that changes again while you page turns up again later. Proprietary, under the API terms.

Parameters

NameInDescription
since requiredqueryAn ISO 8601 date, or a timestamp with an offset.
limitqueryItems per page, 1 to 100. Default 20.
cursorquerynext_cursor from the previous page. Opaque: pass it back as it came.

Response

FieldTypeMeaning
dataobject[]
next_cursorstring · null
linksNextLinks

Errors

  • 400 A parameter is missing or malformed (invalid_parameter), or the cursor is not one we issued (invalid_cursor).
  • 401 No key (missing_key) or a bad one (invalid_key), when keys are required.
  • 403 A test key (test_keys_unavailable), when keys are required. Test keys are not served yet.
  • 429 Over the burst limit (rate_limited), or the Free plan's requests for the month are used (quota_exceeded: upgrade at https://devicedatabase.org/account). Retry-After says when to try again.
  • 503 The catalog database cannot be reached (catalog_unavailable), or your key cannot be checked (database_unavailable). Try again shortly.

Reference / Service

GET/v1/healthAll plans

Health

Whether the API is up, and whether keys are required. Never needs a key; never touches the database.

Response

FieldTypeMeaning
okboolean
service"atlas-api"
version"v1"
accessenumWhether a key is required. One of open_preview, keys.

Reference / Service

GET/v1/openapi.jsonAll plans

This document

The OpenAPI 3.1 description of this API, as JSON. Never needs a key.

More

MCP server

AI assistants and agents can use Atlas directly over the Model Context Protocol (Streamable HTTP, protocol revisions 2026-07-28 and 2025) at https://mcp.devicedatabase.org/mcp, with the same keys and limits as the API. Every tool answers with the same JSON as the API, sources and quotes included, so an assistant can cite each value. Read-only tools:

  • search_devices
  • get_device
  • identify
  • get_fact_sources
  • compare_devices
claude mcp add --transport http atlas https://mcp.devicedatabase.org/mcp