ITERNODE / v0.2.0PT-BR · EN-US · ES
API · 99.98% UPTIMEP95 76MSBUILD 0028-c91
Hotel data infrastructure· B2B travel

The canonical hotel-data layer for B2B travel.

1.3M hotels cross-mapped. One NDJSON response instead of ten. Five lines of SDK. Sandbox in 30 seconds — no card, no call.

Get sandbox key See live demo· npm install @iternode/sdk
Canonical hotels
1.3Mcross-mapped · 50+ countries
p95 latency
76 msresolve · region edge
Payload
10× smallerNDJSON streaming · canonical dedup
§ 01The problem, in two responses

Ten suppliers. One response.

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.

Without Iternode · raw fan-out~52MB · 600k entries
// 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')
Peak-load crash10 distinct schemasXML · SOAP · RESTclient reconciles
With Iternode · NDJSON stream~5.1MB · streaming
// 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.
10× smallerFirst paint < 200ms1 canonical schemabackpressure aware
§ 02Why this matters

Every hotel exists ten times. None agree.

Three pains observed in nearly every integration we audit. Good news: they are predictable. Better news: we already solved them.

Fragmentation · 7 of 10 ints

Ten IDs. One building.

Suppliers rotate internal IDs and tell you via release note — if at all. Map it Monday, breaks Friday. Iternode keeps the crosswalk.

Symptom: silently failing integration · false alerts · the on-call dev loses the weekend.
Stale content · misaligned clocks

Photos from 2019. Prices from 30s ago.

Content updates quarterly. Prices expire in seconds. Two opposite clocks. Cache invalidation became your second job — and it does not pay you.

Symptom: user closes the tab mid-checkout · silent conversion drop.
Fan-out crash · peak load

Search returns 50MB. Server crashes.

10 suppliers × 2,000 hotels × 30 rooms = 600k entries in one response. Server cant deserialize. Agency sees timeout. You find out Monday.

Symptom: sales dashboard at zero · P0 ticket at 2am · Monday post-mortem.
§ 03Platform · 3 modules

Start with Registry. Add the rest when you need it.

Each module runs alone. Together they are a platform. Honest hierarchy — Registry is GA, Stream is public beta, Market lands in Q4.

M-02PUBLIC BETA

Stream

// search · rate · booking

Bring-your-own-credentials. Parallel fan-out, dedup by canonical hotel, group rooms by signature. One NDJSON response instead of ten.

  • ModelBYOC
  • Payload10× smaller
  • TransportNDJSON · SSE
  • First paint< 200ms
Request beta access
M-03Q4 2026

Market

// licensed inventory

When selling direct hits the roadmap, plug into our licensed aggregator. One contract instead of twelve. Net rates, unified rules, one reconciliation pipeline.

  • LicenseOTA-grade
  • RatesNet
  • BookingInstant
  • ReconciliationUnified
Join the waitlist
§ 04Developer surface

Five lines. Every hotel.

No XML. No SOAP. No sales call before sandbox. No "talk to our team for pricing". This is what modern infra looks like.

ITN-SDK v0.2 · TypeScript·copy ⌘C
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:22Z
Response in < 80ms p95 · stream-firstRead the full API reference →
Design partners · early access (real logos go here)
§ 05Social proof

They traded six months of integration for one sprint.

Real 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.

RTRenan T. · CTO · Brazilian OTA (real placeholder goes here)

Sandbox in 30 seconds. No call.

Paste your API key, instantiate the SDK, run the first resolve. Want to talk after? Well pick up.

Iternode — Hotel data infra for B2B travel tech