Uploads a new Certificate of Insurance (COI) PDF file, validates it, and creates a certificate record. The certificate processing is performed asynchronously in the background. The initial response indicates that the certificate has been accepted for processing with a status of "pending".
Asynchronous Processing:
After uploading a certificate, the platform automatically processes the document and evaluates it against your organization's pre-defined insurance requirements. This evaluation happens asynchronously, so the initial response will have:
status: "pending" (indicating processing has not yet started)review_results:null(will be populated once processing completes)
Monitoring Certificate Status:
You can monitor the certificate status in two ways:
Polling: Periodically retrieve the certificate using the GET endpoint to check the
statusfield. The status will transition from "pending" → "processing" → ("approved" | "flagged" | "denied" | "error") as processing completes.Webhooks: Register a webhook endpoint to receive real-time notifications when processing completes. The following events are sent:
certificate.approved- Certificate passed all requirementscertificate.flagged- Certificate failed some requirementscertificate.denied- Certificate was denied
Retrieving Review Results:
Once processing is complete, use the expand[]=review_results parameter when
retrieving the certificate to get abbreviated review results, or
expand[]=review_results.full for complete details including parsed certificate
data and detailed audit results.
Submitting certificate data instead of a file:
When the certificate was read somewhere you cannot forward the file from (an
AI assistant looking at a screenshot, for example), send application/json
with the fields read off the certificate as certificate — the same shape
review_results.full returns as parsed_certificate_json. The record is
created with source "assistant" and no pdf_url, and is reviewed against
the same insurance requirements. Check the data first with
POST /files/certificates/evaluate, which reviews without creating anything.
Body
-
The fields read off the certificate:
insured,certificate_holder,authorized_representative_signature_present,description_of_operationsandcoverageskeyed by coverage type (commercial_general_liability,automobile_liability,excess_umbrella_liability,workers_compensation,professional_liability,cyber_liability,criminal_liability,liquor_liability), each withinsurer_letter,policy_number_string,policy_effective_date,policy_expiration_date(MM/DD/YYYY),addl_insd,subr_wvdandlimits. -
The ID of the contractor associated with the certificate.
-
Optional. Review against the requirement tied to this entity (en_…).
-
Optional. A name for the record, e.g. the dropped file's name.
-
Optional. Review against this requirement (ir_…) instead of the default one.
-
Optional. Field paths a person supplied rather than the document, e.g.
coverages.workers_compensation.policy_expiration_date.
curl \
--request POST 'https://api.1099policy.com/api/v1/files/certificates' \
--header "Content-Type: application/json" \
--data '{
"certificate": {},
"contractor": "string",
"entity": "string",
"filename": "string",
"insurance_requirement": "string",
"user_provided": [
"string"
]
}'
curl \
--request POST 'https://api.1099policy.com/api/v1/files/certificates' \
--header "Content-Type: multipart/form-data" \
--form "certificate=@file" \
--form "contractor=string"
{
"certificate": {},
"contractor": "string",
"entity": "string",
"filename": "string",
"insurance_requirement": "string",
"user_provided": [
"string"
]
}
{
"contractor": "cn_xyz789",
"created": 1646818364,
"filename": "certificate_of_insurance.pdf",
"id": "ci_abc123",
"pdf_url": "https://storage.example.com/certificates/ci_abc123.pdf",
"review_results": {
"audit_results": [
{
"created": 42,
"id": "car_result123",
"manually_approved": true,
"message": "string",
"result": "pass",
"rule_name": "CGL Limits",
"rule_path": "coverages.commercial_general_liability.limits"
}
],
"created": 42,
"id": "ca_audit123",
"parsed_certificate_json": {},
"status": "pending",
"summary": {
"failed": 0,
"passed": 5,
"total_rules": 5
},
"updated": 42
},
"status": "pending",
"updated": 1646818364
}