Docs/API/Applications & Quotes

Applications & Quotes

Submit a full insurance application. PGI reviews the application and submits it to underwriters. You receive a quote via webhook when approved.

How the quote flow works

  1. You submit an application via POST /api/v2/applications/
  2. PGI reviews the application internally and submits to underwriters
  3. Underwriters approve or decline the application
  4. If approved: PGI sends an application.quoted webhook to your registered URL with quote details
  5. If declined: PGI sends an application.declined webhook
  6. Once you receive a quote, you can proceed to bind the policy
Async flow Unlike the pre-approval score (which returns instantly), quotes require manual underwriter review. Plan your integration around webhook delivery rather than synchronous API responses.

Submit application

POST /api/v2/applications/

Creates an application record linked to your partner account. The request body uses a single form_data object with all application answers keyed by question ID. No top-level fields are required.

Request body

FieldTypeDescription
form_datarequired object Application answers keyed by question ID. All required fields must be present and non-empty or the request returns 400.

Required form_data fields for Canadian applications

When submitting a Canadian application (q0_country = "Canada"), the following fields are required:

Question IDQuestion TextTypeAllowed Values/Format
q0_country Country where the loan was issued button "Canada" or "USA"
q2_full_name Full legal name of the guarantor (the named insured) string Non-empty text
q4_date_of_birth Guarantor date of birth (identity and KYC) date YYYY-MM-DD format
q7_email Guarantor email address (the email of the individual giving the personal guarantee). Used by PGI for records and communications. Not shared with the underwriter. email Valid email address
q5_residential_address Guarantor residential address (policy documents and regulatory compliance) string or object Free-text string or structured object with postal_code
q15_business_legal_name Business legal name (must match loan documents) string Non-empty text
q17_business_operating_address Business operating address (should include postal code) string or object Non-empty text or structured object with postal_code
q25_naics_code NAICS industry classification code (risk tiering) string Valid NAICS code mappable to Purbeck sector
q26_formation_date Business formation date (drives business-age rules) date YYYY-MM-DD, YYYY-MM, or text like "June 2015"
q41_loan_amount The loan balance the guarantor is obligated to pay (do not combine multiple loans) currency Number, maximum 1,000,000 CAD
q42_pgi_limit The sum insured (total insured amount of coverage requested). PGI pays the insured guarantor, not the lender. currency Number, maximum 1,000,000 CAD
q_ca_id_type Government ID type dropdown "Passport", "National ID", "Driving Licence", "Other"
q_ca_id_number Government ID number (exactly as it appears on the document) string Non-empty text
q_ca_loan_type Type of loan being insured dropdown "Asset Finance", "Invoice Finance", "Commercial Mortgage", "Other Secured Loan", "Unsecured Loan", "Other"
q_ca_loan_type_other Short free-text description of the loan type. Required when q_ca_loan_type is "Other"; omit or leave blank otherwise. string Non-empty text (required when q_ca_loan_type is "Other")
Optional fields The API accepts additional optional fields (e.g. q8_phone, q9_citizenship_status, q51_interest_rate_type, q69_personal_guarantee, q39_lender_name, q46_loan_purpose, q77_other_guarantors) but they are not required. Focus on the required fields listed above.

Declarations (11 required sections)

All 11 declaration sections must be answered. When an answer is adverse (shown below), a matching <key>_reason field is required.

Declaration KeyQuestion TextAnswer ValuesReason Required When
section_1_a Does the business carry insurance coverage for all physical assets covered by the personal guarantee? "yes" or "no" Never (no reason required)
section_1_2 Have you ever declared personal bankruptcy? "yes" or "no" Answer is "yes"
section_2_a Have you ever been barred from serving as a Director, or are you currently under investigation that could result in being barred? "yes" or "no" Answer is "yes"
section_2_b Have you ever been a Director of a company that has gone through bankruptcy, receivership, or restructuring proceedings? "yes" or "no" Answer is "yes"
section_2_c Have you ever been a Director of a company that has been under investigation by the Canada Revenue Agency or the Canada Border Services Agency? "yes" or "no" Answer is "yes"
section_2_d Do you currently have any actual or contingent liability that you will not be able to pay within 30 days of when it becomes due? "yes" or "no" Answer is "yes"
section_3_a Does the business currently have any bad or doubtful debts owed to it that are likely to materially affect its ability to pay liabilities as they become due? "yes" or "no" Answer is "yes"
section_4_a Has the business lost a significant investor, customer, or supplier in the last 6 months? "yes" or "no" Answer is "yes"
section_5_a Are you aware of any information that could materially affect the business's ability to meet its obligations over the next 6 months? "yes" or "no" Answer is "yes"
section_6_a As of today, is the company solvent (able to pay its debts as they become due)? "yes" or "no" Never (no reason required)
section_3_c I confirm that all answers above are true to the best of my knowledge. If anyone else completed this form on my behalf, I confirm they were authorized to do so and that their answers are accurate. "Agree" or "Disagree" Answer is "Disagree"
Declaration adverse answers and reasons When a director declares "yes" to any declaration except section_3_c, a matching reason field is mandatory. For example, if section_1_2 (bankruptcy) is "yes", the request must include section_1_2_reason with a detailed explanation. If the reason is missing, the request returns 400.
Quebec not supported PGI does not currently write business in Quebec. If q_business_province is "QC" or the business operating address is in Quebec, the submission returns 400.

Response

201 Created
{
  "application_id": "D4E5F6A1B2C3789012345678EF",
  "status": "received",
  "message": "Application received. Pending quote from underwriters."
}
What happens next After submitting, your application enters PGI's underwriting pipeline. You will receive an application.quoted or application.declined webhook at your registered URL. See Webhooks for payload details.

Example (Canada)

curl -X POST https://api.pgicover.com/api/v2/applications/ \
  -H "Authorization: Bearer pk_test_abc123def456ghi789jkl012mno345" \
  -H "Content-Type: application/json" \
  -d '{
    "form_data": {
      "q0_country": "Canada",
      "q2_full_name": "Sarah Chen",
      "q4_date_of_birth": "1985-06-15",
      "q7_email": "[email protected]",
      "q5_residential_address": "456 Oak Avenue, Toronto, ON M4V 2P7, Canada",
      "q_ca_id_type": "Driving Licence",
      "q_ca_id_number": "DL123456789",
      "q15_business_legal_name": "Maple Leaf Technologies Inc.",
      "q25_naics_code": "541511",
      "q26_formation_date": "2019-03-15",
      "q17_business_operating_address": "789 King Street West, Toronto, ON M5H 2A9, Canada",
      "q41_loan_amount": 500000,
      "q42_pgi_limit": 250000,
      "q_ca_loan_type": "Commercial Mortgage",
      "section_1_a": "yes",
      "section_1_2": "yes",
      "section_1_2_reason": "Voluntary bankruptcy discharge in 2018, fully resolved with creditors.",
      "section_2_a": "no",
      "section_2_b": "no",
      "section_2_c": "no",
      "section_2_d": "no",
      "section_3_a": "no",
      "section_4_a": "no",
      "section_5_a": "no",
      "section_6_a": "yes",
      "section_3_c": "Agree"
    }
  }'
import requests

resp = requests.post(
    "https://api.pgicover.com/api/v2/applications/",
    headers={"Authorization": "Bearer pk_test_abc123def456ghi789jkl012mno345"},
    json={
        "form_data": {
            "q0_country": "Canada",
            "q2_full_name": "Sarah Chen",
            "q4_date_of_birth": "1985-06-15",
            "q7_email": "[email protected]",
            "q5_residential_address": "456 Oak Avenue, Toronto, ON M4V 2P7, Canada",
            "q_ca_id_type": "Driving Licence",
            "q_ca_id_number": "DL123456789",
            "q15_business_legal_name": "Maple Leaf Technologies Inc.",
            "q25_naics_code": "541511",
            "q26_formation_date": "2019-03-15",
            "q17_business_operating_address": "789 King Street West, Toronto, ON M5H 2A9, Canada",
            "q41_loan_amount": 500000,
            "q42_pgi_limit": 250000,
            "q_ca_loan_type": "Commercial Mortgage",
            "section_1_a": "yes",
            "section_1_2": "yes",
            "section_1_2_reason": "Voluntary bankruptcy discharge in 2018, fully resolved with creditors.",
            "section_2_a": "no",
            "section_2_b": "no",
            "section_2_c": "no",
            "section_2_d": "no",
            "section_3_a": "no",
            "section_4_a": "no",
            "section_5_a": "no",
            "section_6_a": "yes",
            "section_3_c": "Agree",
        },
    },
)
data = resp.json()
print(f"Application {data['application_id']}: {data['message']}")
# Now wait for the application.quoted webhook...
const resp = await fetch("https://api.pgicover.com/api/v2/applications/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer pk_test_abc123def456ghi789jkl012mno345",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    form_data: {
      q0_country: "Canada",
      q2_full_name: "Sarah Chen",
      q4_date_of_birth: "1985-06-15",
      q7_email: "[email protected]",
      q5_residential_address: "456 Oak Avenue, Toronto, ON M4V 2P7, Canada",
      q_ca_id_type: "Driving Licence",
      q_ca_id_number: "DL123456789",
      q15_business_legal_name: "Maple Leaf Technologies Inc.",
      q25_naics_code: "541511",
      q26_formation_date: "2019-03-15",
      q17_business_operating_address: "789 King Street West, Toronto, ON M5H 2A9, Canada",
      q41_loan_amount: 500000,
      q42_pgi_limit: 250000,
      q_ca_loan_type: "Commercial Mortgage",
      section_1_a: "yes",
      section_1_2: "yes",
      section_1_2_reason: "Voluntary bankruptcy discharge in 2018, fully resolved with creditors.",
      section_2_a: "no",
      section_2_b: "no",
      section_2_c: "no",
      section_2_d: "no",
      section_3_a: "no",
      section_4_a: "no",
      section_5_a: "no",
      section_6_a: "yes",
      section_3_c: "Agree",
    },
  }),
});
const data = await resp.json();
console.log(`Application ${data.application_id}: ${data.message}`);
// Now wait for the application.quoted webhook...

Retrieve quote

GET /api/v2/quotes/{quote_id}/

Retrieve an existing quote and its current status. The quote_id is included in the application.quoted webhook payload. Use this endpoint to check whether a quote is still valid before binding.

Flexible lookup This endpoint accepts either the internal quote_id (PGI's reference) or the underwriter_ref (the external London/underwriter reference). It tries quote_id first, then falls back to underwriter_ref.

Response

200 OK
{
  "quote_id": "E5F6A1B2C3D4789012345678AA",
  "underwriter_ref": "LON-2026-04-00412",
  "annual_premium": "5000.00",
  "rate": "2.000",
  "coverage_amount": "250000.00",
  "valid_until": "2026-05-03T15:05:44Z",
  "quote_status": "active"
}
Two reference numbers quote_id is PGI's internal reference. underwriter_ref is the external reference assigned by the London/underwriting market. When communicating with PGI or clients, use the underwriter_ref. Note that underwriter_ref may be empty initially if the underwriter has not yet assigned a reference.

Quote statuses

StatusMeaning
activeQuote is valid and can be bound.
expiredPast the 30-day validity window. Contact PGI for a new quote.
boundThis quote has been bound to a policy.