Docs/API/Bind & Payment

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

  1. You receive an application.quoted webhook with a quote_id
  2. You call POST /api/v2/bind/ with the quote ID and contact details
  3. PGI creates a binding record with status pending_payment
  4. PGI sends premium financing details to the payment processor
  5. Payment processor confirms payment and sends a callback to PGI
  6. PGI transitions the binding to bound and publishes a policy.bound webhook 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

FieldTypeDescription
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

StatusMeaningWhat 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.