Spec only
To document what exists and onboard your devs.
$1,750
- Complete OpenAPI spec
- Confidence report
- Delivered in 48 hours
For CTOs and lead devs
A complete OpenAPI spec and typed TypeScript & Python SDKs, rebuilt from a session of your app that you authorize us to observe. Your team integrates without guesswork. Your source code stays with you.
Not ready yet? Try the free version, 100 % in your browser: HAR → OpenAPI + SDK →
POST /v2/orders
201
authorization: Bearer ••••••••masked
{
"customer_id": "cus_8f2a",
"items": [{ "sku": "BX-12", "qty": 2 }],
"coupon": null
}
openapi.yaml
OrderCreate:
type: object
required: [customer_id, items] # seen 14/14
properties:
customer_id: { type: string }
items:
type: array
items:
$ref: "#/components/schemas/LineItem"
coupon:
type: [string, "null"] # null 9×/14
Nobody knows what /v1/sync returns anymore, and the whole team is afraid to touch it.
Without docs, they spend their first week reading code. With the spec, they read the contract in an hour.
The typed SDK replaces trial and error in Postman and screenshots passed around on Slack.
Contour reads your session's traffic, masks the secrets, then infers the API contract with a confidence score for every operation.
Day 0
One page: which app, which environment, for how long. Nothing is captured before you sign.
Day 0 to day 2
You export a session of your app (a HAR file, a few clicks in the browser) or open a test account for us. Contour groups the calls and infers the schemas.
Day 2
Spec, SDKs and confidence report. You commit it, and your team uses it the same day.
Four files, readable by your devs and by your tools. A preview of a sample pack, built on a fictional orders API.
openapi: 3.1.0
info:
title: Orders API (internal)
version: 2.0.0
x-generated-by: contour
servers:
- url: https://staging.example.com
paths:
/v2/orders:
post:
operationId: createOrder
summary: Creates an order
security: [{ bearerAuth: [] }]
requestBody:
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/OrderCreate"
responses:
"201": { $ref: "#/components/responses/Order" }
"422": { $ref: "#/components/responses/Invalid" }
x-confidence: 0.96 # 14 calls observed
# … 23 more operations
// Generated by Contour: native fetch, zero dependencies
export interface OrderCreate {
customer_id: string;
items: LineItem[];
coupon?: string | null;
}
export class OrdersApi {
constructor(private base: string, private token: string) {}
/** POST /v2/orders: creates an order */
async createOrder(body: OrderCreate): Promise<Order> {
const res = await fetch(`${this.base}/v2/orders`, {
method: "POST",
headers: {
Authorization: `Bearer ${this.token}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!res.ok) throw new ApiError(res.status, await res.json());
return res.json();
}
// … 23 more typed methods
}
# Generated by Contour: standard library only, Python 3.11+
import json
import urllib.request
from typing import NotRequired, Optional, TypedDict
class OrderCreate(TypedDict):
customer_id: str
items: list["LineItem"]
coupon: NotRequired[Optional[str]]
class OrdersApi:
def __init__(self, base: str, token: str) -> None:
self.base, self.token = base, token
def create_order(self, body: OrderCreate) -> "Order":
req = urllib.request.Request(
f"{self.base}/v2/orders",
data=json.dumps(body).encode(),
method="POST",
headers={"Authorization": f"Bearer {self.token}",
"Content-Type": "application/json"},
)
with urllib.request.urlopen(req) as res:
return json.load(res)
# … 23 more typed methods
# Contour report: Orders API
Sessions: 3 Calls analyzed: 412 Operations: 24
## Confidence per operation
| Operation | Seen | Confidence |
|------------------------|------|----------------|
| GET /v2/orders/{id} | 31× | 0.98 |
| POST /v2/orders | 14× | 0.96 |
| PATCH /v2/orders/{id} | 2× | 0.61 to review |
## To complete
- PATCH /v2/orders/{id}: only 2 calls,
`status` values may be incomplete.
- /v1/legacy/*: no calls in the session.
A 10-minute session on the Export screen will do.
## Masked before analysis
- 3 Authorization headers, 1 session cookie
- 27 personal values (emails, phone numbers)
Formats: OpenAPI 3.1, TypeScript 5, Python 3.11+. The spec opens as is in Swagger UI, Redoc or Postman.
Contour only reads the HTTP traffic of a session you authorize. The simplest setup: your staging environment, a test account, fictional data.
Interoperability only, on an API you own or are authorized to integrate. Never source code.
A signed written agreement before any capture. It protects you as much as it protects us.
Tokens, credentials and personal data are removed before any analysis by a model.
We scope it together on the call, and you leave with a firm quote.
Want to see it before a call? The free tool compiles your HAR locally, in seconds. · The compiler is open-source
To document what exists and onboard your devs.
$1,750
So an app or a new dev can plug in right away.
$2,900
So we wire it into your app with your team.
from$3,500
Not sure which pack fits? We'll decide together on the call.
The framework is built for it: we document the interface of an API you own, or that your contract authorizes you to integrate, from sessions you have the right to observe. No circumvention of protections, no access to source code, and a signed written agreement before any capture. Unsure about your rights? We settle it on the call, before any quote.
The safest option, and the one we recommend: your staging environment, a test account, fictional data. Nothing real leaves. If you work against production, tokens, credentials and personal data are masked before any analysis by a model, and the report lists everything that was masked.
Two business days, counted from the signed agreement and the session you send. That's the right order of magnitude for most internal APIs. If yours is larger, we tell you on the call and the quote states it in black and white.
Three things: the signed authorization agreement (we send you the template), a session that walks through your app's key screens, as a HAR export or through a test account, and twenty minutes to tell us what matters. That's it.
It won't appear in the spec: we don't guess. The confidence report lists what was seen, how many times, and what's left to cover. One additional session is enough to fill the gaps.
Because you shouldn't have to open your repo to a contractor. And because the session shows what your API actually does, not what the code was supposed to do.
You describe the API that's blocking you. We assess the scope with you and tell you whether it's doable. If it is, you leave with a firm quote. The call is free, with no commitment. Book the 20 minutes
Twenty minutes. If it's doable, you leave with a firm quote. If not, you'll know why.
20 minutes on video. Tell us which API is blocking you and when you're free: David Amor proposes a slot within one business day, with a firm quote at the end of the call.