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
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
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.
Documentation that stays accurate
API documentation is generated from the same definitions that run the API, so it can’t 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.
Grows with your business
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.
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.