Checks a certificate of insurance (ACORD 25) against insurance requirements with CertifiKit's deterministic rules engine: coverage present, limits at or above the minimums, policies not expired or expiring too soon, and the required endorsements. Read the certificate yourself and pass what it shows; the verdict (pass, fail or needs_review) and a plain-English reason per requirement come from fixed rules, not a model. Anything unreported, unreadable or below 0.7 confidence is routed to needs_review, never silently passed. Use preset or the requirements object from build_insurance_requirements.
View input schema
{
"type": "object",
"properties": {
"preset": {
"type": "string",
"enum": [
"standard-subcontractor",
"property-vendor"
],
"description": "\"standard-subcontractor\" = Typical GC requirements for a trade sub: GL $1M/$2M, auto $1M, workers' comp $1M, additional insured + waiver of subrogation. \"property-vendor\" = Common requirements for service vendors at managed properties: GL $1M/$2M, workers' comp $500K, additional insured."
},
"requirements": {
"type": "object",
"description": "Custom requirements, e.g. the requirements object returned by build_insurance_requirements. Takes precedence over preset.",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 100
},
"generalLiability": {
"type": "object",
"properties": {
"required": {
"type": "boolean"
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": [
"required"
]
},
"autoLiability": {
"type": "object",
"properties": {
"required": {
"type": "boolean"
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": [
"required"
]
},
"umbrella": {
"type": "object",
"properties": {
"required": {
"type": "boolean"
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": [
"required"
]
},
"workersComp": {
"type": "object",
"properties": {
"required": {
"type": "boolean"
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
}
},
"required": [
"required"
]
},
"requireAdditionalInsured": {
"type": "boolean"
},
"requireWaiverOfSubrogation": {
"type": "boolean"
},
"requirePrimaryNonContributory": {
"type": "boolean"
},
"minDaysUntilExpiry": {
"type": "integer",
"minimum": 0,
"maximum": 365,
"description": "Fail policies expiring within this many days. 0 = fail only expired ones."
}
},
"required": [
"name",
"generalLiability",
"autoLiability",
"umbrella",
"workersComp",
"requireAdditionalInsured",
"requireWaiverOfSubrogation",
"requirePrimaryNonContributory",
"minDaysUntilExpiry"
]
},
"certificate": {
"type": "object",
"description": "What the certificate shows. Report only what is printed; do not infer. Leave out rows the certificate does not have.",
"properties": {
"insuredName": {
"type": [
"string",
"null"
]
},
"producer": {
"type": [
"string",
"null"
],
"description": "The issuing agent or broker."
},
"certificateHolder": {
"type": [
"string",
"null"
]
},
"generalLiability": {
"type": "object",
"description": "The Commercial General Liability row of the ACORD 25. Omit it if the certificate has no such row.",
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Each occurrence limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"autoLiability": {
"type": "object",
"description": "The Automobile Liability row of the ACORD 25. Omit it if the certificate has no such row.",
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Combined single limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"umbrella": {
"type": "object",
"description": "The Umbrella / Excess Liability row of the ACORD 25. Omit it if the certificate has no such row.",
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Each occurrence limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"workersComp": {
"type": "object",
"description": "The Workers' Compensation and Employers' Liability row of the ACORD 25. Omit it if the certificate has no such row.",
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Employers' liability each accident limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"additionalInsured": {
"type": "object",
"description": "Additional insured: from the ADDL INSD / SUBR WVD boxes, the description of operations, or an attached endorsement form.",
"properties": {
"present": {
"type": "boolean"
},
"formNumber": {
"type": [
"string",
"null"
],
"description": "Endorsement form number if printed, e.g. CG 20 10."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"waiverOfSubrogation": {
"type": "object",
"description": "Waiver of subrogation: from the ADDL INSD / SUBR WVD boxes, the description of operations, or an attached endorsement form.",
"properties": {
"present": {
"type": "boolean"
},
"formNumber": {
"type": [
"string",
"null"
],
"description": "Endorsement form number if printed, e.g. CG 20 10."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"primaryNonContributory": {
"type": "object",
"description": "Primary and non-contributory wording: from the ADDL INSD / SUBR WVD boxes, the description of operations, or an attached endorsement form.",
"properties": {
"present": {
"type": "boolean"
},
"formNumber": {
"type": [
"string",
"null"
],
"description": "Endorsement form number if printed, e.g. CG 20 10."
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
}
},
"required": [
"present"
]
},
"overallConfidence": {
"type": "number",
"minimum": 0,
"maximum": 1,
"description": "How legible and complete the whole document was, 0-1. Defaults to 1. Below 0.7, a pass becomes needs_review."
}
}
},
"asOf": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date to check expiry against, yyyy-mm-dd. Defaults to today."
}
},
"required": [
"certificate"
],
"additionalProperties": false
}