Technical Article

Integrating a System With No Public API

How Grubhub and DoorDash order confirmations became native DinDin orders, with no order API in sight.

Integrating a System With No Public API illustration
Technical article

When a system a product depends on has no public API, the integration has to be built against whatever interface it does expose — even when that interface was designed for a human, not a program. On DinDin, a connected restaurant technology suite, that interface was an inbox.

01

Reading the work

The problem: two marketplaces, no order API

DinDin's restaurant customers take orders from several channels — their own site, their point of sale, and third-party delivery marketplaces — and every one of those orders has to reach the same kitchen printer, the same reporting, and the same operational workflow. Grubhub and DoorDash orders were the gap: neither marketplace exposed the order API this workflow needed. What each marketplace does send, reliably, is an HTML order-confirmation email to the restaurant's own inbox — the same email a manager would read by hand.

02

Reading the work

Building the integration against the inbox

The pipeline authenticates to that shared inbox and treats each incoming confirmation as the integration surface: it parses the HTML order-confirmation email, matches the merchant it belongs to, and extracts the order into DinDin's native order model. From there it is indistinguishable from an order taken on the restaurant's own site — it flows to the same kitchen printer and the same reporting. The Gmail API is a reasonable reference point for how an authenticated inbox integration like this is typically built (see: Gmail API guides, cited below).

03

Reading the work

Deduplication: the part that makes it safe to re-run

An email-based integration has to tolerate being re-run — a connection can drop mid-fetch, or a message can get reprocessed. The pipeline deduplicates by each marketplace's own order number rather than deriving an identity from free-text content, so reprocessing the same confirmation email never creates a second kitchen ticket. This is the same idempotent-request discipline documented in payment-API design, where a client-supplied identifier is used specifically so a retried request cannot double-charge or double-create (see: Stripe's idempotent requests documentation, cited below).

04

Reading the work

What this generalizes to

The general lesson is not specific to restaurants or email: when a system exposes no API, the integration is built against the most stable interface it does expose — even a human-facing one — and it is made safe to re-run with the same deduplication discipline a proper API integration would use. The inbox is not a workaround here; treated with the right discipline, it is the integration.

Sources

References

Evidence

The case study behind this article

DinDin project illustration

DinDin

Complete restaurant technology suite connecting online ordering, POS, back-office operations, kitchen displays, customer displays, and marketplace orders.

Related service

No-API Integrations and Legacy Data Migration →

Next

Working on something similar?

Let's discuss the specific constraints of your system.

Start a conversationRead more articles →