Blog

How to Extract Key Data from Contracts Automatically

A guide to extracting parties, dates, obligations, payment terms, and key clauses from contracts and legal agreements using schema-based document extraction.

Smole Team
  • contracts
  • legal
  • extraction
  • automation

Contracts are full of critical data (parties, dates, obligations, payment terms, termination clauses), but getting that data out of a 30-page PDF and into a structured format is painful. Legal teams, procurement departments, and operations managers spend hours reading through agreements to find the key details.

Schema-based extraction changes this. Define what you want to extract, upload the contract, and get structured JSON back.

What Data Can You Extract from Contracts?#

Contracts follow predictable patterns. Regardless of length or complexity, most contain:

  • Parties: Who's involved, their roles, and their details
  • Dates: Effective date, expiration, renewal dates
  • Financial terms: Fees, payment schedules, penalties
  • Obligations: What each party must do
  • Termination conditions: How and when the contract can be ended
  • Governing law: Which jurisdiction applies
  • Key clauses: Non-compete, confidentiality, SLA terms, liability limits

Building a Contract Extraction Schema#

Basic Contract Schema#

For a quick overview of any agreement:

JSON
{
  "type": "object",
  "properties": {
    "agreement_type": { "type": "string" },
    "effective_date": { "type": "string", "format": "date" },
    "expiration_date": { "type": "string", "format": "date" },
    "parties": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "role": { "type": "string" },
          "representative": { "type": "string" }
        }
      }
    },
    "total_value": { "type": "number" },
    "currency": { "type": "string" },
    "governing_law": { "type": "string" },
    "summary": { "type": "string" }
  }
}

Detailed Service Agreement Schema#

For deeper extraction from service contracts:

JSON
{
  "type": "object",
  "properties": {
    "agreement_number": { "type": "string" },
    "agreement_type": { "type": "string" },
    "effective_date": { "type": "string", "format": "date" },
    "parties": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "role": { "type": "string" },
          "registration_number": { "type": "string" },
          "address": { "type": "string" },
          "representative": {
            "type": "object",
            "properties": {
              "name": { "type": "string" },
              "title": { "type": "string" }
            }
          }
        }
      }
    },
    "term": {
      "type": "object",
      "properties": {
        "duration_months": { "type": "integer" },
        "auto_renewal": { "type": "boolean" },
        "renewal_term_months": { "type": "integer" },
        "notice_period_days": { "type": "integer" }
      }
    },
    "compensation": {
      "type": "object",
      "properties": {
        "amount": { "type": "number" },
        "currency": { "type": "string" },
        "frequency": { "type": "string" },
        "payment_terms": { "type": "string" }
      }
    },
    "sla": {
      "type": "object",
      "properties": {
        "uptime_guarantee": { "type": "number" },
        "response_time": { "type": "string" },
        "penalty_provisions": { "type": "string" }
      }
    },
    "termination": {
      "type": "object",
      "properties": {
        "for_cause_notice_days": { "type": "integer" },
        "for_convenience_notice_days": { "type": "integer" },
        "cure_period_days": { "type": "integer" }
      }
    },
    "confidentiality": {
      "type": "object",
      "properties": {
        "duration_years": { "type": "integer" },
        "scope": { "type": "string" }
      }
    },
    "governing_law": { "type": "string" },
    "key_obligations": {
      "type": "array",
      "items": { "type": "string" }
    }
  }
}

Example: Extracting a Service Agreement#

Upload a service contract:

Terminal
curl -X POST https://api.smole.tech/api/pipeline/file \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -F "file=@service-agreement.pdf" \
  -F "schemaId=SCHEMA_ID"

Get back structured data:

JSON
{
  "agreement_number": "SA-2025-0847",
  "agreement_type": "Managed Services Agreement",
  "effective_date": "2025-06-01",
  "parties": [
    {
      "name": "CloudOps Solutions GmbH",
      "role": "Provider",
      "registration_number": "HRB 198234",
      "address": "Leopoldstr. 21, 80802 Munich",
      "representative": { "name": "Dr. Lisa Weber", "title": "CEO" }
    },
    {
      "name": "RetailTech AG",
      "role": "Client",
      "registration_number": "HRB 214567",
      "address": "Kurfürstendamm 45, 10707 Berlin",
      "representative": { "name": "Marc Richter", "title": "CTO" }
    }
  ],
  "term": {
    "duration_months": 36,
    "auto_renewal": true,
    "renewal_term_months": 12,
    "notice_period_days": 90
  },
  "compensation": {
    "amount": 18500,
    "currency": "EUR",
    "frequency": "monthly",
    "payment_terms": "Net 30"
  },
  "sla": {
    "uptime_guarantee": 99.95,
    "response_time": "1 hour for critical, 4 hours for high, 1 business day for normal",
    "penalty_provisions": "10% monthly fee credit per 0.01% below SLA target"
  },
  "termination": {
    "for_cause_notice_days": 30,
    "for_convenience_notice_days": 90,
    "cure_period_days": 30
  },
  "confidentiality": {
    "duration_years": 5,
    "scope": "All proprietary technical and business information"
  },
  "governing_law": "Federal Republic of Germany",
  "key_obligations": [
    "Provider shall deliver managed infrastructure services per Exhibit A",
    "Provider guarantees 99.95% uptime for production systems",
    "Client shall provide access credentials and documentation within 5 business days",
    "Both parties shall maintain confidentiality for 5 years post-termination"
  ]
}

Use Cases for Contract Extraction#

Contract Management#

Build a searchable database of all your agreements. Know at a glance which contracts are expiring, what your total commitments are, and which vendors have specific terms.

Compliance and Audit#

Extract key clauses for compliance reviews. Quickly identify all contracts with specific governing law, data processing terms, or liability provisions.

Procurement#

Compare vendor contracts side by side. Extract pricing, SLA terms, and payment conditions from multiple proposals to make informed decisions.

Due Diligence#

During M&A or investment processes, extract key terms from dozens or hundreds of contracts. What are the total liabilities? Which contracts have change-of-control provisions?

Handling Different Contract Types#

The same approach works for:

  • Employment contracts: Salary, benefits, non-compete, notice period
  • NDAs: Parties, scope, duration, exceptions
  • Lease agreements: Rent, term, renewal options, maintenance obligations
  • License agreements: Scope, territory, exclusivity, royalties
  • Partnership agreements: Profit sharing, responsibilities, dissolution terms

Just adjust your schema to match the data you need from each type.

Tips for Better Contract Extraction#

  1. Focus on the data you'll actually use: Don't try to extract everything. Start with the fields that drive your workflow.
  2. Use nested objects for related data: Group party details, financial terms, and termination conditions into objects for cleaner output.
  3. Include a key_obligations array: This catches the most important commitments from the agreement in a summarized form.
  4. Test with your actual contracts: Every organization's contracts have slightly different patterns. Test your schema against real examples.

Try It Now#

Upload a contract in the Playground and see what gets extracted. No signup needed to try it.

For API integration details, see the documentation.

View all posts