APIs built to be maintained, not just to pass a demo
REST and GraphQL APIs, third-party integrations, and webhook infrastructure designed contract-first. Versioning, authentication, rate limiting, idempotency, and generated documentation — so the integration still works after both sides ship changes.
12+
Systems integrated end to end
3+
Years building production APIs
100%
Endpoints documented from the contract
Built on API tooling that survives handover
Why integrations rot
The integration worked on Monday. Nobody changed anything.
Integrations rarely fail loudly. They drift: a field is renamed, a rate limit tightens, a webhook is retried, and the mismatch surfaces weeks later as bad data nobody can trace.
I design the contract first, generate types and documentation from it, make every write idempotent and every failure observable, and version the API so a change can ship without breaking whoever integrated last quarter.

The problems I get called in to fix:
- 01
No contract, so both sides guessed
The API was documented after it was built, from the implementation. Every consumer discovered the real shape by trial and error.
- 02
Webhooks that double-process
No idempotency key, no dedupe. A provider retry creates a second order, a second charge, or a second email to the customer.
- 03
Breaking changes shipped without a version
A field type changes and three consumers break at once, with no deprecation window and no way to roll back just that change.
- 04
Auth and rate limiting bolted on
Keys shared between environments, no scoping, no per-consumer limits — so one client's bad loop degrades the API for everyone.
- 05
No visibility when it fails
No request logs, no correlation IDs, no replay. Debugging an integration issue means asking the other side to check their side.
1
Contract before any implementation
100%
Writes safe to retry
0
Undocumented endpoints shipped
What API work covers
Design, build, integrate, and keep it running
New APIs, integrations into someone else's, or repairing the one that is already causing incidents.
API design & contract definition
Resources, verbs, payload shapes, error taxonomy, pagination, and filtering agreed before implementation. The OpenAPI or GraphQL schema is written first and becomes the single source of truth that both types and docs are generated from.
- OpenAPI 3.1 or GraphQL SDL first
- Consistent error taxonomy
- Pagination and filtering conventions
- Types and docs generated from the schema
API expertise
The layers that decide whether an API ages well
Endpoints are the easy part. Contracts, idempotency, and observability are what make an API survive its second year.
The agreement between systems, written down and machine-readable so both sides can generate against it.
What gets built
The pieces that make an integration dependable
These are the components I build on almost every API engagement, and the ones missing from most of the integrations I am asked to repair.

A contract that generates everything else
One schema, from which server types, client types, validation, and reference documentation are all generated. A field cannot exist in the implementation without existing in the contract, so the docs cannot drift.
- Single source-of-truth schema
- Generated server and client types
- Generated reference docs
- CI check for contract drift

Idempotent, replayable writes
Every write accepts an idempotency key and stores the result, so a retry after a timeout returns the original response instead of creating a duplicate. The single most common cause of double-charges and duplicate records, removed by design.
- Idempotency keys on all writes
- Stored responses for safe retries
- Deduplication on inbound webhooks
- Replay tooling for recovery

Versioning and deprecation paths
Additive changes by default, explicit versions when a break is unavoidable, and deprecation headers with a real sunset window — so your consumers get notice rather than an incident.
- Additive-first change policy
- Explicit versioning when needed
- Deprecation headers and sunset dates
- Consumer usage tracking per version

Observability across the boundary
Correlation IDs propagated through every hop, structured request logs, latency and error dashboards per endpoint and per consumer, and alerting on the leading indicators rather than the outage itself.
- Correlation IDs end to end
- Per-endpoint and per-consumer metrics
- Structured, searchable request logs
- Alerting on error and latency budgets

Integration adapters that isolate the vendor
Third-party APIs wrapped behind an internal interface, so a provider change, a migration, or a second provider in a new region is a contained piece of work rather than a search-and-replace across the codebase.
- Vendor logic behind one interface
- Swappable and multi-provider ready
- Recorded fixtures for tests
- Sandbox parity with production
Building an API, or fixing one that keeps paging you?
Book a free 30-minute call. Bring the schema, the incident, or just the integration that keeps drifting, and you will get a concrete read on what is wrong and what it would take to make it dependable.
Real integrations. Real systems.
API and integration work I have shipped
ERP hubs, workflow APIs, and the plumbing behind them. Problem, solution, and my role on every build.

Odoo Integration Hub
An ERP team ran Odoo in isolation. Invoicing, product catalogs, and recipes were managed by hand and didn't sync with the external services the business actually worked in.

OpenAI Workflow Automation
Complex multi-step business processes relied on manual hand-offs between tools, with no intelligent routing or decision-making along the way.

Digital FTE Dashboard
Operations teams managing Digital FTEs across multiple clients had no single view of agent activity, approvals, or system health. Performance data lived in separate tools, Oracle for ERP records and Odoo for invoicing, so reviewing and approving agent work meant switching between several dashboards.

Task Automation Engine
Incoming work items arrived unstructured, requiring manual triage, validation, and routing before anyone could act on them, a bottleneck that grew with volume.
Where these APIs run
Same discipline, different failure modes
Contract, idempotency, and observability are constant. What changes is what a failure costs.

Fintech & payments
Where a duplicate write is a duplicate charge, and reconciliation is a legal requirement rather than a nice-to-have.
- Idempotent transaction handling
- Reconciliation and ledger endpoints
- Strong auth and audit trails
- PCI-aware data handling
How API work runs
Contract first, then everything generates from it
The order matters. Writing the contract last is what produces documentation nobody trusts.
Consumer discovery
Who calls this API, what they are trying to do, and what their failure tolerance is. An internal API and a public one are different products.
Deliverables
- Consumer list
- Use-case inventory
- SLA expectations
Contract design
Resources, payloads, errors, pagination, and auth written as an OpenAPI or GraphQL schema and reviewed by whoever will consume it — before anything is implemented.
Deliverables
- OpenAPI / SDL schema
- Error taxonomy
- Consumer sign-off
Mock & validate
A mock server from the contract, so consumers can start integrating in parallel and design problems surface while they are still cheap to fix.
Deliverables
- Mock endpoints
- Example payloads
- Early feedback
Implementation
Typed handlers, validation at the boundary, idempotent writes, and a service layer that can be tested without HTTP.
Deliverables
- Typed implementation
- Unit and contract tests
- Seed data
Hardening
Auth scopes, rate limits, timeouts, circuit breakers, and load testing against realistic traffic shapes rather than a flat benchmark.
Deliverables
- Rate-limit config
- Load test report
- Failure-mode notes
Documentation & release
Generated reference, a quickstart that actually works when followed literally, a Postman collection, and optionally a typed SDK.
Deliverables
- Reference docs
- Quickstart guide
- Postman / SDK
Monitor & iterate
Dashboards per endpoint and consumer, alerting on error and latency budgets, and a versioning policy for the changes that come next.
Deliverables
- Dashboards
- Alert rules
- Versioning policy
Why work with me
APIs written for the engineer who inherits them
An API is a promise to other developers. The measure is whether someone can integrate from the docs alone, without a call.
Contract before implementation
The schema is written and reviewed first, so documentation is generated rather than remembered — and it cannot silently drift.
Safe to retry by default
Idempotency keys, dedupe, and replay on every write path. Duplicate charges and duplicate records are a design failure, not bad luck.
Observable across the boundary
Correlation IDs and structured logs mean an integration issue is debugged from your own dashboards instead of an email chain.
Built for handover
Conventional structure, generated docs, and a Postman collection. Your next engineer does not need me to explain it.
12+
Systems integrated end to end
3+
Years building production APIs
100%
Writes safe to retry
0
Undocumented endpoints shipped
Frequently asked
Questions people ask before we start
Have an API to build, or one that keeps breaking?
Send the schema, the incident report, or just a description of the two systems that will not stay in agreement. You will get a concrete read on the fix.