Bind Policy & Payment
Turn an accepted quote into a bound policy. Payment is processed through our payment processor -- not through this API directly.
Prerequisite
Before you can bind, you need a
quote_id. Quotes are delivered via the application.quoted webhook after underwriter approval. See Applications & Quotes for the full flow.
How the flow works
- You receive an
application.quotedwebhook with aquote_id - You call
POST /api/v2/bind/with the quote ID and contact details - PGI creates a binding record with status
pending_payment - PGI sends premium financing details to the payment processor
- Payment processor confirms payment and sends a callback to PGI
- PGI transitions the binding to
boundand publishes apolicy.boundwebhook to your registered URL
Info
Payment is not handled via Stripe or any card-on-file system. Our payment processor handles premium financing directly with the insured. Your integration does not need to collect payment details.
Bind a policy
POST
/api/v2/bind/
Request body
| Field | Type | Description |
|---|---|---|
| quote_idrequired | string | The quote ID to bind. Accepts either the internal quote_id or the external underwriter_ref. Must be active (not expired or already bound). |
| effective_daterequired | string | Policy effective date in YYYY-MM-DD format. Cannot be in the past. |
| contact_namerequired | string | Full name of the primary contact for the policy. |
| contact_emailrequired | string | Email address for policy correspondence. |
| contact_phonerequired | string | Phone number for the primary contact. |
| signaturerequired | string | Base64-encoded signature image (PNG or JPEG). This serves as the binding agreement signature. |
Response
201 Created
{
"binding_id": "F6A1B2C3D4E5789012345678BB",
"quote_id": "E5F6A1B2C3D4789012345678AA",
"application_id": "D4E5F6A1B2C3789012345678EF",
"status": "pending_payment",
"effective_date": "2026-04-15",
"contact_name": "Sarah Chen",
"contact_email": "[email protected]",
"created_at": "2026-04-03T16:12:08Z"
}
Example
curl -X POST https://api.pgicover.com/api/v2/bind/ \
-H "Authorization: Bearer pk_test_abc123def456ghi789jkl012mno345" \
-H "Content-Type: application/json" \
-d '{
"quote_id": "E5F6A1B2C3D4789012345678AA",
"effective_date": "2026-04-15",
"contact_name": "Sarah Chen",
"contact_email": "[email protected]",
"contact_phone": "+1-416-555-0198",
"signature": "iVBORw0KGgoAAAANSUhEUgAA..."
}'
import base64
# Read signature image
with open("signature.png", "rb") as f:
sig_b64 = base64.b64encode(f.read()).decode()
resp = requests.post(
"https://api.pgicover.com/api/v2/bind/",
headers={"Authorization": "Bearer pk_test_abc123def456ghi789jkl012mno345"},
json={
"quote_id": "E5F6A1B2C3D4789012345678AA",
"effective_date": "2026-04-15",
"contact_name": "Sarah Chen",
"contact_email": "[email protected]",
"contact_phone": "+1-416-555-0198",
"signature": sig_b64,
},
)
binding = resp.json()
print(f"Binding {binding['binding_id']}: {binding['status']}")
// Convert signature to base64
const sigBuffer = await fs.readFile("signature.png");
const sigB64 = sigBuffer.toString("base64");
const resp = await fetch("https://api.pgicover.com/api/v2/bind/", {
method: "POST",
headers: {
"Authorization": "Bearer pk_test_abc123def456ghi789jkl012mno345",
"Content-Type": "application/json",
},
body: JSON.stringify({
quote_id: "E5F6A1B2C3D4789012345678AA",
effective_date: "2026-04-15",
contact_name: "Sarah Chen",
contact_email: "[email protected]",
contact_phone: "+1-416-555-0198",
signature: sigB64,
}),
});
const binding = await resp.json();
console.log(`Binding ${binding.binding_id}: ${binding.status}`);
Status transitions
| Status | Meaning | What happens next |
|---|---|---|
| pending_payment | Binding created, awaiting payment confirmation. | Payment processor confirms and sends callback to PGI. |
| bound | Payment confirmed. Policy is active. | You receive a policy.bound webhook. Policy PDF is available. |
| failed | Payment failed or was declined by payment processor. | Contact PGI support. A new binding may need to be created. |
Payment processor callback
This is an internal webhook between PGI and our payment processor. You do not need to implement or handle this endpoint. It's documented here for transparency.
When the payment processor confirms payment, they POST to:
POST
/api/v2/webhooks/fif-callback/
This transitions the binding to bound and triggers the policy.bound webhook event to your registered URL. See Webhooks for details on receiving this event.
Tip
In sandbox mode, the payment callback is simulated automatically. Bindings transition to
bound within a few seconds so you can test the full flow without waiting for real payment processing.