{"id":79442,"date":"2026-10-21T06:41:37","date_gmt":"2026-10-21T06:41:37","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=79442"},"modified":"2026-10-21T06:41:49","modified_gmt":"2026-10-21T06:41:49","slug":"one-interface-a-hundred-vendors-how-to-code-multi-provider-integrations-that-dont-rot","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/one-interface-a-hundred-vendors-how-to-code-multi-provider-integrations-that-dont-rot\/","title":{"rendered":"One Interface, a Hundred Vendors: How to Code Multi-Provider Integrations That Don&#8217;t Rot"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Every team that integrates a third-party API eventually integrates a second one, then a fifth. By the twentieth, the integration layer is often the largest and least-loved part of the codebase: vendor SDKs, one-off retry logic and field mappings nobody wants to touch. The fix is less about clever code than about architecture, and the industries that run hundreds of integrations at once show what that architecture looks like.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Start with a contract you own<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The core idea is old: define one internal contract and make every vendor conform to it through an adapter. The rest of the application talks only to that contract, asking it to list available content, open a user session or settle a transaction. It never sees vendor payloads, authentication flows or proprietary error codes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each vendor gets its own adapter, its own contract tests and its own configuration. Adding vendor number 21 then means writing one adapter and one test suite, without touching checkout, reporting or the UI.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The discipline that makes this work is normalization at the edge. Timestamps, currencies, status values and error types should be translated into your canonical model inside the adapter, before any other code sees them. Money deserves special care: store amounts as integers in minor units, such as cents, rather than floating-point numbers. Skip normalization and vendor-specific conditionals spread across the codebase, which is exactly how integration debt compounds.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Resilience lives in the integration layer<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Third-party APIs fail in ways your own services don&#8217;t: undocumented rate limits, silent schema changes, partial regional outages. NIST&#8217;s <a href=\"https:\/\/csrc.nist.gov\/News\/2019\/nist-publishes-sp-800-204\">guidance on securing microservices<\/a> names circuit breakers, load balancing and throttling among the core features API-driven systems need, and points to API gateways and service meshes as the frameworks that bundle them.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In practice, a multi-provider layer usually needs:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Per-provider circuit breakers<\/strong>, so one failing vendor degrades gracefully instead of exhausting shared connection pools.<\/li>\n\n\n\n<li><strong>Idempotency keys on every write<\/strong>, because retries against payment or settlement endpoints will happen.<\/li>\n\n\n\n<li><strong>Schema validation on inbound webhooks<\/strong>, rejecting malformed payloads before they reach your ledger.<\/li>\n\n\n\n<li><strong>Observability tagged by provider ID<\/strong>, so latency and error spikes point to a specific vendor within minutes.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">A gateway can centralize part of this work, including authentication, rate limiting and logging, as DevOpsSchool explained in its overview of <a href=\"https:\/\/www.devopsschool.com\/blog\/what-is-kong-and-use-cases-of-kong\/\">Kong and its use cases<\/a>. Business-level guarantees, such as never crediting the same transaction twice, still belong in application code.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>When the integration count hits triple digits<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Some sectors turn &#8220;a hundred integrations&#8221; into a literal requirement. Fintech apps that read bank data typically go through aggregators such as Plaid instead of connecting to each institution. Travel sites pull airline inventory through global distribution systems like Amadeus and Sabre rather than one carrier at a time.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Regulated online gaming is an especially demanding version of the same problem. An operator&#8217;s lobby can carry content from dozens of game studios, each with its own API, wallet protocol and certification status that varies by jurisdiction. Maintaining every connection in-house can swallow an engineering roadmap, so many operators route content through an aggregation layer. <a href=\"https:\/\/agreegain.com\/games-aggregator\/\">Agreegain\u2019s game aggregator<\/a>, for instance, says it exposes titles from more than 100 providers through a single API and filters them by jurisdiction before they reach the operator&#8217;s front end. That is the adapter-plus-normalization pattern, packaged as a product.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The lesson transfers directly: whether a team builds the aggregation layer or buys it, the contract its application codes against should be its own, not a vendor&#8217;s.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Security is a design requirement now<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every adapter is also an attack surface: it stores credentials, parses untrusted input and often moves money or personal data. U.S. federal guidance increasingly treats that as the developer&#8217;s problem. NIST released a draft of <a href=\"https:\/\/csrc.nist.gov\/pubs\/sp\/800\/218\/r1\/ipd\">Secure Software Development Framework Version 1.2<\/a> in December 2025, adding new and revised practices for secure and reliable software delivery. CISA&#8217;s <a href=\"https:\/\/www.cisa.gov\/securebydesign\">Secure by Design initiative<\/a> pushes in the same direction, and more than 200 software manufacturers have signed its pledge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For integration code, that means concrete habits: secrets pulled from a vault instead of environment files, pinned versions and a software bill of materials for every vendor SDK, and a threat model for each new provider before its adapter ships.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Teams that handle 100 integrations well rarely have better engineers than teams drowning at 10. They have a contract they own, adapters that absorb vendor quirks, resilience patterns applied per provider and security built in from the first commit. That architecture works whether the vendors are banks, airlines or game studios, and it is far cheaper to adopt at integration number three than to retrofit at number thirty.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Every team that integrates a third-party API eventually integrates a second one, then a fifth. By the twentieth, the integration layer is often the largest and least-loved&#8230; <\/p>\n","protected":false},"author":65,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[11138],"tags":[],"class_list":["post-79442","post","type-post","status-publish","format-standard","hentry","category-best-tools"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79442","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=79442"}],"version-history":[{"count":1,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79442\/revisions"}],"predecessor-version":[{"id":79443,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/79442\/revisions\/79443"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=79442"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=79442"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=79442"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}