Skip to content

Reference

API reference

Every endpoint, field key and error code below is generated from the same modules the API imports, so this page cannot say something the code does not do. Machine-readable versions: /api/openapi and /llms.txt.

Base URL

https://www.contract10.com/api/v1

Auth

Bearer token: `Authorization: Bearer c10_live_...` or `c10_test_...`. /timeline and /pricing work with no key at all (anonymous, throttled). Everything else requires a key.

Idempotency

Send an `Idempotency-Key` header on any POST to make retries safe: replaying the same key returns the original response instead of re-running the call.

Tracing

Every response carries `X-Request-Id`. Every keyed call is written to the inspectable request log in Settings.

Response envelope

Every success is { data }. This is the real response to the request example under POST /timeline below, the deterministic half computed by the actual engine, not a hand-typed sample.

200 response

{
  "data": {
    "acceptanceDate": "2026-08-28",
    "closingDate": "2026-09-28",
    "deadlines": [
      {
        "key": "earnest_money",
        "label": "Earnest money due",
        "dueDate": "2026-09-02",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 3,
        "dayBasis": "business",
        "rollRule": "forward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Aug 28, 2026 (acceptance) plus 3 business days = Sep 2, 2026. Deposit must be delivered to escrow.",
        "sourceField": "earnest_money_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "money"
      },
      {
        "key": "inspection",
        "label": "Inspection period ends",
        "dueDate": "2026-09-08",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 10,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": "2026-09-07",
        "rolledReason": "Labor Day",
        "derivation": "Aug 28, 2026 (acceptance) plus 10 calendar days = Sep 7, 2026. That is Labor Day, so it moves to Sep 8, 2026. Last day to complete inspections.",
        "sourceField": "inspection_period_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "diligence"
      },
      {
        "key": "final_walkthrough",
        "label": "Final walkthrough",
        "dueDate": "2026-09-25",
        "baseKey": "closing_date",
        "baseDate": "2026-09-28",
        "offsetDays": -3,
        "dayBasis": "calendar",
        "rollRule": "backward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Sep 28, 2026 (closing) minus 3 calendar days = Sep 25, 2026. Buyer's final walkthrough before signing.",
        "sourceField": "final_walkthrough_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "closing"
      },
      {
        "key": "closing",
        "label": "Closing",
        "dueDate": "2026-09-28",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 30,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": "2026-09-27",
        "rolledReason": "a Sunday",
        "derivation": "Aug 28, 2026 (acceptance) plus 30 calendar days = Sep 27, 2026. That is a Sunday, so it moves to Sep 28, 2026. Closing / settlement.",
        "sourceField": "closing_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "closing"
      }
    ],
    "warnings": [],
    "holidaysInWindow": [
      {
        "date": "2026-09-07",
        "name": "Labor Day"
      }
    ],
    "engineVersion": "1.0.0"
  }
}

Field catalogue

Every field key the engine understands

The extractor targets exactly these keys, the review UI renders exactly these labels, and POST /timeline accepts exactly these keys in fields[]. A period outside its max is dropped with a reason, never clamped.

keylabelunitmaxrequiredwhat to look for
acceptance_dateAcceptance datedaten/ayesThe date the last party signed. Also called the effective date, the date of ratification, or mutual acceptance. Every other period counts from this.
closing_dateClosing datedaten/anoThe stated settlement date or close of escrow, when the contract gives an actual date.
closing_daysClosing perioddays365noUsed when the contract says closing happens N days after acceptance rather than naming a date.
earnest_money_daysEarnest money deadlinedays60noDays to deliver the deposit to escrow.
earnest_money_amountEarnest money amountusdn/anoThe deposit amount in dollars.
inspection_period_daysInspection perioddays120noThe inspection, due-diligence or option period. In Texas this is the option period; in Georgia, due diligence.
inspection_objection_daysInspection objection perioddays120noWhere the form separates inspecting from objecting, the deadline to deliver the objection or repair request.
appraisal_daysAppraisal contingencydays180noDays for the appraisal contingency.
loan_approval_daysFinancing contingencydays180noDays for loan approval or the financing contingency.
title_review_daysTitle reviewdays120noDays to review and object to the title commitment.
seller_disclosure_daysSeller disclosuresdays90noDays for the seller to deliver disclosures.
contingency_removal_daysContingency removaldays180noDeadline to remove all remaining contingencies in writing.
final_walkthrough_daysFinal walkthroughdays30noDays BEFORE closing for the walkthrough. Counted backward from the closing date.
possession_datePossessiondaten/anoWhen the buyer takes possession, if it differs from closing.

Errors

Structured, never silent

Every non-2xx response is JSON, never a fabricated fallback. The code is stable; build on it, not on the message text.

codestatusmeaning
invalid_request400A required field is missing, malformed, or outside its plausible range (see the field catalogue's max column). The offending key is named in `details`.
unauthorized401The Authorization header is missing a valid, unrevoked API key for an endpoint that requires one.
upgrade_required402The Free plan has no live API/MCP access. Use a c10_test_ key to keep developing, or upgrade for a c10_live_ key.
not_found404No transaction exists for the given id, or it belongs to a different owner.
payload_too_large413The uploaded contract exceeds the size limit.
unsupported_media_type415Only PDF contracts are supported by /extract right now.
unprocessable422The file could not be read as a real-estate purchase contract, or was too degraded to extract reliably. Never a fabricated fallback.
conflict409This Idempotency-Key was already used for a DIFFERENT request. Replaying would return the earlier contract's dates, so it is refused. Use a new key for a new contract; resend the identical request to replay its response.
rate_limited429You exceeded your plan's per-minute burst rate, the test-key throttle, or the anonymous daily cap. See the quota table below.
not_configured503A required backend credential is not configured on our side.
upstream_unavailable502The extraction backend did not respond correctly. Safe to retry with backoff.
upstream_timeout504The extraction backend did not respond in time. Safe to retry with backoff.
internal500An unexpected server error. Safe to retry; contact support if it persists.

400, a genuinely bad period

{
  "error": {
    "code": "invalid_request",
    "message": "Inspection period of 1700 days is outside the plausible range (max 120). This is usually a page number read as a period.",
    "details": {
      "key": "inspection_period_days"
    }
  }
}

Rate limits

By key type

POST /timeline and GET /pricing work with no key, throttled. Everything else needs a key: a free c10_test_ key runs the real engine and never bills, a c10_live_ key needs a Pro or Scale plan.

TierPer minutePer dayVolume
Anonymous (/timeline, /pricing only)4/min20/dayNo live key, no /extract or /transactions access
Test key (any plan, c10_test_)10/min200/dayFull API surface against the real engine, never bills
Free plann/an/aNo live API key. 1 active transaction on the web app.
Pro (c10_live_)60/minn/a1,000 calls/mo included, then $0.05/call
Scale (c10_live_)300/minn/a10,000 calls/mo included, then $0.03/call

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, so an agent can back off before it gets a 429, and a 429 adds Retry-After. A keyed request also carries X-Quota-Limit, X-Quota-Used and X-Quota-Remaining for the monthly allowance. An anonymous caller has no account, so there is no monthly quota to report. Full plan details at /pricing or the machine-readable /api/v1/pricing.

Endpoints

Every route

POST

/api/v1/timeline

Key optional

The deterministic half. Fields in, every downstream deadline out, each one showing its base date, offset, day-counting basis, weekend/holiday roll and a plain-English derivation. Pure arithmetic, no model in the loop, keyless.

ParamInRequiredDescription
fieldsbodyyesContractField[]. A minimal entry is { key, value }; the API fills in label, unit, page (0, meaning typed rather than read) and confidence ("high"). See the field catalogue below for every key.
options.dayZerobodyno"acceptance" | "day_after_acceptance" (default). Whether the day of acceptance itself counts as day 1, or the day after does. Most contracts mean the latter.
options.extraHolidaysbodynoyyyy-mm-dd[]. Extra dates (a state holiday, an office closure) treated as non-business days on top of the computed US federal holidays.

request

curl -X POST https://www.contract10.com/api/v1/timeline \
  -H "Content-Type: application/json" \
  -d '{"fields":[{"key":"acceptance_date","value":"2026-08-28"},{"key":"closing_days","value":"30"},{"key":"earnest_money_days","value":"3"},{"key":"inspection_period_days","value":"10"},{"key":"final_walkthrough_days","value":"3"}]}'

response

{
  "data": {
    "acceptanceDate": "2026-08-28",
    "closingDate": "2026-09-28",
    "deadlines": [
      {
        "key": "earnest_money",
        "label": "Earnest money due",
        "dueDate": "2026-09-02",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 3,
        "dayBasis": "business",
        "rollRule": "forward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Aug 28, 2026 (acceptance) plus 3 business days = Sep 2, 2026. Deposit must be delivered to escrow.",
        "sourceField": "earnest_money_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "money"
      },
      {
        "key": "inspection",
        "label": "Inspection period ends",
        "dueDate": "2026-09-08",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 10,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": "2026-09-07",
        "rolledReason": "Labor Day",
        "derivation": "Aug 28, 2026 (acceptance) plus 10 calendar days = Sep 7, 2026. That is Labor Day, so it moves to Sep 8, 2026. Last day to complete inspections.",
        "sourceField": "inspection_period_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "diligence"
      },
      {
        "key": "final_walkthrough",
        "label": "Final walkthrough",
        "dueDate": "2026-09-25",
        "baseKey": "closing_date",
        "baseDate": "2026-09-28",
        "offsetDays": -3,
        "dayBasis": "calendar",
        "rollRule": "backward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Sep 28, 2026 (closing) minus 3 calendar days = Sep 25, 2026. Buyer's final walkthrough before signing.",
        "sourceField": "final_walkthrough_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "closing"
      },
      {
        "key": "closing",
        "label": "Closing",
        "dueDate": "2026-09-28",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-28",
        "offsetDays": 30,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": "2026-09-27",
        "rolledReason": "a Sunday",
        "derivation": "Aug 28, 2026 (acceptance) plus 30 calendar days = Sep 27, 2026. That is a Sunday, so it moves to Sep 28, 2026. Closing / settlement.",
        "sourceField": "closing_days",
        "sourcePage": 0,
        "sourceQuote": null,
        "needsVerify": false,
        "group": "closing"
      }
    ],
    "warnings": [],
    "holidaysInWindow": [
      {
        "date": "2026-09-07",
        "name": "Labor Day"
      }
    ],
    "engineVersion": "1.0.0"
  }
}
POST

/api/v1/extract

Requires a live key

Contract PDF in, page-cited fields out. This half DOES use a model, so every field carries a confidence and a page citation, and a low-confidence field is surfaced as needsVerify rather than hidden. Requires a key.

ParamInRequiredDescription
filebodynomultipart/form-data field with the PDF.
urlbodynoJSON body alternative to file: an https:// URL to fetch the PDF from.
base64bodynoJSON body alternative to file: base64-encoded PDF bytes.
buildTimelinebodynoBoolean, default false. When true, also runs the extracted fields through the same deterministic engine as /timeline and returns the result as `timeline`.

request

curl -X POST https://www.contract10.com/api/v1/extract \
  -H "Authorization: Bearer c10_live_..." \
  -F "file=@142-willow-creek-purchase-agreement.pdf" \
  -F "buildTimeline=true"

response

{
  "data": {
    "transactionId": "4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e",
    "fields": [
      {
        "key": "acceptance_date",
        "label": "Acceptance date",
        "unit": "date",
        "value": "2026-08-03",
        "valueText": null,
        "dayBasis": null,
        "page": 1,
        "quote": "This Agreement is entered into and becomes effective (\"Effective Date\") on August 3, 2026.",
        "confidence": "high"
      },
      {
        "key": "closing_date",
        "label": "Closing date",
        "unit": "date",
        "value": "2026-09-02",
        "valueText": null,
        "dayBasis": null,
        "page": 4,
        "quote": "Closing shall occur on or before September 2, 2026.",
        "confidence": "high"
      },
      {
        "key": "earnest_money_days",
        "label": "Earnest money deadline",
        "unit": "days",
        "value": "3",
        "valueText": "3 days",
        "dayBasis": null,
        "page": 2,
        "quote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
        "confidence": "high"
      },
      {
        "key": "earnest_money_amount",
        "label": "Earnest money amount",
        "unit": "usd",
        "value": "8500",
        "valueText": "$8,500.00",
        "dayBasis": null,
        "page": 2,
        "quote": "Earnest Money: $8,500.00",
        "confidence": "high"
      },
      {
        "key": "inspection_period_days",
        "label": "Inspection period",
        "unit": "days",
        "value": "10",
        "valueText": "10 days",
        "dayBasis": null,
        "page": 6,
        "quote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
        "confidence": "high"
      },
      {
        "key": "appraisal_days",
        "label": "Appraisal contingency",
        "unit": "days",
        "value": "17",
        "valueText": "1[illegible]7",
        "dayBasis": null,
        "page": 9,
        "quote": "Appraisal Contingency Period: 1[illegible]7 days.",
        "confidence": "low"
      }
    ],
    "timeline": {
      "acceptanceDate": "2026-08-03",
      "closingDate": "2026-09-02",
      "deadlines": [
        {
          "key": "earnest_money",
          "label": "Earnest money due",
          "dueDate": "2026-08-06",
          "baseKey": "acceptance_date",
          "baseDate": "2026-08-03",
          "offsetDays": 3,
          "dayBasis": "business",
          "rollRule": "forward",
          "rolledFrom": null,
          "rolledReason": null,
          "derivation": "Aug 3, 2026 (acceptance) plus 3 business days = Aug 6, 2026. Deposit must be delivered to escrow.",
          "sourceField": "earnest_money_days",
          "sourcePage": 2,
          "sourceQuote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
          "needsVerify": false,
          "group": "money"
        },
        {
          "key": "inspection",
          "label": "Inspection period ends",
          "dueDate": "2026-08-13",
          "baseKey": "acceptance_date",
          "baseDate": "2026-08-03",
          "offsetDays": 10,
          "dayBasis": "calendar",
          "rollRule": "forward",
          "rolledFrom": null,
          "rolledReason": null,
          "derivation": "Aug 3, 2026 (acceptance) plus 10 calendar days = Aug 13, 2026. Last day to complete inspections.",
          "sourceField": "inspection_period_days",
          "sourcePage": 6,
          "sourceQuote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
          "needsVerify": false,
          "group": "diligence"
        },
        {
          "key": "appraisal",
          "label": "Appraisal contingency ends",
          "dueDate": "2026-08-20",
          "baseKey": "acceptance_date",
          "baseDate": "2026-08-03",
          "offsetDays": 17,
          "dayBasis": "calendar",
          "rollRule": "forward",
          "rolledFrom": null,
          "rolledReason": null,
          "derivation": "Aug 3, 2026 (acceptance) plus 17 calendar days = Aug 20, 2026. Last day to act on a low appraisal.",
          "sourceField": "appraisal_days",
          "sourcePage": 9,
          "sourceQuote": "Appraisal Contingency Period: 1[illegible]7 days.",
          "needsVerify": true,
          "group": "financing"
        },
        {
          "key": "closing",
          "label": "Closing",
          "dueDate": "2026-09-02",
          "baseKey": "closing_date",
          "baseDate": "2026-09-02",
          "offsetDays": 0,
          "dayBasis": "calendar",
          "rollRule": "none",
          "rolledFrom": null,
          "rolledReason": null,
          "derivation": "Stated in the contract as Sep 2, 2026. Not derived from another date.",
          "sourceField": "closing_date",
          "sourcePage": 4,
          "sourceQuote": "Closing shall occur on or before September 2, 2026.",
          "needsVerify": false,
          "group": "closing"
        }
      ],
      "warnings": [
        {
          "code": "low_confidence_field",
          "message": "\"Appraisal contingency\" was read with low confidence from page 9. Confirm it against the contract before relying on appraisal contingency ends.",
          "field": "appraisal_days"
        }
      ],
      "holidaysInWindow": [],
      "engineVersion": "1.0.0"
    },
    "pageCount": 22,
    "engine": "openrouter",
    "confidence": 0.86
  }
}
GET

/api/v1/transactions

Requires a live key

List the caller's own transactions, newest first.

request

curl https://www.contract10.com/api/v1/transactions \
  -H "Authorization: Bearer c10_live_..."

response

{
  "data": [
    {
      "id": "4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e",
      "source": "api",
      "status": "completed",
      "needsReview": true,
      "propertyAddress": "142 Willow Creek Dr, Austin, TX 78745",
      "transactionType": "purchase",
      "stateCode": "TX",
      "contractName": "TREC 20",
      "buyerRef": "J. Alvarez",
      "sellerRef": "M. Chen",
      "acceptanceDate": "2026-08-03",
      "closingDate": "2026-09-02",
      "archived": false,
      "fileName": "142-willow-creek-purchase-agreement.pdf",
      "fileSize": 1834213,
      "pageCount": 22,
      "fieldCount": 6,
      "deadlineCount": 4,
      "confidence": 0.86,
      "engine": "openrouter",
      "engineVersion": "1.0.0",
      "createdAt": "2026-08-04T15:12:03Z",
      "updatedAt": "2026-08-04T15:12:07Z",
      "completedAt": "2026-08-04T15:12:07Z"
    }
  ]
}
GET

/api/v1/transactions/{id}

Requires a live key

Get one transaction with its extracted fields and computed deadlines.

ParamInRequiredDescription
idpathyesTransaction id returned by POST /extract.

request

curl https://www.contract10.com/api/v1/transactions/4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e \
  -H "Authorization: Bearer c10_live_..."

response

{
  "data": {
    "transaction": {
      "id": "4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e",
      "source": "api",
      "status": "completed",
      "needsReview": true,
      "propertyAddress": "142 Willow Creek Dr, Austin, TX 78745",
      "transactionType": "purchase",
      "stateCode": "TX",
      "contractName": "TREC 20",
      "buyerRef": "J. Alvarez",
      "sellerRef": "M. Chen",
      "acceptanceDate": "2026-08-03",
      "closingDate": "2026-09-02",
      "archived": false,
      "fileName": "142-willow-creek-purchase-agreement.pdf",
      "fileSize": 1834213,
      "pageCount": 22,
      "fieldCount": 6,
      "deadlineCount": 4,
      "confidence": 0.86,
      "engine": "openrouter",
      "engineVersion": "1.0.0",
      "createdAt": "2026-08-04T15:12:03Z",
      "updatedAt": "2026-08-04T15:12:07Z",
      "completedAt": "2026-08-04T15:12:07Z"
    },
    "fields": [
      {
        "key": "acceptance_date",
        "label": "Acceptance date",
        "unit": "date",
        "value": "2026-08-03",
        "valueText": null,
        "dayBasis": null,
        "page": 1,
        "quote": "This Agreement is entered into and becomes effective (\"Effective Date\") on August 3, 2026.",
        "confidence": "high"
      },
      {
        "key": "closing_date",
        "label": "Closing date",
        "unit": "date",
        "value": "2026-09-02",
        "valueText": null,
        "dayBasis": null,
        "page": 4,
        "quote": "Closing shall occur on or before September 2, 2026.",
        "confidence": "high"
      },
      {
        "key": "earnest_money_days",
        "label": "Earnest money deadline",
        "unit": "days",
        "value": "3",
        "valueText": "3 days",
        "dayBasis": null,
        "page": 2,
        "quote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
        "confidence": "high"
      },
      {
        "key": "earnest_money_amount",
        "label": "Earnest money amount",
        "unit": "usd",
        "value": "8500",
        "valueText": "$8,500.00",
        "dayBasis": null,
        "page": 2,
        "quote": "Earnest Money: $8,500.00",
        "confidence": "high"
      },
      {
        "key": "inspection_period_days",
        "label": "Inspection period",
        "unit": "days",
        "value": "10",
        "valueText": "10 days",
        "dayBasis": null,
        "page": 6,
        "quote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
        "confidence": "high"
      },
      {
        "key": "appraisal_days",
        "label": "Appraisal contingency",
        "unit": "days",
        "value": "17",
        "valueText": "1[illegible]7",
        "dayBasis": null,
        "page": 9,
        "quote": "Appraisal Contingency Period: 1[illegible]7 days.",
        "confidence": "low"
      }
    ],
    "deadlines": [
      {
        "key": "earnest_money",
        "label": "Earnest money due",
        "dueDate": "2026-08-06",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-03",
        "offsetDays": 3,
        "dayBasis": "business",
        "rollRule": "forward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Aug 3, 2026 (acceptance) plus 3 business days = Aug 6, 2026. Deposit must be delivered to escrow.",
        "sourceField": "earnest_money_days",
        "sourcePage": 2,
        "sourceQuote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
        "needsVerify": false,
        "group": "money"
      },
      {
        "key": "inspection",
        "label": "Inspection period ends",
        "dueDate": "2026-08-13",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-03",
        "offsetDays": 10,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Aug 3, 2026 (acceptance) plus 10 calendar days = Aug 13, 2026. Last day to complete inspections.",
        "sourceField": "inspection_period_days",
        "sourcePage": 6,
        "sourceQuote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
        "needsVerify": false,
        "group": "diligence"
      },
      {
        "key": "appraisal",
        "label": "Appraisal contingency ends",
        "dueDate": "2026-08-20",
        "baseKey": "acceptance_date",
        "baseDate": "2026-08-03",
        "offsetDays": 17,
        "dayBasis": "calendar",
        "rollRule": "forward",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Aug 3, 2026 (acceptance) plus 17 calendar days = Aug 20, 2026. Last day to act on a low appraisal.",
        "sourceField": "appraisal_days",
        "sourcePage": 9,
        "sourceQuote": "Appraisal Contingency Period: 1[illegible]7 days.",
        "needsVerify": true,
        "group": "financing"
      },
      {
        "key": "closing",
        "label": "Closing",
        "dueDate": "2026-09-02",
        "baseKey": "closing_date",
        "baseDate": "2026-09-02",
        "offsetDays": 0,
        "dayBasis": "calendar",
        "rollRule": "none",
        "rolledFrom": null,
        "rolledReason": null,
        "derivation": "Stated in the contract as Sep 2, 2026. Not derived from another date.",
        "sourceField": "closing_date",
        "sourcePage": 4,
        "sourceQuote": "Closing shall occur on or before September 2, 2026.",
        "needsVerify": false,
        "group": "closing"
      }
    ]
  }
}
GET

/api/v1/transactions/{id}/deadlines

Requires a live key

Just the deadlines for one transaction, sorted by due date.

ParamInRequiredDescription
idpathyesTransaction id.

request

curl https://www.contract10.com/api/v1/transactions/4f2ac9d1-3b7e-4a90-8e21-6c8f2b9a5d3e/deadlines \
  -H "Authorization: Bearer c10_live_..."

response

{
  "data": [
    {
      "key": "earnest_money",
      "label": "Earnest money due",
      "dueDate": "2026-08-06",
      "baseKey": "acceptance_date",
      "baseDate": "2026-08-03",
      "offsetDays": 3,
      "dayBasis": "business",
      "rollRule": "forward",
      "rolledFrom": null,
      "rolledReason": null,
      "derivation": "Aug 3, 2026 (acceptance) plus 3 business days = Aug 6, 2026. Deposit must be delivered to escrow.",
      "sourceField": "earnest_money_days",
      "sourcePage": 2,
      "sourceQuote": "Buyer shall deliver the Earnest Money to Escrow Holder within 3 days after the Effective Date.",
      "needsVerify": false,
      "group": "money"
    },
    {
      "key": "inspection",
      "label": "Inspection period ends",
      "dueDate": "2026-08-13",
      "baseKey": "acceptance_date",
      "baseDate": "2026-08-03",
      "offsetDays": 10,
      "dayBasis": "calendar",
      "rollRule": "forward",
      "rolledFrom": null,
      "rolledReason": null,
      "derivation": "Aug 3, 2026 (acceptance) plus 10 calendar days = Aug 13, 2026. Last day to complete inspections.",
      "sourceField": "inspection_period_days",
      "sourcePage": 6,
      "sourceQuote": "Buyer shall have 10 days after the Effective Date within which to complete Buyer's inspections.",
      "needsVerify": false,
      "group": "diligence"
    },
    {
      "key": "appraisal",
      "label": "Appraisal contingency ends",
      "dueDate": "2026-08-20",
      "baseKey": "acceptance_date",
      "baseDate": "2026-08-03",
      "offsetDays": 17,
      "dayBasis": "calendar",
      "rollRule": "forward",
      "rolledFrom": null,
      "rolledReason": null,
      "derivation": "Aug 3, 2026 (acceptance) plus 17 calendar days = Aug 20, 2026. Last day to act on a low appraisal.",
      "sourceField": "appraisal_days",
      "sourcePage": 9,
      "sourceQuote": "Appraisal Contingency Period: 1[illegible]7 days.",
      "needsVerify": true,
      "group": "financing"
    },
    {
      "key": "closing",
      "label": "Closing",
      "dueDate": "2026-09-02",
      "baseKey": "closing_date",
      "baseDate": "2026-09-02",
      "offsetDays": 0,
      "dayBasis": "calendar",
      "rollRule": "none",
      "rolledFrom": null,
      "rolledReason": null,
      "derivation": "Stated in the contract as Sep 2, 2026. Not derived from another date.",
      "sourceField": "closing_date",
      "sourcePage": 4,
      "sourceQuote": "Closing shall occur on or before September 2, 2026.",
      "needsVerify": false,
      "group": "closing"
    }
  ]
}
GET

/api/v1/pricing

No key needed

Machine-readable plans: quotas, seats and per-call overage, generated from the same table the pricing page renders.

request

curl https://www.contract10.com/api/v1/pricing

response

{
  "data": {
    "plans": [
      {
        "id": "free",
        "name": "Free",
        "priceUsd": 0,
        "cadence": "free forever",
        "activeTransactions": 1,
        "apiCallsPerMonth": 0,
        "apiPerMinute": 0,
        "seats": 1,
        "overageUsd": 0,
        "features": [
          "1 active transaction",
          "Full contract extraction with page citations",
          "Every deadline shows its derivation",
          "Deadline checklist you tick off yourself",
          "Free in-browser timeline calculator, always",
          "Test API key for developers (throttled, never bills)"
        ]
      },
      {
        "id": "pro",
        "name": "Pro",
        "priceUsd": 49,
        "cadence": "per month",
        "activeTransactions": null,
        "apiCallsPerMonth": 1000,
        "apiPerMinute": 60,
        "seats": 1,
        "overageUsd": 0.05,
        "features": [
          "Unlimited active transactions",
          "iCal and CSV export, no watermark",
          "Closing timeline API + MCP server (1,000 calls/mo)",
          "Inspectable request log"
        ]
      },
      {
        "id": "scale",
        "name": "Scale",
        "priceUsd": 199,
        "cadence": "per month",
        "activeTransactions": null,
        "apiCallsPerMonth": 10000,
        "apiPerMinute": 300,
        "seats": 1,
        "overageUsd": 0.03,
        "features": [
          "Everything in Pro",
          "10,000 API calls/mo, then $0.03 each",
          "300 requests/minute burst",
          "Hosted MCP at production quota",
          "Priority support"
        ]
      }
    ],
    "anonQuota": {
      "perMinute": 4,
      "perDay": 20
    },
    "testKeyQuota": {
      "perMinute": 10,
      "perDay": 200
    }
  }
}
GET

/api/openapi

No key needed

The full OpenAPI 3.1 document for every /api/v1 route above, for agents and codegen that want a typed client instead of reading this page.

request

curl https://www.contract10.com/api/openapi

response

{ "openapi": "3.1.0", "info": { "title": "Contract10 API", "version": "1" }, "paths": { "/timeline": { "...": "..." } } }

Contract10 computes deadlines from the contract you upload. It is not legal advice and it does not replace your broker's review. Automated extraction can misread a poor scan, so every extracted field cites the page it came from and every deadline shows the arithmetic behind it. Confirm against the executed contract before you rely on a date.

Developer overviewMCP server