Skip to content

API intake versus forms for partner submissions

By VeriScripts · Reviewed by Jerome T. · · 7 min read

Key takeaways

  • API intake is justified by where a partner's data already lives, not by how many cases they send. If they would have to build a form to assemble the payload, use yours instead.
  • Every partner integration needs an idempotency key the partner supplies. Without one, a single timed-out retry creates a second case that a reviewer will start working on.
  • Errors must separate invalid-fix-and-retry from accepted-a-human-must-act. A partner who cannot tell those apart will either retry forever or drop the case in silence.
  • The hybrid beats both pure options: the API opens the case from what the partner already holds, and a client portal collects the documents and answers the partner never had.

For most partners, the form wins. An API earns its place in a narrow set of cases, and the deciding factor is not how many applications a partner sends you. It is where their data already lives.

When a partner holds structured records — an onboarding database, a CRM carrying each merchant's legal entity and licensure, a platform that already knows which clinicians practise in which states — a form makes a person read those records off one screen and type them into another. That transcription tax is what an API removes, and it is the only thing an API reliably removes.

This is for platform and operations teams deciding what to offer partners, and for partner-side engineers weighing whether to integrate. If you are designing intake for clients you serve directly rather than partners who send you work, designing a certification intake pipeline is the nearer problem.

The form wins more often than engineers expect

A form validates in front of a human who can fix the problem immediately. A missing state licence number becomes a red field beside a cursor, and the person holding the answer is already looking at the screen. The same omission over an API becomes a 422 in a log that nobody reads until Tuesday.

Forms also handle documents naturally, carry no versioning burden, need no keys or retries, and work for every partner on the first day of the relationship rather than after a sprint. They degrade gracefully too: when a field turns out to be ambiguous, you rewrite the label. Changing the meaning of an API field is a coordination exercise across every partner who ever integrated.

None of this makes forms better in principle. It makes them cheaper in practice, which is the same conclusion arrived at honestly.

What justifies an API is a system of record, not enthusiasm

The question to ask a partner is not how many cases they expect to send. It is whether they could populate a payload from a query they could write today.

If the answer is yes — the merchant's legal name, entity type, domains, categories, contact and licence data all sit in their platform already — then an API is doing real work. It removes a class of error as well as effort, because copied data is where typos and stale values enter the file.

If the answer is that they would need to build an internal form to collect it first, then they are proposing to build your form again, worse, and post the result to you. Use the one that exists.

Volume is a proxy for transcription cost, not a threshold

There is no case count above which an API becomes correct. What matters is the product of two things: how much time a person spends transcribing each case, and how many cases per month.

A partner sending a handful of applications a month, each requiring a conversation anyway, rarely recovers the cost of an integration — not the build, which is modest, but the ongoing ownership when a field changes or a certificate expires on their side. A partner sending a steady stream every week, from data that already exists in structured form, usually recovers it within a cycle or two.

In our experience the honest inflection point is not on the volume axis at all. It is the moment a partner assigns someone whose actual job is re-keying your form. That role is a signal, and it appears at very different volumes depending on how good their underlying data is.

Idempotency is most of the integration

The single most consequential design decision in partner intake is what happens when the same request arrives twice. It will. Network timeouts are routine, well-behaved HTTP clients retry automatically, and a partner's own job runner will occasionally replay a queue after an incident.

Require a partner reference on every create, unique within that partner, and treat it as an idempotency key. A second request carrying the same key returns the case created by the first, with the same identifier, rather than opening a new one. It should be a success response, not an error, because the partner's retry logic is behaving correctly and should not be punished for it.

The cost of getting this wrong is not a tidy database problem. A duplicate case is a reviewer starting work on a file that already exists, a client receiving two portal invitations, two document requests going out under the same brand, and a billing event that somebody has to unpick. Deduplicating after the fact is far more expensive than rejecting cleanly at the door.

A secondary check on business identity is worth adding — legal entity plus primary domain, say — but as a warning surfaced to a human rather than a hard block. The same merchant legitimately comes back at renewal, and a system that refuses the second filing has traded one failure mode for another.

Errors have to be something the partner can act on

An error response is a message to an engineer who is not in the room and will read it without context. It has three jobs: say which field, say what is wrong with it in a sentence a human understands, and say whether retrying could ever help.

That last distinction is the one most integrations skip, and it is the one that matters. Three outcomes need to be unambiguous:

  • The request was malformed or a value is invalid. The partner can fix it and retry, and should be told exactly which path in the payload failed.
  • The request was accepted but the case cannot proceed without human input — an expired agreement, a missing document, a category that needs a conversation. Retrying does nothing. Somebody has to look at it.
  • Something failed on your side. The partner should retry later with backoff, and should not modify their payload trying to appease you.

Return field paths rather than prose summaries, use stable machine-readable codes alongside the human sentence, and never return a success status with a body that says the request failed. Partners write their handling once, against whatever you returned that week, and they rarely revisit it.

The asynchronous half needs the same care. A case accepted cleanly can still stall three days later when a reviewer finds the pharmacy agreement is out of date, and that event has no HTTP response to attach itself to. It needs a webhook, a status endpoint worth polling, and a place a human at the partner can log in and look — which is usually the moment teams discover that the client portal is the product rather than a courtesy.

Documents are where API intake gets difficult

Structured fields are the easy part. Certification files are mostly documents, and documents break the tidy JSON model that made an API attractive.

Accept uploads against an already-created case, either as multipart or through a short-lived pre-signed URL, and return a stored identifier with a hash so both sides can prove what was received. Resist the tempting shortcut of accepting a link for you to fetch later. A link is not a document: it expires, it changes, and the thing behind it in six months is not necessarily the thing you filed. That is a record-keeping failure as much as an engineering one, and it is covered in more depth in the audit trail a certification programme needs.

The hybrid that usually beats both

The pattern that survives contact with real partners is neither pure option. The partner posts what they genuinely hold — entity, contacts, domains, category, their own reference — and that opens a case. Everything else is collected from the merchant through a portal invitation, under the partner's branding.

This works because it splits the payload along the line of who actually knows the answer. Partners have identity and commercial data. Merchants have policies, agreements and the operational detail. Asking a partner to relay documents they do not hold is how integrations turn into ticket queues.

It also keeps the API small, which keeps it stable. A create endpoint, an upload endpoint, a status read and a webhook will carry a partner programme a long way. The temptation is to model the whole application as a schema, and the schema is the part that changes.

The partners worth integrating identify themselves

Offer the form first, to everyone, and instrument it. The partners worth building an integration for identify themselves by the shape of their usage — same fields, same cadence, obviously machine-derived data typed by a human. Build for those, and let everyone else keep the thing that already works.

The VeriScripts platform ships both sides of this: branded client portals for merchant-supplied evidence, and bulk intake by API with partner references, idempotent creates and case webhooks for partners who have the data already. If you only need one application prepared and filed rather than a channel to run, our done-for-you service is the simpler answer.

Frequently asked

When is it worth building an API integration for certification intake?
When the partner already holds the data in a system of record and a person is currently transcribing it into a form. Volume matters only as a proxy for how much transcription that is. A useful test: could the partner populate the payload from a database query today, or would they first have to build an internal form to collect the fields? If the answer is a new internal form, use the intake form you already have. An integration also needs an owner on the partner side for the years it runs.
What should the API return when a partner sends the same request twice?
The same 2xx you sent the first time, with the original case id in the body. A 409 forces every partner to write a branch for a situation their own retry logic created legitimately, and the ones who skip that branch either log an error and abandon the case or start minting fresh references to get past you. Keep the stored result available long enough to cover a queue replayed after an incident, not merely a socket timeout, and log that a repeat arrived so support can see it. The one repeat that deserves an error is the same reference sent with a materially different payload, which is a bug on the partner side rather than a retry.
What does storing partner-uploaded documents commit us to?
Custody, from the second the upload lands. Holding the bytes rather than a pointer makes you the retention owner: the file needs encryption at rest, scoping to the partner and merchant it belongs to, a stated retention period your contract can defend, and a deletion route that removes the document without breaking the case history referring to it. Plan for the volume too, because a book of certification files is mostly scans and it never shrinks — superseded copies stay retrievable, since the point of holding them is to answer questions about what was filed at the time.

Keep reading

Filing one application, or a hundred?

The platform is for teams running certifications for their own clients. If you only need your own business certified, our done-for-you service files it end to end at a published price.