Docs/API

Partner Integration API

Embed PGI's scoring engine, quoting, policy binding, claims, and support directly into your platform. One API key, one base URL, full lifecycle coverage.

Who is this for?

The Partner API is built for platforms that want to offer Personal Guarantee Insurance without sending users to a separate website. If you're building any of these, this is for you:

Get started now
Get a Free Sandbox Key

What you can do

Base URL

https://api.pgicover.com/api/v2/

All endpoints are under this base. Append the resource path to this URL.

Authentication

Every request requires a Bearer token in the Authorization header. You'll get an API key when your partner account is provisioned.

HTTP Header
Authorization: Bearer pk_live_abc123def456ghi789jkl012mno345

Key prefixes

PrefixEnvironmentBehavior
pk_test_* Sandbox Real scoring results, but no production records are created. Data is isolated from live workflows.
pk_live_* Production Creates real applications, quotes, policies, and claims visible to PGI underwriters.
Info Your API key is shown once at creation and stored hashed. It cannot be recovered -- only revoked and re-issued. Keep it in a secret manager, not in source code.

Sandbox mode

Use a pk_test_* key to build and test your integration. Sandbox mode hits the same endpoints as production, but:

Tip Test both scoring outcomes using these NAICS codes in sandbox: 541511 (approve), 721110 (decline). Pair with the sample payloads in the CORE Score docs.

Rate limiting

Every response includes rate limit headers so you can track your usage:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per hour
X-RateLimit-RemainingRequests remaining in the current window
X-RateLimit-ResetUnix timestamp when the window resets

Default limits:

When you exceed the limit, you'll receive a 429 Too Many Requests response with a Retry-After header (in seconds).

Error responses

All errors follow the same shape:

JSON
{
  "error": {
    "code": "invalid_request",
    "message": "The loan_amount field is required.",
    "details": {
      "loan_amount": ["This field is required."]
    }
  }
}

Common error codes

HTTP StatusCodeMeaning
400invalid_requestMissing or invalid fields in the request body
401authentication_failedMissing, invalid, or revoked API key
403forbiddenValid key, but no access to this resource (tenant isolation)
404not_foundResource does not exist or belongs to another partner
429rate_limitedToo many requests. Check Retry-After header.
500internal_errorSomething broke on our end. Contact support.

Quick start

Make your first API call in under a minute. This scores a sample borrower:

curl -X POST https://api.pgicover.com/api/v2/score/ \
  -H "Authorization: Bearer pk_test_abc123def456ghi789jkl012mno345" \
  -H "Content-Type: application/json" \
  -d '{
    "country": "CA",
    "naics_code": "541511",
    "formation_date": "2019-03-15",
    "loan_amount": 500000,
    "pgi_limit": 250000,
    "annual_revenue": 2000000,
    "ebitda": 400000,
    "total_debt": 300000,
    "monthly_debt_service": 8000,
    "collateral_value": 600000,
    "enterprise_value": 3000000
  }'
import requests

resp = requests.post(
    "https://api.pgicover.com/api/v2/score/",
    headers={
        "Authorization": "Bearer pk_test_abc123def456ghi789jkl012mno345",
    },
    json={
        "country": "CA",
        "naics_code": "541511",
        "formation_date": "2019-03-15",
        "loan_amount": 500000,
        "pgi_limit": 250000,
        "annual_revenue": 2000000,
        "ebitda": 400000,
        "total_debt": 300000,
        "monthly_debt_service": 8000,
        "collateral_value": 600000,
        "enterprise_value": 3000000,
    },
)
print(resp.json())
const resp = await fetch("https://api.pgicover.com/api/v2/score/", {
  method: "POST",
  headers: {
    "Authorization": "Bearer pk_test_abc123def456ghi789jkl012mno345",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    country: "CA",
    naics_code: "541511",
    formation_date: "2019-03-15",
    loan_amount: 500000,
    pgi_limit: 250000,
    annual_revenue: 2000000,
    ebitda: 400000,
    total_debt: 300000,
    monthly_debt_service: 8000,
    collateral_value: 600000,
    enterprise_value: 3000000,
  }),
});
const data = await resp.json();
console.log(data);

A successful response looks like this:

Response -- 200 OK
{
  "score_id": "A1B2C3D4E5F6789012345678AB",
  "score": 83,
  "decision": "approve",
  "country": "CA",
  "naics_code": "541511",
  "created_at": "2026-04-03T14:22:31Z"
}
Next step Once you have a passing score, submit a full application and generate a quote. See Applications & Quotes.