This prompt is designed for risk management and compliance engineers who need to extract structured insurance and risk allocation data from contracts at scale. The job-to-be-done is isolating specific provisions—required insurance types, coverage minimums, additional insured requirements, and waiver of subrogation language—and mapping them into a predictable, machine-readable schema. The ideal user is building or maintaining a contract review system where downstream processes, such as a vendor risk management platform or an underwriting checklist, consume these extracted fields automatically. The prompt assumes the input is a clean, machine-readable text block from a commercial agreement, such as an MSA, SOW, or vendor services contract.
Prompt
Insurance and Risk Allocation Clause Extraction Prompt

When to Use This Prompt
Defines the specific job, ideal user, and operational boundaries for the Insurance and Risk Allocation Clause Extraction Prompt.
Do not use this prompt when you need a full-contract risk summary or a legal opinion on coverage adequacy. It is not designed for interpreting umbrella policies, reconciling conflicting clauses across multiple documents, or providing advice on whether a coverage limit is 'market standard.' The prompt is a surgical extraction tool, not a negotiation advisor. It also should not be used on scanned documents without prior OCR processing, as layout artifacts and recognition errors will degrade the accuracy of numeric coverage amount extraction and the detection of specific legal phrases like 'primary and non-contributory.'
Before deploying this prompt, ensure your pipeline can validate the output against a strict schema. Coverage amounts must be normalized to a single currency and numeric format. Boolean fields for 'additional insured' and 'waiver of subrogation' must be explicitly true, false, or null, with null indicating the provision is absent from the text. If the prompt is used in a regulated or high-risk procurement workflow, route all extractions with a confidence score below a defined threshold for human review. The next step is to copy the prompt template, adapt the [OUTPUT_SCHEMA] to your system's contract, and run it against a golden dataset of 20-30 known clauses to establish baseline accuracy before production use.
Use Case Fit
Where the Insurance and Risk Allocation Clause Extraction Prompt works and where it introduces unacceptable risk.
Good Fit: Structured Insurance Exhibits
Use when: extracting coverage types, limits, and additional insured language from dedicated insurance exhibits or schedules with clear section headers. Guardrail: Validate extracted dollar amounts against a numeric schema and flag any coverage line where the limit field is null.
Bad Fit: Unstructured Broker Emails
Avoid when: parsing informal email threads or broker correspondence where coverage requirements are discussed conversationally rather than stated in contractual language. Guardrail: Route unstructured communications to a separate summarization prompt before attempting structured extraction.
Required Inputs
What you need: a contract or insurance exhibit with identifiable coverage sections, policy limit language, and additional insured or waiver of subrogation provisions. Guardrail: If the document lacks section headers or uses scanned images without OCR, preprocess with layout-aware extraction before invoking this prompt.
Operational Risk: Primary/Non-Contributory Misclassification
What to watch: the model may extract 'additional insured' status but miss whether coverage is primary and non-contributory, which changes the risk allocation entirely. Guardrail: Add a dedicated boolean field for primary_non_contributory and require explicit evidence citation or null if language is absent.
Operational Risk: Coverage Amount Normalization
What to watch: aggregate vs. per-occurrence limits, combined single limits, and umbrella/excess layer stacking can be extracted as a single number without qualifiers. Guardrail: Use a structured schema that separates limit_amount, limit_type, and limit_basis fields, and validate that each extracted amount has a type label.
Operational Risk: Missing Waiver of Subrogation
What to watch: the model may confidently report that a waiver of subrogation is absent when it is embedded in a general conditions section rather than the insurance exhibit. Guardrail: Run a secondary cross-reference check across the full document before finalizing the waiver_of_subrogation_present field as false.
Copy-Ready Prompt Template
A reusable prompt template with square-bracket placeholders for extracting insurance and risk allocation clauses from contracts.
This prompt template is designed to extract structured insurance and risk allocation data from contract text. It uses square-bracket placeholders that you replace with your actual contract text, output schema, and operational constraints before sending the prompt to a model. The template forces the model to return valid JSON with explicit null handling for missing fields, making it safe to wire directly into a contract review pipeline.
textYou are a contract analysis assistant specialized in insurance and risk allocation clauses. Your task is to extract structured information from the provided contract text. Return ONLY valid JSON matching the output schema. If a field is not present or cannot be determined, use null. Do not invent or infer values. ## INPUT Contract Text: [CONTRACT_TEXT] ## OUTPUT SCHEMA Return a JSON object with the following structure: { "insurance_requirements": [ { "insurance_type": "string | null", "minimum_coverage_amount": { "value": "number | null", "currency": "string | null", "per_occurrence_or_aggregate": "string | null" }, "additional_insured_required": "boolean | null", "additional_insured_entity": "string | null", "waiver_of_subrogation": "boolean | null", "primary_non_contributory": "boolean | null", "evidence_required": "string | null", "carrier_rating_requirement": "string | null", "source_citation": "string | null" } ], "indemnification_provisions": [ { "indemnifying_party": "string | null", "indemnified_party": "string | null", "scope": "string | null", "carve_outs": ["string"], "survival_period": "string | null", "source_citation": "string | null" } ], "risk_allocation_notes": { "limitation_of_liability_cap": "string | null", "consequential_damages_exclusion": "boolean | null", "liquidated_damages": "string | null", "source_citation": "string | null" }, "extraction_metadata": { "clauses_found": ["string"], "missing_expected_clauses": ["string"], "confidence_notes": "string | null" } } ## CONSTRAINTS - Return ONLY the JSON object. No markdown fences, no explanatory text. - Use null for any field where the information is absent or ambiguous. - For source_citation fields, quote the exact sentence or clause text that supports the extraction. - If the contract contains no insurance or risk allocation clauses, return empty arrays and null values with a confidence note explaining the absence. - Do not interpret silence as coverage. If a waiver of subrogation is not explicitly stated, set it to null. - For coverage amounts, extract the numeric value and currency. Normalize "$2 million" to {"value": 2000000, "currency": "USD"}. - Flag any contradictory or ambiguous language in confidence_notes. ## EXAMPLES Input: "Contractor shall maintain Commercial General Liability insurance with limits of not less than $1,000,000 per occurrence and $2,000,000 aggregate. Owner shall be named as additional insured. Contractor waives all rights of subrogation against Owner." Output: { "insurance_requirements": [ { "insurance_type": "Commercial General Liability", "minimum_coverage_amount": { "value": 1000000, "currency": "USD", "per_occurrence_or_aggregate": "per occurrence" }, "additional_insured_required": true, "additional_insured_entity": "Owner", "waiver_of_subrogation": true, "primary_non_contributory": null, "evidence_required": null, "carrier_rating_requirement": null, "source_citation": "Contractor shall maintain Commercial General Liability insurance with limits of not less than $1,000,000 per occurrence and $2,000,000 aggregate." } ], "indemnification_provisions": [], "risk_allocation_notes": { "limitation_of_liability_cap": null, "consequential_damages_exclusion": null, "liquidated_damages": null, "source_citation": null }, "extraction_metadata": { "clauses_found": ["insurance_requirements"], "missing_expected_clauses": ["indemnification_provisions", "risk_allocation_notes"], "confidence_notes": "Only insurance requirements found. No indemnification or liability cap language present in provided text." } } ## RISK LEVEL [HIGH_RISK: true]
To adapt this template, replace [CONTRACT_TEXT] with the full text of the contract section or clause you are analyzing. If your use case requires different insurance types or additional fields such as professional liability or cyber insurance, extend the insurance_requirements array schema. The extraction_metadata block is critical for production pipelines because it tells downstream systems which clauses were found and which were expected but absent, preventing silent failures when a contract lacks standard provisions.
Before deploying this prompt, run it against a golden dataset of at least 20 contracts with known insurance and indemnification provisions. Measure precision and recall on coverage amount extraction, additional insured detection, and waiver of subrogation identification. Pay special attention to false negatives on primary/non-contributory language, which is often implied rather than explicit. If your model consistently misses this field, add a few-shot example demonstrating the language patterns that indicate primary/non-contributory status. Always require human review for contracts above a materiality threshold, and log every extraction with its confidence notes for auditability.
Prompt Variables
Required inputs for the Insurance and Risk Allocation Clause Extraction Prompt. Each placeholder must be populated before the prompt is sent to the model. Validation notes describe how to check the input quality before execution.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[CONTRACT_TEXT] | Full text of the contract or section to analyze for insurance and risk allocation clauses | Section 8. Insurance. Contractor shall maintain Commercial General Liability insurance with limits of not less than $2,000,000 per occurrence... | Must be non-empty string. Check character length is within model context window. Strip non-printable characters. If OCR source, verify text quality score above 0.85 before extraction. |
[EXTRACTION_TARGETS] | List of specific insurance provisions to extract, ordered by priority | ["required_insurance_types", "minimum_coverage_amounts", "additional_insured_status", "waiver_of_subrogation", "primary_non_contributory_language"] | Must be valid JSON array of strings. Each target must match a known extraction category. Reject unknown targets. Empty array triggers full extraction mode with all categories. |
[COVERAGE_THRESHOLDS] | Minimum dollar amounts that trigger high-value flagging for downstream review | {"general_liability": 1000000, "auto_liability": 1000000, "umbrella_excess": 5000000} | Must be valid JSON object with numeric values. Null allowed if no threshold comparison needed. Values must be positive integers. Currency assumed USD unless [CURRENCY] placeholder overrides. |
[JURISDICTION] | Governing jurisdiction for the contract, used to flag jurisdiction-specific insurance requirements | "California" | Must be non-empty string. Validate against known jurisdiction list. Null allowed if jurisdiction is unknown or not specified in contract. Used to activate jurisdiction-specific validation rules for required coverage types. |
[OUTPUT_SCHEMA] | JSON Schema definition that the extracted clauses must conform to | {"type": "object", "properties": {"insurance_requirements": {"type": "array", "items": {"type": "object", "properties": {"coverage_type": {"type": "string"}, "minimum_limit": {"type": "number"}, "additional_insured": {"type": "boolean"}, "waiver_of_subrogation": {"type": "boolean"}, "primary_non_contributory": {"type": "boolean"}, "source_citation": {"type": "string"}}}}}} | Must be valid JSON Schema draft-07 or later. Schema must include source_citation field for every extracted provision. Validate schema parse before prompt execution. Reject schemas without required citation fields. |
[CONFIDENCE_THRESHOLD] | Minimum confidence score for extracted fields to be included in output without flagging for human review | 0.85 | Must be float between 0.0 and 1.0. Default 0.85 if not specified. Fields below threshold must be included with low_confidence flag set to true and routed to human review queue. |
[ADDITIONAL_INSURED_ENTITIES] | List of entity names to check for additional insured status in the contract | ["Project Owner", "Lender", "Property Manager"] | Must be valid JSON array of strings or null. If provided, prompt must check whether each entity is named as additional insured. If null, prompt extracts all additional insured entities found in contract text. |
[CURRENCY] | Currency code for coverage amount normalization | "USD" | Must be valid ISO 4217 currency code. Default USD if not specified. Used to normalize extracted coverage amounts. If contract contains amounts in multiple currencies, flag for manual review. |
Implementation Harness Notes
How to wire the insurance clause extraction prompt into a production contract review pipeline with validation, retries, and human review gates.
This prompt is designed to be called as a single-pass extraction step within a larger document processing pipeline. The typical integration pattern is: (1) ingest and segment the contract into sections, (2) route each section through a classification step to identify insurance-related clauses, (3) pass only those candidate sections to this extraction prompt, and (4) validate the structured output before writing to your contract database. Avoid sending an entire 80-page contract to this prompt in one call—insurance provisions are usually concentrated in a few sections, and sending irrelevant text increases cost, latency, and hallucination risk. If your pipeline lacks a pre-classification step, add a lightweight insurance-section classifier prompt before invoking extraction.
Validation and retry logic is critical because coverage amounts and policy types are high-stakes fields. Implement a post-extraction validator that checks: (a) all required fields are present and non-null unless explicitly flagged as absent, (b) coverage amounts parse to numeric values with correct currency units, (c) enumerated fields like coverage_type match your internal taxonomy (e.g., commercial_general_liability, workers_compensation, professional_liability), and (d) boolean fields like waiver_of_subrogation and primary_non_contributory are actual booleans, not strings. If validation fails, retry once with the same prompt plus the validation error message appended as a [CORRECTION_HINT]. If the second attempt also fails, route the clause to a human review queue with the raw text, the failed extraction, and the specific validation errors highlighted. Never silently accept a partial extraction for insurance coverage fields.
Model choice and tool use depend on your accuracy requirements. For production contract review systems, use a model with strong structured output capabilities and low hallucination rates on legal text. Enable structured output mode (JSON mode or function calling with a strict schema) rather than relying on free-text parsing. If your platform supports it, provide the output schema as a tool definition and require the model to call the tool with the extracted fields. This gives you schema enforcement at the API level before your application code sees the response. For high-volume pipelines, consider batching multiple candidate sections into a single call with an array output schema, but keep each section's extraction independent to prevent cross-contamination.
Logging and observability should capture: the input section text, the raw model output, the validated extraction, any validation failures, retry attempts, and the final disposition (accepted, repaired, or escalated). Include a confidence field in your extraction schema and log it alongside each field. If the model reports low confidence on coverage amounts or policy types, flag those extractions for human sampling even if they pass structural validation. Over time, these logs become your evaluation dataset for measuring extraction accuracy and identifying patterns in failure modes—such as which carriers or policy structures the model consistently misreads.
Human review integration should be designed as a first-class path, not an afterthought. When an extraction is escalated, present the reviewer with: the original clause text, the model's best-effort extraction, the specific validation failures, and a structured form pre-populated with the model's output for correction. Track reviewer corrections as labeled data for future fine-tuning or prompt improvement. Set a service-level objective for extraction accuracy on coverage amounts (e.g., 99.5% numeric accuracy on audited samples) and use the human review queue volume as a leading indicator of prompt drift or model regression. If escalation rates rise above your threshold, investigate whether contract formats, carrier language, or model behavior has changed before the error reaches downstream systems.
Expected Output Contract
Defines the structured JSON fields, types, and validation rules for the insurance and risk allocation clause extraction output. Use this contract to build downstream parsers, validation checks, and database schemas.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
insurance_requirements | array of objects | Must be a non-empty array if any insurance clause is detected; otherwise an empty array. Each object must conform to the insurance_item schema. | |
insurance_item.insurance_type | string | Must match one of the allowed enum values: [General Liability, Professional Liability, Workers Compensation, Auto Liability, Umbrella/Excess Liability, Cyber Liability, Property Insurance, Directors and Officers, Environmental Liability, Other]. If type is 'Other', the raw_text field must be populated. | |
insurance_item.minimum_coverage_amount | object | If present, must contain 'amount' (number), 'currency' (ISO 4217 string), and 'per_occurrence_or_aggregate' (enum: [per_occurrence, aggregate, not_specified]). Amount must be a positive number. Set to null if no amount is specified in the clause. | |
insurance_item.additional_insured_status | boolean | Must be true if the clause requires the counterparty to be named as an additional insured, otherwise false. Do not infer; base strictly on explicit text. | |
insurance_item.waiver_of_subrogation | boolean | Must be true if the clause includes an explicit waiver of subrogation rights, otherwise false. Do not infer from silence. | |
insurance_item.primary_non_contributory | boolean | Must be true if the clause states the insurance is primary and non-contributory, otherwise false. Check for exact phrase or close variants like 'primary and non-contributory'. | |
insurance_item.evidence_required | string | If the clause specifies required proof (e.g., certificate of insurance), extract the exact requirement. Allowed values: [certificate_of_insurance, endorsements, policy_copy, not_specified]. Set to null if not mentioned. | |
source_citation | object | Must contain 'section_name' (string), 'page_number' (integer or null), and 'paragraph_number' (integer or null). At least one of page_number or paragraph_number must be non-null. The 'excerpt' field must contain the verbatim text snippet used for extraction, truncated to 500 characters max. |
Common Failure Modes
Insurance and risk allocation clauses contain precise numeric values, legal terms of art, and complex conditional logic. These failure modes are the most common in production extraction pipelines and require explicit guardrails.
Coverage Amount Misread
What to watch: The model misreads coverage limits due to OCR errors, comma placement in large numbers, or confusion between per-occurrence and aggregate limits. A $2,000,000 aggregate can become $200,000. Guardrail: Post-process all extracted dollar amounts with a numeric validator that flags values outside expected ranges and requires human review for amounts below industry minimums.
Primary/Non-Contributory Language Missed
What to watch: The model extracts insurance types and limits but omits the critical 'primary and non-contributory' designation, which fundamentally changes risk allocation. This language often appears in separate endorsement paragraphs. Guardrail: Add a dedicated boolean field for primary/non-contributory status with a secondary extraction pass that searches for the exact phrase and its common variants across the full document.
Additional Insured Scope Confusion
What to watch: The model identifies that additional insured status exists but fails to capture scope limitations—whether it applies only to ongoing operations, includes completed operations, or is limited to vicarious liability. Guardrail: Use a structured enum for additional insured scope with explicit options and require the model to cite the specific sentence that defines the scope boundary.
Waiver of Subrogation Over-Extraction
What to watch: The model flags a waiver of subrogation as present when the clause only applies to workers' compensation or a specific policy line, not the general liability policy. This creates false positives in risk assessment. Guardrail: Require the model to extract the specific policy type to which each waiver applies and flag any waiver without an explicit policy scope for human review.
Endorsement-Only Coverage Blind Spot
What to watch: Required coverage types like pollution liability or cyber insurance appear only in attached endorsements, not the main insurance article. The model extracts from the primary clause and reports coverage as absent. Guardrail: Implement a two-pass extraction strategy—first from the main insurance article, then from all endorsement sections—and merge results with source location tracking.
Self-Insured Retention Misclassification
What to watch: The model confuses self-insured retentions with deductibles or policy limits, misreporting the financial structure of the insurance program. SIRs change when coverage attaches and who bears first-dollar risk. Guardrail: Add a dedicated extraction field for retention type with a controlled vocabulary and validate that extracted SIR amounts are lower than corresponding policy limits.
Evaluation Rubric
Criteria for testing the quality of extracted insurance and risk allocation clauses before production deployment. Use these standards to build automated eval checks.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Coverage Amount Extraction Accuracy | All coverage amounts in [OUTPUT_JSON] match source document values exactly, including currency and per-occurrence vs. aggregate distinctions | Extracted amount differs from source by any non-zero value; currency symbol missing or wrong; aggregate limit reported as per-occurrence | Parse check: compare each extracted amount field against manually verified gold values from 20+ contract samples |
Insurance Type Identification | Every required insurance type (CGL, Auto, Workers' Comp, Professional Liability, Umbrella, etc.) present in source is captured with correct policy line name | Missing a required insurance type mentioned in source; misclassifying Umbrella as Excess; confusing Professional Liability with E&O when source distinguishes them | Schema check: validate extracted types against closed taxonomy; spot-check 10 documents for false negatives |
Additional Insured Status Detection | Correctly identifies whether each party is named as additional insured, including blanket vs. scheduled additional insured distinction | Marking a party as additional insured when source only requires them to be named as certificate holder; missing 'blanket' qualifier when present | Binary classification test: 50 positive and 50 negative examples with known additional insured status; measure precision and recall |
Waiver of Subrogation Detection | Correctly identifies presence or absence of waiver of subrogation for each coverage line, including mutual vs. unilateral waivers | Reporting waiver exists when source only mentions waiver in a non-binding recital; missing waiver that applies to specific coverage line only | Per-coverage-line comparison against legal reviewer annotations on 15 contracts |
Primary and Non-Contributory Language Detection | Correctly flags whether primary/non-contributory language is required, and for which coverage lines it applies | Flagging PNC as present when source only says 'primary' without 'non-contributory'; applying PNC to all lines when source limits it to CGL only | Token-level check: search for 'primary and non-contributory' phrase in source; verify extracted flag matches presence or absence |
Null Handling for Missing Provisions | [OUTPUT_JSON] uses explicit null or 'NOT_PRESENT' for any insurance requirement not found in source, with no hallucinated values | Inventing a standard coverage amount when source is silent; inserting 'standard' or 'customary' as placeholder values; omitting field entirely instead of marking null | Schema completeness check: verify every field in output schema has a value or explicit null; audit 10 documents with known missing provisions |
Citation Boundary Accuracy | Every extracted clause includes citation to correct section, page, or paragraph; citation span contains the full clause text and no unrelated content | Citation points to wrong section number; citation span cuts off mid-clause; citation includes adjacent unrelated clause text | Boundary check: extract cited text span from source document; verify it matches the extracted clause content and contains no extraneous provisions |
Confidence Score Calibration | Confidence scores below 0.7 correlate with actual extraction errors or ambiguous source language; scores above 0.9 correlate with correct extractions | High confidence (0.95) assigned to hallucinated coverage amount; low confidence (0.5) on straightforward extraction from clear source text | Calibration plot: bin confidence scores and measure actual accuracy per bin across 100+ extraction instances; expected monotonic relationship |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Start with the base prompt and a single representative insurance clause. Use a frontier model (GPT-4o, Claude 3.5 Sonnet) with default temperature. Skip strict schema validation initially—focus on whether the model correctly identifies insurance types, coverage minimums, and additional insured language.
Simplify the output schema to essential fields only:
json{ "insurance_types": [{"type": "[TYPE]", "minimum_coverage": "[AMOUNT]", "found": true}], "additional_insured": {"required": true, "language": "[EXCERPT]"}, "waiver_of_subrogation": {"present": true, "language": "[EXCERPT]"} }
Watch for
- Coverage amounts extracted without currency or unit normalization
- Primary/non-contributory language missed when embedded in dense paragraphs
- False positives on additional insured when only named insured is mentioned
- Model conflating different policy types (e.g., CGL vs. umbrella)

About the author
Prasad Kumkar
CEO & MD, Inference Systems
Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.
His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us