GraphQL vs REST vs Async APIs in Banking
Designing Integration Layers That Preserve Domain Integrity in Legacy-Driven Environments
Designing Integration Layers That Preserve Domain Integrity in Legacy-Driven Environments
Banking architectures are rarely greenfield. Behind every modern API, mobile app, or fintech integration lies a core system that was not designed for today’s expectations—real-time processing, flexible data access, and seamless integration with external partners.
As banks evolve, they face a fundamental challenge: how to expose capabilities through modern APIs without inheriting the constraints of legacy systems.
This is where the choice between REST, GraphQL, and asynchronous APIs becomes more than a technical preference. It becomes an architectural decision that directly impacts domain integrity, scalability, and long-term maintainability.
However, choosing the right API style is only part of the solution. Without proper boundaries, modern APIs risk becoming thin wrappers over legacy systems. This is where Anti-Corruption Layers (ACLs) play a critical role.
In many banks, APIs are built directly on top of legacy cores. The result is predictable:
For example, a “payment API” may simply expose a set of fields required by the core system, rather than representing a meaningful domain operation such as initiate payment or authorize transaction.
Over time, this leads to tightly coupled systems where innovation becomes increasingly difficult.
REST remains the most widely used approach in banking. Its strengths are clear: well-understood patterns, strong tooling and ecosystem, compatibility with existing infrastructure, ease of governance and compliance.
However, REST APIs can become rigid over time. As requirements evolve, endpoints multiply, and clients often need to orchestrate multiple calls to achieve a single outcome.
When built directly on legacy systems, REST APIs tend to inherit their limitations, exposing data rather than domain intent.
GraphQL introduces a different model. Instead of predefined endpoints, clients request exactly the data they need. This flexibility is particularly useful in: complex UI scenarios, multi-channel applications (web, mobile), reducing over-fetching and under-fetching. However, in banking systems, GraphQL must be used carefully.
Without proper boundaries, it can expose internal data structures too directly, effectively bypassing domain logic. It can also introduce challenges in:
GraphQL is most effective when layered on top of well-defined domain services—not when used as a direct interface to legacy systems.
Asynchronous APIs, often implemented through event streaming platforms like Kafka, represent a different category entirely.
Instead of request-response interactions, systems communicate through events:
1 PaymentInitiated
2 PaymentProcessed
3 TransactionSettled
This model is essential for: real-time processing, decoupling services, scaling high-throughput systems, enabling reactive architectures.
Async APIs align naturally with financial workflows that are long-running or distributed.
However, they introduce complexity:
They are not a replacement for REST or GraphQL, but a complementary approach for specific use cases.
Regardless of the API style, the core challenge remains the same: preventing legacy complexity from leaking into modern systems. Anti-Corruption Layers (ACLs) provide this protection. An ACL sits between the legacy core and modern services, translating: data structures, workflows, error handling, domain concepts.
Instead of exposing legacy models directly, the ACL presents a clean, domain-oriented interface.
For example:
This ensures that modern APIs—whether REST, GraphQL, or async—are built on clean domain abstractions, not legacy artifacts.
In practice, modern banking systems use a combination of API styles. A typical architecture may include:
All of these interact with domain services that are shielded from legacy systems through ACLs.
This layered approach provides: flexibility in how services are consumed, consistency in domain behavior, isolation from legacy complexity.
The API style becomes an implementation detail. The domain remains stable.
Consider a bank modernizing its payments platform. The legacy core handles settlement and account management, but exposes limited, batch-oriented interfaces.
A modern architecture introduces:
From the perspective of external consumers, the system behaves like a modern, real-time platform. Internally, the legacy core continues to operate, isolated behind the ACL. This allows the bank to evolve incrementally without disrupting existing operations.
In banking, API design must also account for regulatory requirements. This includes: secure access control, auditability of operations, traceability of data flows, compliance with standards such as PSD2/PSD3.
ACLs contribute to governance by centralizing integration logic and providing a clear boundary for monitoring and auditing.
API styles must be chosen and implemented with these constraints in mind.
The choice between REST, GraphQL, and async APIs is not about selecting a winner. Each approach serves a different purpose. The real challenge lies in how these APIs are designed and what they expose.
Without proper boundaries, modern APIs become extensions of legacy systems. With Anti-Corruption Layers, they become gateways to clean, well-defined domains. In banking, where systems must evolve without breaking, this distinction is critical.
The future of banking APIs is not defined by protocol. It is defined by architecture that protects the domain while enabling change.