In most relational systems the majority of routes do the same handful of things. We start from a proven backend framework that already handles those patterns, then concentrate effort on the behaviour that is specific to your business.
Get the common API surface running early
Create, read, update, archive, search, check access, record an audit trail, publish an event, return a consistent response — most routes are variations on these. Rather than rebuild that infrastructure route by route, we describe your data model, operations, relationships and access rules to the framework and generate it. You get a working, consistent foundation early, without locking out the customisation that comes next.
Custom where it matters
Standardised does not mean inflexible. The framework handles the common lifecycle consistently while providing clear extension points for customer-specific behaviour — some included as standard configuration, some quoted as custom work (see pricing):
- Hide fields from particular users or applications
- Make fields read-only
- Apply additional validation to create or update operations
- Calculate values from related records
- Restrict access through tenant or organisational relationships
- Run custom business logic before or after an operation
- Add specialised searches or custom operations
- Change the event payload available to an integration partner
Security built into the request lifecycle
Access control should not depend on every developer remembering every check. Tenant isolation is derived from how your data relates, so it is applied the same way on every route rather than re-checked by hand. The same permission model then determines what a user or integration may read, change and receive:
- Route and operation-specific permissions
- Tenant isolation and record-level access
- Access through related relational data
- Human and machine identity checks
- Field visibility
- Event topic and payload permissions
Tenant isolation architecture →
Auditing built in
Important operations should leave a reliable history. Because auditing is part of the framework lifecycle, it does not need to be reimplemented for every endpoint:
- Who or what performed the operation
- Which tenant and record were affected
- What operation occurred, and when
- Relevant request and change information
- Whether the actor was a human or machine identity
- The result of the operation
The audit architecture →
Built for integration partners
Events are part of the framework, not an afterthought. Your system publishes business events from day one, to topics that are permissioned resources under the same model as your API — so what a user or integration partner may see through the API is what they may see through your events. A delivery connector hands those events to your platform — your Kafka, Amazon SNS or EventBridge — from where onward access is governed by your platform and shared with partners.
Integrations can also map their own IDs onto your records — namespaced and tenant-scoped — so third-party systems stay in sync without custom plumbing.
Tenant-scoped integration keys →
How events fit the architecture →
Documentation that stays accurate
API documentation is generated from the same executable definitions that run the API, substantially reducing the risk of drift from the real behaviour. It is permission-aware: each consumer sees documentation for exactly the routes they are allowed to call — which makes onboarding your frontend team and your partners’ integration engineers faster and less error-prone.
Permission-aware documentation →
Works with Identity and Access Management (IAM) providers
Your system always defines and enforces its own permissions. Sign-in can come from your existing identity provider, and permission assignment — who holds which permission, in which part of your organisation — can be delivered with the system or driven from a system you already run. Identity and permissions are a pluggable seam, so moving between those arrangements later is configuration rather than a rewrite.
Identity integration in the architecture →
Scales without changing shape
Your API is a stateless REST service behind a load balancer, so the application tier scales horizontally: Elastic Beanstalk adds and removes instances against real traffic, and the same deployment runs on one instance or on fifty. Nothing is pinned to a particular server, so there is no instance to outgrow.
The database scales on both axes. Read traffic — searches, lookups, partner queries — spreads across PostgreSQL read replicas. Write traffic moves up through larger instance classes. During discovery, we assess the expected workload, tune the application and database, and size the deployment accordingly.
Before any of that, we tune the software. Response views keep payloads to the fields a caller actually needs. Page sizes and expensive total counts are capped per endpoint. Filters are allow-listed so queries stay indexable. The audit trail can run in high-throughput mode instead of in-transaction, or move off the primary database entirely. Whether a given load problem is best answered in software or by scaling depends on your circumstances, and we work that out with you.
How the API scales →
The deployment architecture →
A strong fit for relational systems
We are particularly well suited to software built around connected business data, where entities relate to one another:
Organisation
└─ Location
└─ Department
└─ Employee
└─ Timesheet
└─ Invoice
These relationships often determine who owns a record, which tenant it belongs to, who may view or change it, which records appear in a search, and which events an integration partner may receive. Rather than reducing the system to disconnected endpoints, we design the API around those relationships.
How access follows your structure →