Back

Playbook

How to Package Your API for Integration Partners

October 31, 20267 min read

Short answer: stop publishing a raw API and letting each partner learn it by breaking it. Package it once: a spec covering only the calls a partner needs, verified against a real test workspace; an auth guide; a plain description of how your webhooks behave; a test kit with contract and replay tests; a change log with a notice period; and written support and exit terms. Every partner after the first then integrates in a fraction of the time.

Why partners keep breaking on the same things

If your product is the one other products integrate with, you have probably noticed that every new partner asks the same questions. How long does a token last? Do webhooks retry? Is this field stable? Who do we call when it's down? And the ones who don't ask find out in production.

That cost lands on the host, not on you. A founder who had built a two-way sync described exactly where the work went:

"Cross-integrations look free until the other APIs start breaking your glue. I shipped a two-way sync once and most of the work was token refresh, idempotent webhooks, and mapping fields that both sides rename without warning."

Notice what's missing from that list: building the feature. Token refresh, duplicate deliveries and silent field changes are all facts about your API that you know and the partner doesn't. Every host learns them separately, by breaking. The fix is to invert it: the provider writes down how its integration behaves, once, and every host integrates against that.

You can do this today, without any platform, in a folder and a test account. Here are the six parts.

The six parts of a partner integration package

PartWhat it containsThe partner problem it removes
Host specOnly the calls a partner needs, each verified against a test workspaceBuilding against endpoints nobody has run
Auth guideToken type, lifetime, refresh flow, per-customer model, rate limitsExpired tokens and refresh storms
Delivery behaviourSigning, retries, ordering, duplicates, cursorDuplicate records and missed events
Test kitA test workspace, contract tests, replay testsFinding bugs in production
Change log + noticeDated changes, affected fields, a notice periodSilent schema drift
Support + exit termsResponse time, incident notice, escalation, exit noticeOutages landing in the host's inbox with no owner

1. A host spec, verified against a real test workspace

Not your full API reference. A versioned spec (OpenAPI is the obvious format) covering only the calls a partner actually needs to build the integration, usually a small fraction of your surface. Two rules make it worth having:

  • Every call in it has been run against a real test workspace, with the request and response recorded. An endpoint list nobody has run in production is not a spec; it's homework you've handed to the partner.
  • It's versioned. Partners build against a version, so you can tell them precisely which version a change affects.

A side benefit: partners increasingly build their half with a coding agent. A verified, versioned spec is the best input you can give that agent. An untested endpoint list produces confident code against behaviour that doesn't exist.

2. An auth guide that answers the refresh questions

Write down the things a partner otherwise discovers when customers start getting logged out:

  • Token type and lifetime, and whether refresh tokens rotate on use.
  • The renew endpoint and what it returns on failure.
  • The per-customer model: one token per customer workspace, or one per partner?
  • Rate limits, per token and per partner, and what a limited response looks like.
  • Your recommended refresh rules: refresh early rather than waiting for a 401, allow one refresh at a time per customer so parallel calls don't trigger a stampede, and always check the customer id on every call.

The partner-side detail of that last point is its own topic, covered in OAuth token refresh for multi-tenant integrations. Your job as the provider is to state the facts the partner's code depends on.

3. How your webhooks actually behave

Most webhook docs list event types and payloads. The questions that cause the damage are about delivery, and they belong on one page:

  • Are deliveries signed? If so, how is the signature verified?
  • What's the retry schedule, and for how long does it continue?
  • Can the same event arrive more than once? (Say yes. It can.)
  • Is ordering guaranteed? Usually not, so say so.
  • Is the payload the data, or a nudge to re-read?
  • Is there a "changes since" endpoint or cursor to catch up after downtime?

If the honest answers are "unsigned, retries for a day, no cursor", the best fix is at the source: sign deliveries, or add a "changes since" endpoint. If that isn't on your roadmap, publish the safe pattern as official guidance instead: treat each webhook as a nudge to re-read rather than as data, upsert on your ids instead of inserting, and keep a high-water mark per customer. Fixed once by you, it's fixed for every partner.

4. A test kit: test workspace, contract tests, replay tests

Give partners something to run in their own CI, not just something to read:

  • A test workspace with realistic fixture data, so partners don't build against production or against an empty account.
  • Contract tests that assert the calls and fields the partner relies on still behave as specified. Better still, let each partner contribute the small set of calls they depend on and run those in your CI before you deploy. That's consumer-driven contract testing, and it catches a breaking change before it ships rather than after.
  • Replay tests: every delivery sent three times, out of order, after a restart, must leave the partner's state unchanged. If a partner's handler passes, it's idempotent. The full method is in how to handle duplicate webhooks.

You don't need to see the partner's code for any of this. Ask for the test result, not the repository. A pass/fail and a version number is enough to know they're ready.

5. A change log with a notice period

The failure mode nobody plans for is worse than a bug: you ship a breaking change and four partner products break at once. Prevent it with:

  • A dated change log, entry by entry, naming the fields and endpoints each change touches.
  • A notice period for breaking changes (thirty days is a reasonable floor for a small provider), with an exception for urgent security or legal fixes.
  • Direct notice to each affected partner's escalation address. Nobody reads change logs unprompted.
  • Versioned endpoints and a deprecation window, so old versions keep working while partners migrate.

6. Support and exit terms, written once

The partner's customers see the partner's product, so when your side is down, the emails go to them. Your package should state, in advance:

  • Your second-line response time, as a real commitment you can meet.
  • How you notify partners of incidents (a status page that can push to them works).
  • An escalation address that is a role inbox, not a person.
  • What a partner should show customers when you're unavailable, so they can build a clean fallback state.
  • Exit: notice, a removal window, data deletion with a deadline, and final settlement.

These are the same terms a partnership agreement should contain, covered clause by clause in what to put in an integration partnership agreement. Publishing your defaults up front means each new partner starts from a yes instead of a blank page.

What a partner package is not

  • Not a UI widget you drop into their product. The partner's screens stay theirs. You package the capability and its behaviour, they decide how it looks.
  • Not code you write for them. Each side builds and maintains its own half. The package makes their half faster and more correct.
  • Not a giant schema nobody fills in. Keep it short. A one-page fact sheet with mostly yes/no answers beats a forty-page portal that's out of date by next quarter.

Why it's worth doing before you have many partners

Because the arithmetic only goes one way. Without a package, your second partner costs as much as your first, and so does your tenth, and you answer the same questions each time. With one, every partner after the first integrates against a tested, versioned contract instead of an untested list of endpoints. That turns you from a one-off deal into something products can embed as a matter of course, which is when integrations start changing how much each side can sell to the users it already has.

It's also the strongest thing you can attach to an outreach message. "Here's a spec we've run end to end, a test workspace and our support terms" is a different pitch from "we have an API." If you're at that stage, see how to find integration partners.

On Ordana, the members build their own integrations from a prompt written for their codebase; a provider that already has these six parts written down makes that prompt, and every host's build, far more precise.


Related reading: