A platform team owns a 'Pricing' service used by a dozen other teams. Instead of leaving each consuming team to build its own anti-corruption layer against Pricing's internal model, the platform team publishes a versioned, documented API contract that Pricing commits to keeping stable, and consumers integrate against that contract instead of Pricing's internals. What pattern is the Pricing team applying, and how does it change - or reduce the need for - the ACLs each consumer would otherwise build?
answer
- producer-side counterpart to ACL
- OHS = general public interface
- PL = the versioned shared schema/contract
- moves cost from N consumer ACLs to 1 producer contract
- consumers still keep a thin ACL for safety
basics
~20 sThe Pricing team is running an Open-Host Service with a Published Language: a stable, documented public contract instead of exposing its raw internal model. Consumers can then integrate against that contract directly, needing a much thinner ACL - or sometimes none - because the translation work already happened once, upstream.
solid answer
~50 sThat's the Open-Host Service pattern paired with a Published Language: the upstream team deliberately designs and commits to a stable, well-documented public contract - a versioned schema, not its internal domain model - specifically so many consumers can integrate against one shared, translated interface instead of each building a bespoke ACL against Pricing's internals. It moves the cost of protecting integrity from N consumer-side translators to one producer-side contract design and maintenance effort. Consumers still often keep a thin ACL of their own - to translate the published language into their own domain vocabulary, and as insurance if the contract ever breaks its promises - but that ACL is far cheaper than one built against an undocumented, unstable internal model, because the published language is designed to be stable and is the producer's explicit responsibility to keep so.
go deeper
Not expected to know OHS/PL by name; should just be able to say 'the producer builds one stable public interface so everyone else doesn't have to guess at the internals,' if prompted.
Should recognize OHS/PL as the producer-side counterpart to a consumer-side ACL, and give a rough why (avoids duplicated translation effort).
Should discuss versioning/deprecation discipline as central to what makes a contract 'published,' and know that consumers often still keep a thin ACL even against a good contract.
Should reason about when it's worth investing in an OHS/PL versus just letting each consumer build its own ACL (e.g., number of consumers, expected internal churn), and recognize failure modes like contract sprawl or an OHS that's secretly shaped around one big consumer.
## The matched pair Open-Host Service (OHS) and Published Language (PL) are a matched pair of patterns that sit on the producer side of an integration, complementing the anti-corruption layer that typically sits on the consumer side. - **An Open-Host Service** is a service that deliberately exposes a public, general-purpose interface designed for many consumers, rather than an interface shaped around whatever its own internals happen to look like or around a single consumer's specific needs. - **The Published Language** is the actual shared contract that interface speaks — a schema (OpenAPI/Swagger spec, a Protobuf/gRPC IDL, an AsyncAPI event schema, a documented JSON shape) that is explicitly versioned, documented, and treated as a promise: the producer commits to not breaking it without a deliberate, communicated versioning strategy. Mechanically, the Pricing team here builds and maintains a translation layer of its own — converting its internal domain model into the published contract — so that every consumer gets a stable, intentionally designed view instead of raw internals. That's the mirror image of a consumer-side ACL: the producer is protecting its consumers, and just as importantly protecting itself, since it can now refactor internals freely as long as the published contract holds. ## Why it exists This exists because a plain consumer-side ACL doesn't scale well when many teams depend on the same upstream: without a published contract, each of the dozen consuming teams would independently reverse-engineer Pricing's internal model, build their own translator, and re-discover the same quirks and edge cases — a lot of duplicated effort, and a lot of independent points of breakage whenever Pricing's internals shift, even in ways that shouldn't be consumer-visible. By investing once in a well-designed public contract, Pricing turns N bespoke, fragile integrations into one well-tested, explicitly maintained boundary. It's the same instinct behind ACLs — protect model integrity at integration boundaries — just applied from the producer's side of the relationship instead of the consumer's. ## Who pays for it The cost sits with the producer now. - **Design work.** Designing a good public contract is real design work, distinct from (and often harder than) just exposing whatever the internal model looks like, because it has to anticipate reasonable consumer needs without overfitting to any one of them, and it has to be versioned so internal refactors don't force a breaking change on every consumer. - **Ongoing maintenance.** There's an ongoing maintenance cost too — deprecating old contract versions responsibly, documenting changes, and resisting the pressure to bolt one-off fields onto the published language for a single demanding consumer, which erodes its generality over time. - **On the consumer side**, the benefit is real but not absolute: consumers still usually want a thin ACL translating the published language into their own domain vocabulary, both for cleanliness and as insurance, because 'published and versioned' is not the same guarantee as 'will never change in a way that surprises you' — deprecation windows lapse, and producer teams do occasionally ship breaking changes by mistake. ## Failure modes 1. **A common failure is a published language that isn't actually general** — a producer ships an 'open' API that's really shaped around its first or biggest consumer's specific needs, so every other consumer still has to build significant translation logic anyway, and the OHS/PL effort didn't pay for itself. 2. **Another is version sprawl**: without disciplined deprecation, a producer accumulates v1, v2, and v3 of the same contract live simultaneously, each with subtly different semantics, and consumers integrating at different times get inconsistent behavior — effectively re-creating the 'many models to translate against' problem the pattern was meant to solve. 3. **A third is contract drift without version bumps**: a producer changes response semantics, not just shape, without incrementing the version, silently breaking every consumer's assumptions at once, which is worse than if there'd been no published contract at all, because consumers trusted the stability promise and skipped defensive translation. ## Where it shows up A well-known real-world instance is how large platforms expose stable public APIs specifically so third-party integrators don't need to understand internal implementation details — a payments platform's versioned public API, with a dated API-version scheme and long-lived backward-compatibility guarantees, is a textbook Open-Host Service with a Published Language: the platform's internal ledger and account models are free to evolve, but the public API contract is the stable surface every integrator builds against, and versioning/deprecation policy is documented explicitly rather than leaving each integrator to reverse-engineer internals. Internally, many organizations apply the same pattern with a platform team's shared service (like the Pricing example) publishing an OpenAPI or Protobuf contract and treating it as a first-class deliverable with its own versioning and changelog, precisely to spare a dozen consuming teams from each building and maintaining a full ACL against Pricing's raw internal model.
- If Pricing publishes a stable contract, do consumer teams still need any ACL at all?Usually yes, but a much thinner one - typically just mapping the published language's types into the consumer's own domain vocabulary, since even a well-designed shared contract isn't phrased in each consumer's exact internal terms. It also serves as insurance: if Pricing ever violates its stability promise, only the thin translator needs to change, not code scattered across the consumer's domain layer.
- How is versioning typically handled in a published language to avoid breaking consumers?Common approaches include explicit version numbers in the URL or a version header, additive-only changes within a version (new optional fields are safe, removing/renaming fields is not), and a documented deprecation window before an old version is retired. The key discipline is that a version bump signals an explicit, communicated contract change rather than silent drift.
- What's the difference between an Open-Host Service and just 'having a public API'?Any service with a network-reachable API technically has a 'public' surface, but an OHS is a deliberate design stance: the interface is intentionally generalized for many consumers rather than shaped by whichever consumer asked first, and it comes with an explicit stability/versioning commitment. A service that just exposes its internal model as an API, or that reshapes its contract every time a new consumer has a special request, isn't really practicing OHS/PL even if it's technically public.
Like an international airport publishing a standard set of gate signage and boarding procedures instead of every airline having to individually decode each country's internal transit rules - travelers still keep their passport, a thin translation, handy, but most of the translation work already happened once, upstream, for everyone.
saying these in an interview costs you the question
- Thinks OHS/PL and ACL are the same pattern from the same side
- Believes a published/versioned contract means consumers never need any translation
- Can't explain why one producer-side contract beats N consumer-side translators
- No mention of versioning/deprecation discipline as part of what makes a contract 'published'
- Assumes any public API automatically qualifies as an Open-Host Service