version90 DEVELOPERS

REST API / Archive

Contract Archive

Executed agreements in, structured data out. Uploads store the original byte-for-byte and queue AI extraction (a background job, typically seconds). The archive object below is the shape returned everywhere; the detail endpoint adds the full extraction block.

POST /api/v1/archive #

Upload one executed contract. Multipart form; PDF and DOCX accepted (60 MB max). Returns immediately with status 'received' — extraction populates the record asynchronously, so poll GET /archive/{id} or list until status is 'ready'.

Auth · Bearer token · member role or above

Parameter In Type Required Description
file form binary yes The document (multipart/form-data)
Request
curl -X POST https://app.version90.com/api/v1/archive \
  -H "Authorization: Bearer $V90_TOKEN" \
  -F "file=@Meridian_MSA_signed.pdf"
201 — archive object (status: received)
{
  "id": "9d2f4c1a-7e3b-4a90-b1c2-0f6e8d5a3b47",
  "original_filename": "Meridian_MSA_signed.pdf",
  "file_format": "pdf",              // "pdf" | "docx"
  "size_bytes": 482133,
  "status": "received",                 // "received" | "analyzing" | "ready" | "failed"
  "error": null,                     // extraction error message when failed
  "title": "Meridian_MSA_signed",
  "counterparty": "Meridian Robotics, Inc.",
  "agreement_type": "Master Services Agreement",
  "effective_date": "2024-09-02",    // ISO date or null
  "executed_date": "2024-08-28",
  "expiration_date": "2026-09-01",
  "governing_law": "Delaware",
  "summary": "Two-year MSA with auto-renewal…",
  "risk_count": 2,
  "created_at": "2026-07-11T18:04:11+00:00"
}

Errors

  • 422empty file, unsupported format, or over the size limit — {code, message}
  • 402 allowance_exhaustedarchive capacity full (production, enforcement on)
GET /api/v1/archive #

Search and filter the catalog on extracted facts. All filters combine with AND; q is a case-insensitive substring match over title, counterparty, filename and summary. Facets power filter dropdowns without a second call.

Auth · Bearer token · any member

Parameter In Type Required Description
q query string no Free-text search
counterparty query string no Exact counterparty name (use facets for values)
agreement_type query string no Exact agreement type
date_from query date no effective_date ≥ (YYYY-MM-DD)
date_to query date no effective_date ≤ (YYYY-MM-DD)
Request
curl "https://app.version90.com/api/v1/archive?agreement_type=Master%20Services%20Agreement&date_from=2024-01-01" \
  -H "Authorization: Bearer $V90_TOKEN"
200
{
  "total": 42,
  "items": [ /* archive objects — see POST /archive */ ],
  "facets": {
    "counterparties":  ["Coastline Retail Group", "Halcyon Labs", "Meridian Robotics, Inc."],
    "agreement_types": ["DPA", "Master Services Agreement", "NDA"]
  }
}
GET /api/v1/archive/{id} #

One archived contract with the complete extraction: structured key terms (field/value pairs), notable clauses with snippets, and risk flags with severity. This is the payload to sync into a warehouse.

Auth · Bearer token · any member

Parameter In Type Required Description
id path uuid yes Archive record id
Request
curl "https://app.version90.com/api/v1/archive/$ID" \
  -H "Authorization: Bearer $V90_TOKEN"
200 — archive object + extraction
{
  ...archive object fields above,
  "extraction": {
    "key_terms":   [ { "field": "payment_terms", "value": "Net 60" },
                     { "field": "initial_term",  "value": "24 months" } ],
    "key_clauses": [ { "clause_type": "limitation_of_liability",
                       "title": "Limitation of Liability",
                       "snippet": "…liable for all damages arising…" } ],
    "risks":       [ { "title": "Liability is uncapped",
                       "description": "No aggregate cap and no consequential-damages exclusion.",
                       "severity": "high" } ]
  },
  "provider": "anthropic",
  "model_id": "claude-sonnet-5"
}

Errors

  • 404no such record in your organization
GET /api/v1/archive/{id}/download #

The original uploaded file, byte-for-byte identical (content-addressed storage). Response is the binary with the original content type.

Auth · Bearer token · any member

Parameter In Type Required Description
id path uuid yes Archive record id
Request
curl -OJ "https://app.version90.com/api/v1/archive/$ID/download" \
  -H "Authorization: Bearer $V90_TOKEN"
200
binary body
Content-Disposition: attachment; filename="Meridian_MSA_signed.pdf"
POST /api/v1/archive/{id}/reanalyze #

Re-run extraction on a stored document (e.g. after a failed run, or to refresh with a newer model). Resets status to 'received' and queues the job; the stored file is untouched.

Auth · Bearer token · member role or above

Parameter In Type Required Description
id path uuid yes Archive record id
Request
curl -X POST "https://app.version90.com/api/v1/archive/$ID/reanalyze" \
  -H "Authorization: Bearer $V90_TOKEN"
202
{ "id": "9d2f4c1a-…", "status": "received" }
DELETE /api/v1/archive/{id} #

Remove a record from the archive (frees its capacity slot). Requires an admin-level role; the action is audited.

Auth · Bearer token · admin/owner role

Parameter In Type Required Description
id path uuid yes Archive record id
Request
curl -X DELETE "https://app.version90.com/api/v1/archive/$ID" \
  -H "Authorization: Bearer $V90_TOKEN"
200
{ "deleted": true }

Errors

  • 403 insufficient_permissionsmember-role tokens cannot delete