1.3M hotels cross-mapped. One NDJSON response instead of ten. Five lines of SDK. Sandbox in 30 seconds — no card, no call.
Raw fan-out search returns 50MB of nested JSON and kills your server at 2pm on a Friday. Iternode dedupes by canonical hotel and returns a single NDJSON stream. The diff is literal.
// 10 suppliers × 2,000 hotéis × 30 quartos
const responses = await Promise.all([
ratehawk.search(query), // 5.2 MB
expedia.search(query), // 7.8 MB · XML
hotelbeds.search(query), // 4.1 MB · SOAP
agoda.search(query), // 6.0 MB
booking.search(query), // 8.4 MB
... // + 5 more suppliers
])
// dedup on the client...
// merge schemas on the client...
// crash deserializing on the client
throw new Error('JS heap out of memory')// uma chamada · dedup canônico · NDJSON
const stream = await node.stream.search({
city: 'Paris',
checkin: '2026-06-01',
nights: 3,
})
for await (const hotel of stream) {
// já deduplicado por hotel canônico
// quartos agrupados por signature
render(hotel) // stream first paint < 200ms
}
// done. 1 schema. 1 ID. ship.Three pains observed in nearly every integration we audit. Good news: they are predictable. Better news: we already solved them.
Suppliers rotate internal IDs and tell you via release note — if at all. Map it Monday, breaks Friday. Iternode keeps the crosswalk.
Content updates quarterly. Prices expire in seconds. Two opposite clocks. Cache invalidation became your second job — and it does not pay you.
10 suppliers × 2,000 hotels × 30 rooms = 600k entries in one response. Server cant deserialize. Agency sees timeout. You find out Monday.
Each module runs alone. Together they are a platform. Honest hierarchy — Registry is GA, Stream is public beta, Market lands in Q4.
One canonical ID per real hotel, cross-mapped across every integrated supplier. Unified content: amenities, photos, policies, coordinates — deduped, normalized, always fresh.
Bring-your-own-credentials. Parallel fan-out, dedup by canonical hotel, group rooms by signature. One NDJSON response instead of ten.
When selling direct hits the roadmap, plug into our licensed aggregator. One contract instead of twelve. Net rates, unified rules, one reconciliation pipeline.
No XML. No SOAP. No sales call before sandbox. No "talk to our team for pricing". This is what modern infra looks like.
import { Iternode } from '@iternode/sdk'
const node = new Iternode({ apiKey: process.env.ITERNODE_KEY })
// um ID canônico cross-supplier
const hotel = await node.registry.resolve({
name: 'Copacabana Palace',
city: 'Rio de Janeiro',
country: 'BR',
})
hotel.id // → itn_7k9m2p
hotel.suppliers // → { ratehawk, expedia, hotelbeds }
hotel.lastFresh // → 2026-04-24T14:47:22ZReal design-partner quote lands here as soon as GTM unlocks publication.
We had 4 devs reconciling IDs for five months. We plugged Registry on a Thursday, deleted 12k lines of mapper on Friday. Search now pays for the server.
Paste your API key, instantiate the SDK, run the first resolve. Want to talk after? Well pick up.