5 EDI Lessons Every API Developer Learns the Hard Way
You have probably never thought about EDI. It's the ancient technology your retail trading partners use to send purchase orders — the stuff of fax machines and "enterprise software" demos. But here's the secret: EDI systems solved distributed-systems problems decades ago that modern API developers are still rediscovering, one 3 a.m. incident at a time.
I work on SignalEDI (managed EDI for SMBs), so I live in both worlds. Here are the five lessons worth stealing.
1. Idempotency keys are older than you
Every X12 interchange carries an ISA control number — a unique identifier the sender generates per transmission. Receivers track which control numbers they've already processed. Send the same 850 purchase order twice because of a retry? The duplicate is recognized and rejected. That's an idempotency key with a 40-year track record.
The old world adds two details modern APIs often skip:
- The key travels in the payload, not a header. Proxies, gateways, and logging pipelines strip headers. Putting the idempotency key inside the signed payload means it survives the journey.
- The dedup window is explicit. EDI partners agree on a retention period for control-number history (often 90+ days). Decide yours up front and document it, or your "exactly once" quietly becomes "exactly once, for a while."
2. The spec is a rumor; the partner's actual file is the truth
EDI runs on published standards (X12, EDIFACT). In theory, every partner implements the same 850. In practice, every partner implements a slightly different 850 — a segment they require that the spec marks optional, a code value they invented, a field limit buried on page nine of a PDF that their API truncates silently instead of rejecting.
The discipline EDI forces is the implementation guideline: a per-partner profile capturing what they actually send, not what the standard says they should send. API developers: this is your OpenAPI spec plus a big warning sticker. If your integration tests only use the documented happy path, production will find the undocumented paths for you. Generate adversarial fixtures — boundary lengths, unicode, missing "required" fields — because your partners certainly will.
3. Acknowledge everything, reconcile always
In EDI, every document gets a functional acknowledgment (the 997). Received your 850? You get a 997 saying so, with per-segment error reporting if it was malformed. And serious operators don't stop at sending — they reconcile: the acknowledgments get matched against what was sent, and anything unacknowledged gets investigated.
Most webhook consumers I've seen do the opposite: they return 200 and hope. Then a silent failure means three days of missing orders before anyone notices. Steal the EDI pattern:
- Acknowledge receipt immediately (separate from processing).
- Reconcile what you acknowledged against what you processed.
- Alert on the gap, not on the error.
The most expensive integration bugs aren't the loud ones. They're the quiet ones — the message that never arrived, the webhook that nobody retried.
4. Fixed-width thinking will save you from truncation bugs
The X12 ISA header is exactly 106 characters. Every element is fixed-width. A 16-character sender ID in a 15-character field doesn't error — it misaligns everything downstream. An entire generation of EDI developers learned to fear silent truncation.
Your JSON APIs have the same landmine wearing a different coat: the carrier API that accepts a 48-character address line, returns 201, stores 35 characters, and prints those on the shipping label. The database column that silently truncates your 300-character SKU. The fix is the same in both worlds:
- Validate against the receiver's actual limits before sending, not yours.
- Read back what was stored and diff it against what you sent. This single check catches an entire class of drift bugs that no amount of request-side validation will find.
- Keep the receiver's limits in a typed profile next to timeouts and character sets — not scattered through code.
5. Boring reliability beats clever features
EDI's superpower is that it's boring. Documents flow, acknowledgments come back, exceptions get queued for humans. Nobody's impressed. But a retailer's entire supply chain runs on it, and it has done so through every tech fad of the last four decades.
When you're tempted to build the clever integration — the dynamic schema negotiation, the self-healing retry mesh — ask what the boring version looks like first: validate, send, acknowledge, reconcile, alert on gaps. It's not glamorous. It's the thing that keeps the 3 a.m. pages away.
The EDI world and the API world are converging fast — retailers who demanded EDI for decades now accept APIs, and API-first companies are discovering their biggest customers still speak X12. The engineers who understand both sides are going to be very valuable. The good news: the hard lessons transfer. The bad news: you now have two sets of war stories to collect.
What's the worst "the spec said it would work" bug you've shipped? I'd genuinely love to hear it — misery loves company.
I'm with SignalEDI — we do managed EDI + API integration for small businesses that can't afford an enterprise integration team. If your trading partners speak X12 and your stack speaks JSON, that's our whole job: signaledi.com.
Top comments (0)