Predictable
Resource-oriented URLs, a stable { success, data } envelope.
Secure
Hashed API keys over TLS, per-key scopes, rate limits & quota.
Documented
A live OpenAPI 3.1 contract you can generate clients from.
Who can integrate
Access is gated on three independent axes — a call succeeds only when all three pass.
- • Paying. Keys can only be created on the Team plan, and every call re-checks that the account still has API access — a lapsed account is cut off automatically (
SUBSCRIPTION_INACTIVE). - • Approved. A key must be approved to integrate; a pending or suspended key is refused (
KEY_NOT_APPROVED). - • Scoped. Each endpoint requires a scope the key carries (
FORBIDDEN_SCOPEotherwise).
Quickstart
Get a key
On a Team plan, open Developer settings in-app and create an API key. The raw key (cg_live_…) is shown once — store it in your secrets manager. Send it as X-API-Key or Authorization: Bearer.
curl https://api.coverguard.io/api/v1/me \
-H "X-API-Key: $CG_KEY"{
"success": true,
"data": { "keyId": "…", "userId": "…", "scopes": ["insurability:read"] }
}Endpoints
Base URL https://api.coverguard.io. Full schemas in the OpenAPI document.
/api/v1/mescope: —Introspect the calling API key (id, owner, scopes). A credential health check.
/api/v1/properties/:id/insurabilityscope: insurability:readInsurability assessment derived from the property risk profile.
/api/v1/team/membersscope: team:readPull the company’s members + seat usage (HRIS / CRM / IdP sync).
/api/v1/team/membersscope: team:writeProvision a seat — invite a user by email with a role. PATCH/DELETE the same path to re-role or deprovision.
Webhooks
Register an HTTPS endpoint (Developer settings) to receive signed events. Every delivery carries an X-CoverGuard-Signature: t=…,v1=… header — verify HMAC-SHA256(secret, "{t}.{body}") against the raw body and reject timestamps older than 5 minutes.
| Event | Fires when |
|---|---|
quote_request.created | A binding quote request was created. |
quote_request.updated | A quote request changed status. |
deal.updated | A pipeline deal changed. |
property.saved | A property was saved. |
carrier.exit | A carrier stopped writing in a market. |
subscription.payment_failed | A renewal payment failed (dunning started). |
subscription.payment_recovered | A previously-failed payment recovered. |
team.member.invited | A user was provisioned under the company. |
team.member.updated | A member’s role changed. |
team.member.removed | A user was deprovisioned. |
{
"id": "…", // delivery id
"type": "carrier.exit",
"created": 1751430000, // unix seconds
"data": { /* event-specific */ }
}Errors
Errors use the same envelope with a stable error.code and a human message. Rate-limit responses set RateLimit-* and Retry-After headers.
| Status / code | Meaning | Remediation |
|---|---|---|
401 MISSING_API_KEY | No key on the request. | Send X-API-Key or Authorization: Bearer cg_live_… |
401 INVALID_API_KEY | Unknown or revoked key. | Check the value; rotate if compromised. |
403 KEY_NOT_APPROVED | Key is pending approval or suspended. | Contact CoverGuard to enable the key. |
403 SUBSCRIPTION_INACTIVE | Account has no active plan with API access. | Renew or upgrade to the Team plan. |
403 FORBIDDEN_SCOPE | Key lacks the required scope. | Re-issue the key with the scope it needs. |
429 RATE_LIMITED | Per-minute limit exceeded. | Back off; honor the Retry-After header. |
429 QUOTA_EXCEEDED | Monthly quota used up. | Wait for the reset or raise the quota. |
Versioning
- • The API is versioned in the path (
/api/v1). Pin a version and upgrade deliberately. - • Additive changes (new fields, new endpoints) can ship within a version — ignore unknown fields.
- • Breaking changes get a new version path and a migration window.
Ready to integrate?
Create keys in-app on the Team plan, or talk to us about production partner access.