Skip to content

One number, a whole handset, and a database that keeps up with 125 brands

A metered IMEI lookup service that turns fifteen digits into a device, its specifications and its status. It's sold three ways to three audiences and backed by a device database that maintains itself.

FifteenEN· 11 languagesSign inGet an API key
35 874210 663190 1Check digit 1 matchesNo signup neededLook up
Aurel · 412 models in the catalogue

Aurel 7 Pro · 256GB · Slate

Model A7P · variant A7P-256-SL · released 03/2025

Nothing against itChecked 09/17/2026 · 2:14 PM
Four plain answers
Reported lost or stolenNot listed
Finance lockNone
Account lockOff
Carrier lockUnlocked
Specification · from the variant record
Display6.7 in OLED · 120 Hz
ChipsetAurel K4 · 8-core
Memory12 GB RAM · 256 GB storage
Battery4,900 mAh · 65 W wired
Cameras50 MP main · 48 MP ultrawide · 12 MP 3×
Network5G · dual SIM + eSIM
Bandsn1 n3 n5 n7 n28 n41 n77 n78
Weight7.3 oz
Compare with another handsetCopy report linkSame answer as the trade workspace and the API

The number

15 digits
TAC35874210Aurel 7 Pro
Serial663190This handset
Check digit1Luhn · matches

Resolved through

Brand → model → variant
BrandAurelbrand/aurel
ModelAurel 7 ProA7P
Variant256GB · SlateA7P-256-SL

Three levels kept apart, so a variant gaining a spec never orphans this lookup.

Free tools

Same service
IMEI validatorIs this number real?
IMEI generatorValid test numbers
Barcode readerRead the box label
MEID converterHex and decimal

The shape of the work

Industry
Consumer Electronics
Duration
22 weeks
Cooperation model
Dedicated team
Services
Platform engineeringPublic APIData pipeline
Integrations
Stripe BillingCloudflare TurnstilePostmarkSentryGSMArena feeds
Technologies
Next.jsTypeScriptNode.jsPostgreSQLStripeTailwind CSSFingerprintJS
Team
1 Project lead2 Full-stack engineers1 Data engineer1 QA engineer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

The problem

The hard problem

A device database goes stale the week you stop feeding it, and a free lookup tool is abused the day it ranks. They had both problems at once: a catalog nobody was maintaining, and anonymous traffic they could neither price nor throttle.

Manual catalog entry had failed in the ordinary way: it worked while one person owned it and stopped when they moved on. The abuse problem was structurally different. The free tool's value depends on requiring no signup, so every obvious throttle either put a wall in front of the traffic that becomes revenue or caught whole offices behind one IP.

One resolution service behind three front doors: a consumer lookup, a repair-shop and retailer workspace, and a keyed developer API. Behind it, a scraping and reconciliation pipeline keeps brands and models current, and device-level fingerprinting makes abuse answerable without forcing everyone to sign up.

The solution

How the pieces fit

  1. 01

    Modeled brand, model and variant separately so a spec change doesn't orphan a lookup

    Separating the axes required re-homing a catalog in which brand and model had been one string, and about a tenth of it couldn't be resolved automatically.

  2. 02

    Built one resolution service and put three differently-priced surfaces in front of it

    Three surfaces sit in front of one resolution service, each priced and shaped for its audience, none holding its own copy of the data.

  3. 03

    Metered the developer API per key, with usage visible to the customer before the invoice

    Metering reads the same counters that enforce the rate limit, and usage accrues visibly in the console with the projected charge beside it.

  4. 04

    Kept the database current with a scrape-and-reconcile job in place of manual entry

    A scheduled job scrapes manufacturer and regulatory sources and raises differences for review instead of writing them, so nothing becomes canonical unreviewed.

  5. 05

    Fingerprinted anonymous lookups so abuse is throttled without a signup wall

    FingerprintJS identifies the device instead of the IP, so the expensive tenth of anonymous traffic is throttled while offices behind one address aren't.

  6. 06

    Shipped the four free tools as top-of-funnel, on the same resolution service

    The four free tools run on the same resolution service as the paid product and are built to the same standard, because most paying customers arrive through one.

Introduction

The system we were asked to build

The IMEI lookup service sells one answer (what is this handset, and can it be trusted?) to three audiences who buy it very differently. We built the lookup, the metered developer API, and the pipeline that keeps a 125-brand device database current.

A device-intelligence service with a catalog nobody had fed for eighteen months and a free lookup tool that had started ranking. Both facts arrived together and compounded: the traffic the tool attracted was mostly scripted, and the answers it returned were increasingly wrong about anything released since the catalog was last maintained by hand.

Platform & API Engineering

One resolution, three products

A consumer lookup, a trade workspace and a developer API all read the same service, each priced and shaped for its audience.

One resolution service sits behind three front doors that share nothing but the answer: a consumer lookup optimized for a single anxious question, a workspace where a repair shop checks a bench full of devices, and a keyed API for developers. Each is priced and shaped for its own audience, but none of them holds its own copy of the data, so a correction lands in all three at once.

What shipped
  • Three products, one resolution service beneath them
  • Priced and shaped per audience, with no duplicated data
  • A correction lands in all three surfaces at once
Aurel 7 Pro · 256GB · Slate

One canonical record · read by the consumer lookup, the trade workspace and the API

Record history09/17/2026

Catalogue

125 brands
AAurel412 models · brand/aurel
Filter 412 models
Aurel 7 ProA7P4 variants
128GB · SlateA7P-128-SL
256GB · SlateA7P-256-SL
256GB · IvoryA7P-256-IV
512GB · SlateA7P-512-SL
Aurel 7A73 variants
Aurel 7 FoldA7F2 variants
Aurel 6 ProA6P4 variants
Aurel 6A63 variants
Aurel 6 LiteA6L2 variants
Aurel 5 ProA5P3 variants
Aurel Tab SATS2 variants

Brand, model and variant are separate records. Renaming a line or adding a spec touches one level only.

Correction approved into the record

D-4819 · 09/17/2026 · 2:12 PM

brand/aurelA7PChanged on the model record only · its 4 variants inherit it

FieldWasNowPassed by
Battery4,850 mAh4,900 mAhMaya Okafor · from D-4819
Wired charging45 W65 WMaya Okafor · from D-4819

Read after the correction

Three doors · one record · no copies
DoorRequestBattery returnedRead at
Consumer lookupAnonymous · no signup/en/imei-check · 19014,900 mAh2:14:08 PM
Trade workspaceBench · Harbor Street Repairsbench #2291 · row 14,900 mAh2:14:31 PM
Developer APIKey ffk_live_7Q2m…GET /v2/devices/{imei}4,900 mAh2:14:52 PM
1Copy of the recordNo door keeps its own device table
3Doors reading itPriced and shaped per audience
0Lookups orphanedThe brand above and the variants below are untouched
On screen

One canonical record in the staff desk: a battery correction approved on the model record, then read minutes later by the consumer lookup, a repair shop's bench and a developer's API key, each returning the corrected value.

Reconciliation review

Run rec-2026-0917-0200 · differences are raised for a human, never written

Export run09/17/2026
Run
rec-2026-0917-0200
Scraped
2:00 AM – 2:41 AM
Brands reconciled
125 of 125
Differences raised
7
Written to canonical
0 until someone passes them

Raised tonight

Sorted by kind
KindSubjectWas → foundState
New modelVeyra V6D-4821 · Manufacturer spec pageNot in catalogue3 variants · TAC 86455310Needs review
Spec changePell 9a · batteryD-4822 · Regulatory filing5,000 mAh5,100 mAhNeeds review
Brand renamedKestra MobileD-4823 · Manufacturer siteKestra MobileKestraNeeds review
Missing variantAurel 7 Pro · 1TBD-4824 · Manufacturer spec pageNot in catalogue1TB · Slate, IvoryNeeds review
Legacy string“NORRIN GO2 64 WHT”D-4825 · Legacy catalogueBrand + model in one stringNorrin Go 2 · 64GB · WhiteNeeds review
Sources disagreeTavi Note 12 · weightD-4826 · Two sources6.8 oz6.8 oz / 7.1 ozNeeds review
New modelPell Tab 11 ProD-4827 · Regulatory filingNot in catalogue2 variants · TAC 35224871Needs review

A bad scrape shows up here as a row to reject. It never becomes a device record on its own.

D-4822

Spec change

Pell 9a · battery

Brand Pell · model PL9A · all 3 variants

Canonical now

5,000 mAh

since 04/2025

Scraped

5,100 mAh

not written

Sources
Regulatory filing · certification recordSeen 09/16/2026 · reads 5,100 mAh
Manufacturer spec page · Pell 9aSeen 09/17/2026 · reads 5,100 mAh
If passedWrites the battery field on the Pell 9a model record once. The consumer lookup, trade workspace and API read it on their next request.
Legacy strings like D-4825 come from the old one-string catalog, where about a tenth couldn't be matched automatically.
Pass into recordRejectHold
On screen

A night's reconciliation run across 125 brands: seven differences raised, from a new model to a legacy one-string entry, and none written until someone passes them into the record.

125 brands, kept current

A scrape-and-reconcile job detects missing models and fills them, with a human review step before anything becomes canonical.

A scheduled job scrapes manufacturer and regulatory sources, reconciles what it finds against the canonical table, and raises the differences for review instead of writing them: a new model, a changed specification, a brand that has renamed itself. Nothing becomes canonical without a human passing it, because a silently wrong device record is worse than a missing one for everyone downstream.

What shipped
  • Scrape and reconcile across 125 brands on a schedule
  • Differences raised for review, never written directly
  • Nothing becomes canonical without a human pass

Metering you can watch

Per-key usage shows in the developer console as it accrues, long before the invoice.

Usage accrues visibly in the developer console as calls land, with the current period's count, the rate limit and the projected charge on the same screen. Metering is computed from the same counters that enforce the limit, so the number a developer watches is the number they'll be billed on. A discrepancy between the two is the single fastest way to lose an API customer.

What shipped
  • Per-key usage visible as it accrues, not at invoice time
  • Rate limit and projected charge on the same screen
  • Metering and enforcement read the same counters
Usage · Checkout grading · prod

Key ffk_live_7Q2m… · period 09/01/2026 – 09/30/2026 · day 17 of 30

Manage key09/17/2026
Calls this period · live177,230of 400,000 budget · tick = projection
Projected at month end312,759At this period's pace of 10,425 a day
Charge so far$708.92177,230 metered × $0.004
Projected charge$1,251.04The figure the 10/01/2026 invoice will use

Metered calls per day

Solid: counted · outline: projected at the same pace
09/0109/08Today 09/1709/2409/30

Latest requests

Metered from the counter that enforces the limit
RequestPathStatusMeteredTime
req_8Fq2GET /v2/devices/358742106631901200+1 metered2:14:52 PM
req_8Fq1GET /v2/devices/864021357714204200+1 metered2:14:52 PM
req_8Fq0GET /v2/devices/351904662088176429Not metered2:14:51 PM
req_8FpzGET /v2/devices/864119023357182200+1 metered2:14:51 PM
req_8FpyGET /v2/validate/351904664402519422Not metered2:14:50 PM
req_8FpxGET /v2/devices/358741965188060200+1 metered2:14:50 PM

Rate limit

Per key
25 req/sNow 19 req/s
One counterThe number that enforces this limit is the number you're billed on. There's no second count.
38 today429s are listed, never billed
On screen

The developer console mid-period: calls counted as they land, the month-end projection and its charge beside them, the rate limit read from the same counter, and a rate-limited call listed but not metered.

FifteenEN· 11 languagesSign inGet an API key
IMEI validator IMEI generator Barcode reader MEID converterFree · no signup · runs on the same service as the paid lookup

IMEI validator

Checks the length and the check digit before anyone spends a lookup on a number.

35 874210 66319014 / 15 digits
Not a valid IMEIAn IMEI has fifteen digits. This one stops at fourteen, so the check digit is missing.
The working · Luhn over the first fourteen digits
Digit358742106631901
Doubled·10·14·4·0·12·2·0
Adds31854410633290

Sum 49 · round up to 50 · missing check digit 1

Did you mean35 874210 663190 1Valid · TAC 35874210 belongs to Aurel 7 ProLook up this handset

Built to the same standard as the paid lookup: same resolution service, same rules, same answer.

What the full number resolves to

Preview
Aurel 7 Pro256GB · Slate
Reported lost or stolenNot listed
Finance lockNone
Account lockOff
Carrier lockUnlocked

Also free

No account
IMEI generatorValid numbers for test fixtures
Barcode readerRead the IMEI off a box label
MEID converterHex and decimal, both ways
Checking a bench of devices?The trade workspace and the API read the same answer you just saw.
On screen

The free validator refusing a fourteen-digit number, showing the Luhn working, and offering back the full IMEI with its check digit, one of four free tools on the same service as the paid lookup.

Free tools as the front door

Validator, generator, barcode and MEID conversion run on the same service, and are how most paying customers arrive.

The validator, generator, barcode reader and MEID converter run on the same service as the paid product and cost nothing to use. They are the acquisition channel: most paying customers arrive through one of them, having already confirmed the data is right on something they cared about. They're built to the same standard as the paid surfaces, not treated as marketing.

What shipped
  • Free tools run on the same service as the paid product
  • Most paying customers arrive through one of them
  • Built to the same standard as the paid product

Abuse control without signup

Device fingerprinting throttles the expensive tenth of anonymous traffic while the free lookup stays frictionless.

The free lookup stays open with no signup, so abuse has to be answered without a login. FingerprintJS identifies the device, not the IP, which is what lets the expensive tenth of anonymous traffic be throttled while everyone else notices nothing. An IP limit would have caught an office and a NAT along with the scraper. Throttling degrades to a delay before it becomes a refusal.

What shipped
  • Device fingerprinting instead of IP, so offices aren't caught
  • The expensive tenth throttled; everyone else unaffected
  • Degrades to a delay before it becomes a refusal
Anonymous lookups, counted per device

1:00–2:00 PM today · fingerprinted devices, not addresses · the free lookup stays open

Audit log09/17/2026
Hour
1:00–2:00 PM
Anonymous lookups
21,400
Distinct devices
6,812
Throttled devices
4carrying 10% of lookups
Signup required
No

Heaviest devices this hour

Fingerprint · not IP
DevicePatternLookups / hourAddressesRule
fp_9c41e2Sequential serials, rotating addresses1,02014Refused
fp_3b07aaSame TAC, serial +1 each call6409Refused
fp_e81d5fBurst from one browser3801Delayed
fp_52c9b0Retry loop on a timeout1002Delayed
Everyone else6,808 devices · ordinary use19,260—Unaffected
4 devices · 2,140 lookups6,808 devices · 19,260 lookups

The expensive tenth, throttled. The rest never meet a rule.

Throttle ladder · per device · thresholds illustrative
NormalServed at once
DelayAnswer slowed first
RefuseOnly if it keeps going

One address, twelve devices

198.51.100.24Harbor Street Repairs · shared address132 lookups
fp_4a1018
fp_4a7111
fp_4ad29
fp_4b3314
fp_4b947
fp_4bf512
fp_4c566
fp_4cb710
fp_4d1815
fp_4d798
fp_4dda13
fp_4e3b9

Each device is light, so nobody in the office is slowed.

Why not limit by address

An address limitAdds the office's twelve devices together and catches all of them, while a scraper rotating addresses slips under.
A device limitCounts each device on its own: the office carries on and the scraper is slowed, then refused.
On screen

An hour of anonymous lookups counted per device: four fingerprints carrying a tenth of the traffic are delayed or refused, while twelve devices behind one office address carry on untouched.

Locales

11 prerendered language trees · locale is a route segment, not a string swap

Preview a locale09/17/2026

Language trees

Marketing and product on the same footing
LocaleLookup routeMarketingProduct
enEnglish/en/imei-checkPrerenderedPrerendered
esEspañol/es/consulta-imeiPrerenderedPrerendered
ptPortuguês/pt/consulta-imeiPrerenderedPrerendered
frFrançais/fr/verification-imeiPrerenderedPrerendered
deDeutsch/de/imei-pruefenPrerenderedPrerendered
itItaliano/it/controllo-imeiPrerenderedPrerendered
trTürkçe/tr/imei-sorgulamaPrerenderedPrerendered
plPolski/pl/sprawdz-imeiPrerenderedPrerendered
ruРусский/ru/proverka-imeiPrerenderedPrerendered
idBahasa Indonesia/id/cek-imeiPrerenderedPrerendered
viTiếng Việt/vi/kiem-tra-imeiPrerenderedPrerendered

Every tree is a real page with its own URL and metadata. Visitors arrive in their own language, on a marketing page.

/de/imei-pruefen

Rendered page
Fifteen DE

IMEI prüfen: das ganze Gerät hinter einer Nummer

Modell, Ausstattung und Status, ohne Anmeldung.

15-stellige IMEI eingebenPrüfen
Als verloren gemeldet Finanzierungssperre Kontosperre Netzsperre

Page head

hreflang · generated per route

<link rel="alternate" hreflang="en" href="/en/imei-check">

<link rel="alternate" hreflang="es" href="/es/consulta-imei">

<link rel="alternate" hreflang="pt" href="/pt/consulta-imei">

<link rel="alternate" hreflang="fr" href="/fr/verification-imei">

<link rel="alternate" hreflang="de" href="/de/imei-pruefen">

<link rel="alternate" hreflang="it" href="/it/controllo-imei">

<link rel="alternate" hreflang="tr" href="/tr/imei-sorgulama">

<link rel="alternate" hreflang="pl" href="/pl/sprawdz-imei">

<link rel="alternate" hreflang="ru" href="/ru/proverka-imei">

<link rel="alternate" hreflang="id" href="/id/cek-imei">

<link rel="alternate" hreflang="vi" href="/vi/kiem-tra-imei">

<link rel="alternate" hreflang="x-default" href="/en/imei-check">

Eleven languages

On screen

Eleven language trees, each locale a route segment with prerendered marketing and product pages, beside the German lookup page as rendered and the hreflang links in its head.

Locale is a route segment, so every surface, marketing pages included, is properly translated instead of bolted on.

Locale is a route segment, so every one of the eleven languages is a real prerendered page with its own URL, metadata and hreflang, never a client-side string swap. The marketing pages are translated on the same footing as the product, which is unusual and deliberate: the traffic that matters here arrives on a marketing page in its own language or not at all.

What shipped
  • Locale as a route segment: eleven prerendered language trees
  • Real URLs, metadata and hreflang, not a client-side swap
  • Marketing pages translated on the same footing as the product
Process

Phase by phase

  1. Phase 1: The Device Model

    Brand, Model, Variant: Kept Apart

    Modeled the three levels as separate records, so a variant gaining a spec or a brand renaming a line doesn't invalidate every lookup beneath it.

    • Device Schema
    • Brand Taxonomy
    • Variant Resolution Rules
  2. Phase 2: One Service, Three Doors

    Same Answer, Three Prices

    Built a single resolution service and put a consumer lookup, a trade workspace, and a keyed API in front of it, so the three audiences buy the same answer in the shape each one actually wants.

    • Resolution Service
    • Segment Surfaces
    • Pricing Tiers
  3. Phase 3: The Metered API

    Usage You Can See Before The Invoice

    Metered per key with the running count exposed in the developer console, because a metered API whose usage is only visible on the bill is one customers stop trusting.

    • API Keys
    • Usage Metering
    • Developer Console
    • Rate Limits
  4. Phase 4: Keeping It Current

    A Database That Feeds Itself

    Built the scrape-and-reconcile job that finds brands and models missing from the catalog and fills them, with an admin review step so a bad scrape never silently becomes the record.

    • Scrape Pipeline
    • Missing-Model Detection
    • Reconciliation Review
  5. Phase 5: Abuse Without A Wall

    Throttling The Anonymous Tenth

    Fingerprinted the device instead of the session, so the small fraction of anonymous traffic driving most of the cost can be throttled while everyone else keeps a frictionless free lookup.

    • Device Fingerprinting
    • Abuse Rules
    • Audit Log
Morning bench

9 numbers pasted at 9:02 AM · one resolution service, the same answers as the public lookup

Paste numbers09/17/2026
01 35 874210 663190 102 35 190466 208817 603 86 402135 771420 404 35 874188 104482 705 35 302719 650093 406 86 411902 335718 207 35 874196 518806 008 35 550981 027364 009 35 190466 440251 9
9 pasted5 clean3 flagged1 refused before lookupCredits used 8 · the refused number was not charged

Results

Brand → model → variant resolved per row
IMEIDeviceLost / stolenFinanceAccountCarrierVerdict
35 874210 663190 1Aurel 7 Pro256GB · SlateNot listedNoneOffUnlockedClear
35 190466 208817 6Pell 9a128GB · SandNot listedNoneOffUnlockedClear
86 402135 771420 4Veyra V5512GB · BlackNot listedLockedOffUnlockedHold
35 874188 104482 7Aurel 6 Lite64GB · MistNot listedNoneOffLockedClear
35 302719 650093 4Pell 8128GB · GreenNot listedNoneOnUnlockedHold
86 411902 335718 2Veyra V3128GB · BlueNot listedNoneOffUnlockedClear
35 874196 518806 0Aurel 7128GB · SlateReportedNoneOffUnlockedDo not buy
35 550981 027364 0Norrin Go 264GB · WhiteNot listedNoneOffUnlockedClear
35 190466 440251 9Check digit fails· expected 6, got 9 · refused before lookup, not chargedRefused
On screen

The trade workspace: a repair shop's morning bench of nine pasted numbers, eight resolved with their locks and a verdict each, and one refused on its check digit before lookup and not charged.

What it carries now

125

Brands in the catalogue

−94%

Manual catalogue entry

−71%

Anonymous abuse cost

11

Locales served

Brands in the catalog is the count after the pipeline's first full pass. Manual catalog entry compares the maintenance hours before and after. Anonymous abuse cost is the change in infrastructure spend attributable to unauthenticated traffic. Locales served is a count of fully prerendered language trees, not of translated strings.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

What the architecture settled

A device database is a pipeline, not a table: the week you stop feeding it, it starts lying.

A catalogue is a pipeline: the manual version worked while one person owned it and began lying the month after they stopped, which is the failure mode of every hand-fed table.

Three audiences buying the same answer want three products, not three pricing rows.

The consumer, the repair shop and the developer buy the same fact and need three different products: pricing rows would have given all three a bad fit.

Metered usage that is only visible on the invoice is metered usage customers stop trusting.

Usage visible only at invoice time is the fastest way to lose an API customer, and it costs nothing to expose the counter that is already being kept.

Fingerprinting the device instead of the session throttles abuse without putting a signup wall in front of the traffic that becomes revenue.

Fingerprinting the device rather than the session or the IP is what let the free tool stay frictionless while the abuse became answerable.

Ways of working

How the work was run

  1. 01

    We built the resolution service and the developer API first, because metering was the thing blocking revenue, and ran the scrape pipeline in shadow for six weeks before it was allowed to write to the catalogue. The consumer and trade surfaces followed once the answer underneath them was trustworthy.

    A dedicated team for twenty-two weeks, with the three surfaces built against one resolution service from the first sprint rather than being unified later. The reconciliation job's human review step was insisted on by the client and turned out to be right: a silently wrong device record is worse than a missing one for every downstream consumer.

One minute of anonymous traffic, replayed

An address limit refuses the office. A device limit refuses the scraper.

The same minute of lookups against the free tool (an office, a busy technician, a scraper and one buyer) with no throttle, with the obvious limit per IP address, and with the per-device fingerprint limit that shipped. Switch tabs, or use the arrow keys once one is focused.

What shipped: count per device fingerprint, whatever address it arrives from. Each office device is light and untouched. The busy browser is only slowed. The scraper is slowed, then refused.

The rule · thresholds illustrativeFirst 20 a minuteServed at once · per device21 to 60Delayed, still answered · per devicePast 60Refused · per deviceThe fingerprint identifies the device, so rotating addresses changes nothing and sharing one changes nothing either.minute 60s / 60s
One illustrative minute · 303 anonymous lookupsServedDelayedRefused
  • A repair office12 devices behind one address · 36 lookups36 · 0 · 0
  • One busy browserA technician checking a bench · 25 lookups20 · 5 · 0
  • A scraperOne device rotating 8 addresses · 240 lookups20 · 40 · 180
  • A buyer at homeOne phone, one listing · 2 lookups2 · 0 · 0

Only the scraper is refused, after a delay first. The office and the buyer notice nothing, and nobody had to sign up.

Why a wall was never the answer: the free lookup’s value is that it asks for nothing, and the traffic a signup would stop is the traffic that becomes revenue.

Architecture

A catalogue that feeds itself, and one answer sold three ways

The device database is a living pipeline. What reaches a buyer, a repair shop or a developer has passed a reconcile step and a person, and is read from one place.

  1. 01 · Source
    Manufacturer & regulatory sourcesA scheduled scrape across all 125 brands, so the catalogue no longer depends on one person entering models by hand.
  2. 02 · Ingestion
    Reconcile against the canonical tableNew models, changed specs and renamed brands are raised as differences, never written directly.
  3. 03 · Review
    A human passNothing becomes canonical unreviewed, so a bad scrape is a row to reject, never a wrong device record.
  4. 04 · State
    Brand, model, variant in PostgreSQLThree levels kept apart, so a variant gaining a spec or a brand renaming a line doesn't orphan a lookup beneath it.
  5. 05 · Delivery
    One resolution service, three doorsConsumer lookup, trade workspace and keyed API hold no copy of the data, so a correction lands in all three at once.

What a wrong answer can reach

Data integrity & fair metering

No unreviewed record becomes canonical

The reconcile job raises differences for a human instead of writing them, because a silently wrong device record is worse than a missing one for every consumer downstream.

The count you watch is the count you pay

Metering reads the same per-key counters that enforce the rate limit, and usage accrues in the developer console with the projected charge beside it, before any invoice.

Abuse is throttled without a wall

Anonymous lookups are counted per device fingerprint, whatever IP they come from, so offices behind one address aren't caught. Throttling degrades to a delay before it becomes a refusal.

Selling one dataset to buyers who each want it differently? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.