This page walks the canonical happy path for a partner integration. Use it as a checklist when designing your integration’s state machine.Documentation Index
Fetch the complete documentation index at: https://docs.zestequity.com/llms.txt
Use this file to discover all available pages before exploring further.
High-level sequence
Mermaid alternative
Where the partner waits
Two synchronous gates can take significant wall-clock time:- SPV approval. Between
spv_request.createdandspv_request.completedthere is human review. Plan your UI to surface “pending review” to your operator and rely on the webhook to advance the flow. - Subscription completion. Between
funding_receipt.uploadedandsubscription.completedZest reconciles the wire. This is also human-paced.
Where uploads block each other
Within a single subscription:formsMUST succeed beforefundings. Out-of-order uploads return409 conflict.- Both endpoints accept files up to 10 MB and only PDF / JPEG / PNG / WEBP.
Failure handling cheatsheet
| Failure | Where | What to do |
|---|---|---|
Network timeout on a POST | Synchronous request | Retry with the same Idempotency-Key. |
409 conflict on Idempotency-Key | Synchronous request | Either replay the original body, or generate a fresh key. |
400 validation_error | Synchronous request | Inspect validationErrors[], fix the row, resubmit. |
409 conflict on fundings | Synchronous request | Forms haven’t been uploaded yet. Upload form first. |
5xx from Zest | Synchronous request | Exponential backoff, cite errorId if persistent. |
| Webhook receipt | Async | Verify signature → dedup eventId → process. |
| Webhook receipt timeout | Async | Zest re-delivers per the retry schedule; idempotency on your side is mandatory. |
Suggested data model on the partner side
For each Zest resource you should store, at minimum:spv_request.{slug, status, materialisedRefs}keyed by your local intent id.investors.{partnerInvestorId, zestPersonId}mapping table.subscriptions.{subscriptionSlug, partnerSubscriptionId, personId, spvSlug, status}per investor + SPV.webhook_events.{eventId, eventType, occurredAt}for dedup + audit.