openapi: 3.2.0 info: title: Vaquill Ai NDA triage API version: 1.0.0 description: 'Operations tagged NDA triage across 2 of this provider''s published API definitions: vaquill-ai-workspace-openapi.json, vaquill-ai-workspace-openapi.yml. Each path carries the servers of the definition it was published in.' servers: - url: https://api.vaquill.ai/workspace description: Vaquill Legal Workspace API (production) - url: /workspace description: Vaquill Legal Workspace API (relative to the mount) security: - WorkspaceAuth: [] tags: - name: NDA triage description: Screening one inbound NDA against ten standard criteria and, where you name one, your own NDA playbook. Answers `green`, `yellow` or `red` with the reasoning per criterion, plus a report you can forward. paths: /v1/matters/{matterId}/nda-triages: post: tags: - NDA triage summary: Screen an NDA against ten criteria and a playbook description: 'Screen an inbound NDA against ten criteria. 202 with an operation to poll. A retry carrying the same `Idempotency-Key` returns the original operation and starts nothing, which is what makes a client timeout free rather than a second billed screen of the same agreement.' operationId: ndaTriages.create parameters: - name: matterId in: path required: true schema: type: string title: Matterid description: '`mat_` identifier of the matter to work inside. Everything in this API hangs off a matter, and the matter in the path is what the authorization boundary is checked against. Take it from `GET /v1/matters`.' - name: Idempotency-Key in: header required: false schema: anyOf: - type: string - type: 'null' title: Idempotency-Key description: A unique value of your choosing, so a retried launch returns the FIRST operation instead of starting a second billable job. Reusing one with a different body is refused. Retrying with the same key and the same body is free and is the intended way to recover from a timeout. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/NdaTriageCreateRequest' example: documentText: 'MASTER SERVICES AGREEMENT This Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page. 8. LIMITATION OF LIABILITY. Supplier''s total liability shall be unlimited for any claim arising out of this Agreement. 12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.' counterpartyName: value businessContext: value playbookId: pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 jurisdiction: US responses: '202': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/Operation' example: id: op_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 type: matrix.run status: succeeded createdAt: '2026-08-19T14:32:10Z' completedAt: '2026-08-19T14:32:10Z' matterId: mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 resource: kind: matrix id: mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 url: https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=... progress: done: 24 total: 128 unit: cells requestId: req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 '422': description: The request does not match the published schema. `errors` names each rejected field and why. The submitted value is never echoed back. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/ValidationProblem' '401': description: The credential is missing, malformed, unknown, revoked or expired. `type` is `invalid-credential`, or `wrong-product-credential` when a `vq_key_` Data API key was sent to this API. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 WWW-Authenticate: description: RFC 9110 authentication challenge. schema: type: string content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '403': description: The credential does not carry a scope this operation requires (`insufficient-scope`), or the organization's installation is suspended (`installation-inactive`). headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 WWW-Authenticate: description: RFC 9110 authentication challenge. schema: type: string content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '404': description: The resource does not exist, is not this organization's, or is outside this installation's matter allowlist. The three are deliberately indistinguishable, so the status code cannot be used to discover which ids exist in another organization. Each resource has its own `type`. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '429': description: Too many requests for this credential's tier. Honour `Retry-After`. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 Retry-After: description: Seconds to wait before retrying. schema: type: integer content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '500': description: An unexpected error on our side. The body carries a stable `type` and the request id and nothing else; the cause is in our logs. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '503': description: A dependency this request needs is unavailable, so nothing was done. Retryable. Authentication fails closed rather than admitting the request, so this is never a statement about your credential. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' servers: - url: https://api.vaquill.ai/workspace description: Vaquill Legal Workspace API (production) - url: /workspace description: Vaquill Legal Workspace API (relative to the mount) /v1/matters/{matterId}/nda-triages/{ndaTriageId}: get: tags: - NDA triage summary: Get an NDA triage description: 'One triage: its screen, or its progress toward one. 404 covers every reason it is not readable, including a job of a different kind that happens to share the table.' operationId: ndaTriages.get parameters: - name: matterId in: path required: true schema: type: string title: Matterid description: '`mat_` identifier of the matter to work inside. Everything in this API hangs off a matter, and the matter in the path is what the authorization boundary is checked against. Take it from `GET /v1/matters`.' - name: ndaTriageId in: path required: true schema: type: string title: Ndatriageid description: '`ndt_` identifier of the NDA triage. Returned on the operation that launched it.' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/NdaTriage' example: id: ndt_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 matterId: mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 status: queued classification: value effectiveClassification: value summary: Twelve substantive changes, seven of them in the liability and indemnity sections. ndaType: value counterpartyName: value playbookId: value jurisdiction: US criteria: - criterionId: 1 criterionName: Term and Duration status: pass findings: Confidentiality obligations run for ten years from the effective date, with no separate treatment of trade secrets. issues: - value recommendation: value playbookAssessment: verdict: meets_standard playbookPosition: Cap liability at fees paid in the preceding twelve months. deviationSummary: value triggeredEscalations: - value passCount: 0 warnCount: 0 failCount: 0 keyIssues: - value routingRecommendation: value estimatedTimeline: value missingCarveouts: - value problematicProvisions: - value parseWarning: Two clauses could not be parsed and are omitted from the findings. createdAt: '2026-08-19T14:32:10Z' completedAt: '2026-08-19T14:32:10Z' '422': description: The request does not match the published schema. `errors` names each rejected field and why. The submitted value is never echoed back. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/ValidationProblem' '401': description: The credential is missing, malformed, unknown, revoked or expired. `type` is `invalid-credential`, or `wrong-product-credential` when a `vq_key_` Data API key was sent to this API. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 WWW-Authenticate: description: RFC 9110 authentication challenge. schema: type: string content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '403': description: The credential does not carry a scope this operation requires (`insufficient-scope`), or the organization's installation is suspended (`installation-inactive`). headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 WWW-Authenticate: description: RFC 9110 authentication challenge. schema: type: string content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '404': description: The resource does not exist, is not this organization's, or is outside this installation's matter allowlist. The three are deliberately indistinguishable, so the status code cannot be used to discover which ids exist in another organization. Each resource has its own `type`. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '429': description: Too many requests for this credential's tier. Honour `Retry-After`. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 Retry-After: description: Seconds to wait before retrying. schema: type: integer content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '500': description: An unexpected error on our side. The body carries a stable `type` and the request id and nothing else; the cause is in our logs. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '503': description: A dependency this request needs is unavailable, so nothing was done. Retryable. Authentication fails closed rather than admitting the request, so this is never a statement about your credential. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' servers: - url: https://api.vaquill.ai/workspace description: Vaquill Legal Workspace API (production) - url: /workspace description: Vaquill Legal Workspace API (relative to the mount) /v1/matters/{matterId}/nda-triages/{ndaTriageId}/exports: post: tags: - NDA triage summary: Export an NDA triage as a report description: 'Mint a short-lived URL to the triage as a PDF or DOCX report. A POST rather than a GET because it creates something: a bearer URL over an analysis of a client document, and a rendering that did not exist before. Recording that as a creation is what lets an audit answer who took a copy and when.' operationId: ndaTriages.export parameters: - name: matterId in: path required: true schema: type: string title: Matterid description: '`mat_` identifier of the matter to work inside. Everything in this API hangs off a matter, and the matter in the path is what the authorization boundary is checked against. Take it from `GET /v1/matters`.' - name: ndaTriageId in: path required: true schema: type: string title: Ndatriageid description: '`ndt_` identifier of the NDA triage. Returned on the operation that launched it.' requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/ToolReportExportRequest' example: format: pdf responses: '201': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ToolReportExport' example: format: pdf filename: msa-acme-v3.docx url: https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=... expiresAt: '2026-08-19T14:32:10Z' sizeBytes: 248193 '422': description: The request does not match the published schema. `errors` names each rejected field and why. The submitted value is never echoed back. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/ValidationProblem' '401': description: The credential is missing, malformed, unknown, revoked or expired. `type` is `invalid-credential`, or `wrong-product-credential` when a `vq_key_` Data API key was sent to this API. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 WWW-Authenticate: description: RFC 9110 authentication challenge. schema: type: string content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '403': description: The credential does not carry a scope this operation requires (`insufficient-scope`), or the organization's installation is suspended (`installation-inactive`). headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 WWW-Authenticate: description: RFC 9110 authentication challenge. schema: type: string content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '404': description: The resource does not exist, is not this organization's, or is outside this installation's matter allowlist. The three are deliberately indistinguishable, so the status code cannot be used to discover which ids exist in another organization. Each resource has its own `type`. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '429': description: Too many requests for this credential's tier. Honour `Retry-After`. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 Retry-After: description: Seconds to wait before retrying. schema: type: integer content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '500': description: An unexpected error on our side. The body carries a stable `type` and the request id and nothing else; the cause is in our logs. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' '503': description: A dependency this request needs is unavailable, so nothing was done. Retryable. Authentication fails closed rather than admitting the request, so this is never a statement about your credential. headers: X-Request-ID: description: The id of this request. The same value appears as `requestId` in the body. Quote it when contacting support. schema: type: string examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 content: application/problem+json: schema: $ref: '#/components/schemas/Problem' servers: - url: https://api.vaquill.ai/workspace description: Vaquill Legal Workspace API (production) - url: /workspace description: Vaquill Legal Workspace API (relative to the mount) components: schemas: ToolReportExportRequest: properties: format: type: string enum: - pdf - docx title: Format description: Format to render. `pdf` for something a person reads and forwards, `docx` for something an editor opens. default: pdf examples: - pdf additionalProperties: false type: object title: ToolReportExportRequest description: Which format to render the finished analysis in. OperationStatus: type: string enum: - queued - running - succeeded - failed - cancelled title: OperationStatus description: 'The public five. There is no sixth, and there are no synonyms. Internal vocabularies spell terminal success `completed`, `ready`, `extracted`, `succeeded` and `fresh`; terminal failure `failed` and `error`; queued `pending`, `queued` and `draft`. All of that is collapsed here by `app.workspace_api.adapters.status_map`, which refuses to guess.' NdaPlaybookAssessment: properties: verdict: type: string title: Verdict description: 'How this criterion measures against the playbook: `meets_standard`, `within_acceptable_range`, `outside_range`, `deal_breaker_hit`, or `not_assessed` when the playbook has no entry for it.' examples: - meets_standard playbookPosition: anyOf: - type: string - type: 'null' title: Playbookposition description: The standard position this criterion was measured against. examples: - Cap liability at fees paid in the preceding twelve months. deviationSummary: anyOf: - type: string - type: 'null' title: Deviationsummary description: 'How this NDA differs from the standard, in one line. For example `Your standard: 5y term cap; this NDA: 10y`.' examples: - 'Your standard: confidentiality obligations expire five years after disclosure.' triggeredEscalations: items: type: string type: array title: Triggeredescalations description: Which of the playbook's escalation triggers fired on this criterion. examples: - - value additionalProperties: false type: object required: - verdict title: NdaPlaybookAssessment description: 'One criterion measured against the organization''s own positions. Computed deterministically from the playbook, not by the model: the LLM knows what a market NDA looks like and only the playbook knows what this firm will sign.' ToolReportExport: properties: format: type: string enum: - pdf - docx title: Format description: Format of the exported file. examples: - pdf filename: type: string title: Filename description: Suggested filename for the download. examples: - msa-acme-v3.docx url: type: string title: Url description: Short-lived signed URL to download the report. Fetch it promptly and do not store it. examples: - https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=... expiresAt: type: string format: date-time title: Expiresat description: When the URL stops working (RFC 3339). examples: - '2026-08-19T14:32:10Z' sizeBytes: type: integer title: Sizebytes description: Size of the exported file in bytes. examples: - 248193 additionalProperties: false type: object required: - format - filename - url - expiresAt - sizeBytes title: ToolReportExport description: 'A short-lived URL to the rendered report. The route declares a response model and a PDF is not one, so the bytes live in object storage and the customer fetches them directly.' NdaTriageCriterion: properties: criterionId: type: integer title: Criterionid description: Stable number of this criterion, 1 through 10. examples: - 1 criterionName: type: string title: Criterionname description: What the criterion checks. examples: - Term and Duration status: type: string title: Status description: 'The screen''s verdict on this criterion: `pass`, `warn`, `fail`, or `not_found` when the NDA is silent.' examples: - pass findings: type: string title: Findings description: What the NDA actually says about this criterion. examples: - Confidentiality obligations run for ten years from the effective date, with no separate treatment of trade secrets. issues: items: type: string type: array title: Issues description: Specific problems identified. examples: - - value recommendation: anyOf: - type: string - type: 'null' title: Recommendation description: What to do about this criterion. examples: - Reduce the confidentiality term to five years and carve out trade secrets, which survive for as long as they remain secret. playbookAssessment: anyOf: - $ref: '#/components/schemas/NdaPlaybookAssessment' - type: 'null' description: Verdict against your playbook. Absent when no playbook applied to this criterion. additionalProperties: false type: object required: - criterionId - criterionName - status - findings title: NdaTriageCriterion description: One of the ten screening criteria, and what the NDA said about it. Operation: properties: id: type: string title: Id description: Public identifier, `op_` followed by 32 hex characters. Poll `GET /v1/operations/{operationId}` with it. examples: - op_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 type: type: string title: Type description: What kind of work this is, for example `matrix.run` or `draft.generate`. examples: - matrix.run status: $ref: '#/components/schemas/OperationStatus' description: 'One of five values: `queued`, `running`, `succeeded`, `failed`, `cancelled`. There is no sixth and there are no synonyms. Stop polling once it is `succeeded`, `failed` or `cancelled`.' examples: - succeeded createdAt: type: string format: date-time title: Createdat description: When the operation was accepted (RFC 3339). examples: - '2026-08-19T14:32:10Z' completedAt: anyOf: - type: string format: date-time - type: 'null' title: Completedat description: When the operation reached a terminal status (RFC 3339). Present if and only if the status is terminal. examples: - '2026-08-19T14:32:10Z' matterId: anyOf: - type: string - type: 'null' title: Matterid description: '`mat_` identifier of the matter this work belongs to, when it belongs to one.' examples: - mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 resource: anyOf: - $ref: '#/components/schemas/OperationResource' - type: 'null' description: What the operation produced. Absent until the underlying job row exists, which an idempotent replay can briefly observe, so treat absence as 'not yet' rather than 'never'. error: anyOf: - $ref: '#/components/schemas/OperationError' - type: 'null' description: Why the work failed. Present only when `status` is `failed`. Partial success is `succeeded` with `progress.done < progress.total`, never an error. progress: anyOf: - $ref: '#/components/schemas/OperationProgress' - type: 'null' description: How far along the work is, when the underlying job reports it. Absent does not mean no progress. requestId: anyOf: - type: string - type: 'null' title: Requestid description: The `X-Request-ID` of the request that created this operation. Quote it in a support ticket. examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 additionalProperties: false type: object required: - id - type - status - createdAt title: Operation description: 'One long-running operation, whatever kind of work it is. Readable for `OPERATION_RETENTION_DAYS` after creation, per AIP-151.' ValidationProblem: type: object title: ValidationProblem description: A problem document for a schema rejection. `errors` lists the fields that were refused. The value you submitted is deliberately not echoed, so a validation failure cannot copy your content into an error response or into either side's logs. required: - type - title - status - detail - instance - errors properties: type: type: string format: uri description: The stable identifier for this error, and the one field to branch on. Resolves to a page describing it. examples: - https://vaquill.ai/docs/workspace-api/errors/insufficient-scope title: type: string description: A short human-readable summary. examples: - Insufficient scope status: type: integer description: The HTTP status code, repeated. examples: - 403 detail: type: string description: What went wrong on this specific request. May be reworded at any time. examples: - This credential carries matters:read. This operation needs matters:write. instance: type: string description: The path this problem occurred on. examples: - /workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 requestId: type: string description: The id of this request, identical to the `X-Request-ID` response header. Quote it when contacting support. examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 errors: type: array description: One entry per rejected field. items: type: object required: - location - message - type properties: location: type: string description: Dotted path to the rejected field, for example `body.contentMarkdown`. message: type: string description: Why it was rejected. type: type: string description: The validation rule that failed. additionalProperties: true OperationProgress: properties: done: type: integer minimum: 0.0 title: Done description: How many units are finished. examples: - 24 total: type: integer minimum: 0.0 title: Total description: How many units there are in total. Can legitimately be zero for an empty run. examples: - 128 unit: type: string enum: - cells - steps - documents - files - rows - percent title: Unit description: 'What `done` and `total` are counting. Always read it: a workflow run counts `percent` while a matrix run counts `cells`, so `{done: 43, total: 100}` alone is ambiguous.' examples: - cells additionalProperties: false type: object required: - done - total - unit title: OperationProgress description: 'How far along, and in what units. The unit is not decoration. A workflow run stores only a percentage while a matrix run stores cell counts, so `{done: 43, total: 100}` with no unit reads as 43 of 100 documents and a client builds a wrong estimate from it.' NdaTriage: properties: id: type: string title: Id description: Public identifier, `ndt_` followed by 32 hex characters. examples: - ndt_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 matterId: type: string title: Matterid description: '`mat_` identifier of the matter this triage belongs to.' examples: - mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 status: $ref: '#/components/schemas/OperationStatus' description: Triage status, using the same five public values as an operation. While `queued` or `running`, `criteria` is empty and the scalar fields are absent. That is the truthful shape of a screen that has not happened yet, not an error. examples: - queued classification: anyOf: - type: string - type: 'null' title: Classification description: 'The screen''s own verdict: `green` (standard approval), `yellow` (counsel review) or `red` (significant issues).' examples: - yellow effectiveClassification: anyOf: - type: string - type: 'null' title: Effectiveclassification description: The verdict after layering your playbook on top, which is the one to act on. A deal-breaker flips this to `red` even where the screen said `green`. Equal to `classification` when no playbook applied. examples: - red summary: type: string title: Summary description: Overall assessment, in prose. default: '' examples: - Twelve substantive changes, seven of them in the liability and indemnity sections. ndaType: anyOf: - type: string - type: 'null' title: Ndatype description: 'Structure of the agreement: `mutual`, `unilateral_disclosing`, `unilateral_receiving`, or `unknown`.' examples: - mutual counterpartyName: anyOf: - type: string - type: 'null' title: Counterpartyname description: Counterparty, echoed from the request. examples: - Acme Corporation playbookId: anyOf: - type: string - type: 'null' title: Playbookid description: The playbook the triage actually ran against. Absent when it ran against the built-in defaults, so the two cases can be told apart after the fact. examples: - pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 jurisdiction: anyOf: - type: string - type: 'null' title: Jurisdiction description: Jurisdiction the default positions were drawn from. examples: - US criteria: items: $ref: '#/components/schemas/NdaTriageCriterion' type: array title: Criteria description: The ten screening criteria and their results. passCount: type: integer title: Passcount description: How many criteria passed. default: 0 examples: - 0 warnCount: type: integer title: Warncount description: How many criteria drew a warning. default: 0 examples: - 0 failCount: type: integer title: Failcount description: How many criteria failed. default: 0 examples: - 0 keyIssues: items: type: string type: array title: Keyissues description: The issues that need attention first. examples: - - value routingRecommendation: anyOf: - type: string - type: 'null' title: Routingrecommendation description: What to do next, given the classification. examples: - Route to counsel for full review before signature; do not sign as received. estimatedTimeline: anyOf: - type: string - type: 'null' title: Estimatedtimeline description: How long resolution is expected to take, for example `Same day`. examples: - 3-5 business days missingCarveouts: items: type: string type: array title: Missingcarveouts description: Standard carve-outs the NDA does not have. The one finding that cannot be expressed as a criterion result, because there is nothing there to assess. examples: - - value problematicProvisions: items: type: string type: array title: Problematicprovisions description: Provisions that do not belong in an NDA at all, for example a non-compete or an assignment of IP. examples: - - value parseWarning: anyOf: - type: string - type: 'null' title: Parsewarning description: Set when the model's output only partly parsed, which means the screen may be incomplete. Present is the difference between routing on it and asking a human first. examples: - Two clauses could not be parsed and are omitted from the findings. createdAt: type: string format: date-time title: Createdat description: When the triage was created (RFC 3339). examples: - '2026-08-19T14:32:10Z' completedAt: anyOf: - type: string format: date-time - type: 'null' title: Completedat description: When the triage reached a terminal status (RFC 3339). examples: - '2026-08-19T14:32:10Z' additionalProperties: false type: object required: - id - matterId - status - createdAt title: NdaTriage description: 'One NDA triage: its screen, or its progress toward one.' OperationResource: properties: kind: type: string title: Kind description: What sort of thing was produced, for example `matrix` or `document`. examples: - matrix id: type: string title: Id description: Public identifier of the produced resource, carrying its own type prefix, for example `mtx_` for a matrix. examples: - mtx_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 url: anyOf: - type: string - type: 'null' title: Url description: Path on this API where the resource can be read, RELATIVE to the API root and never absolute. Absent when the resource has no addressable path, which happens for work started outside a matter. Absent means the id is real and there is nowhere to GET it; it is not an error. examples: - https://storage.vaquill.ai/exports/msa-acme-v3-redline.docx?signature=... additionalProperties: false type: object required: - kind - id title: OperationResource description: 'What the operation produced, or is producing. `url` is a path on this API rather than an absolute URL, because the service is mounted today and gets its own hostname later (docs 07.5). A relative path survives that move; a baked-in host does not.' NdaTriageCreateRequest: properties: documentText: type: string maxLength: 200000 minLength: 100 title: Documenttext description: 'The full NDA text to screen, 100 to 200,000 characters. Text rather than a document id: a triage reads one agreement end to end and the caller usually has it in hand, having just received it.' examples: - 'MASTER SERVICES AGREEMENT This Master Services Agreement is entered into as of 1 September 2026 between Acme Corporation, a Delaware corporation, and the Supplier identified on the signature page. 8. LIMITATION OF LIABILITY. Supplier''s total liability shall be unlimited for any claim arising out of this Agreement. 12. GOVERNING LAW. This Agreement is governed by the laws of the State of Delaware.' counterpartyName: anyOf: - type: string maxLength: 200 - type: 'null' title: Counterpartyname description: Who sent it. Echoed back on the triage so a queue of screened NDAs is readable without a second lookup. examples: - Acme Corporation businessContext: anyOf: - type: string maxLength: 1000 - type: 'null' title: Businesscontext description: What the NDA is for, in a sentence. Sharpens the routing recommendation; omitting it costs only specificity. examples: - Mutual NDA ahead of diligence on a possible platform integration with Acme Corporation. playbookId: anyOf: - type: string - type: 'null' title: Playbookid description: '`pbk_` identifier of an NDA playbook to screen against. Must be a playbook whose `contractType` is `nda`; any other type is refused. Omit to screen against the built-in default NDA positions for `jurisdiction`.' examples: - pbk_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 jurisdiction: type: string pattern: ^([A-Z]{2}|INTL)$ title: Jurisdiction description: Two-letter uppercase jurisdiction code, or `INTL`. Selects the built-in default NDA positions when no playbook is named, and is ignored when one is. default: US examples: - US additionalProperties: false type: object required: - documentText title: NdaTriageCreateRequest description: Screen one inbound NDA, optionally against one of your own playbooks. OperationError: properties: code: type: string title: Code description: Stable, machine-readable failure code. Branch on this, never on `message`. examples: - EXTRACTION_FAILED message: type: string title: Message description: Human-readable explanation, sanitized of internal paths and stack frames. Wording may change; do not parse it. examples: - The upstream extraction did not finish. additionalProperties: false type: object required: - code - message title: OperationError description: 'Why a failed operation failed, in terms a customer can act on. `code` is stable and machine-readable. `message` is sanitized: the internal job tables store stack traces and file paths in their `error_message` columns, and forwarding those verbatim leaks our internals into a customer''s logs.' Problem: type: object title: Problem description: An RFC 9457 problem document. Branch on `type`, which is stable; `title` and `detail` are written for people and may be reworded. Some problems carry extra members (`requiredScopes`, `limit`, `expectedVersion`), which is why this object is open. required: - type - title - status - detail - instance properties: type: type: string format: uri description: The stable identifier for this error, and the one field to branch on. Resolves to a page describing it. examples: - https://vaquill.ai/docs/workspace-api/errors/insufficient-scope title: type: string description: A short human-readable summary. examples: - Insufficient scope status: type: integer description: The HTTP status code, repeated. examples: - 403 detail: type: string description: What went wrong on this specific request. May be reworded at any time. examples: - This credential carries matters:read. This operation needs matters:write. instance: type: string description: The path this problem occurred on. examples: - /workspace/v1/matters/mat_9f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 requestId: type: string description: The id of this request, identical to the `X-Request-ID` response header. Quote it when contacting support. examples: - req_5f2c8b1e4a7d43c9b6e0f1a2c3d4e5f6 additionalProperties: true securitySchemes: WorkspaceAuth: type: http scheme: bearer bearerFormat: vq_ws_* description: 'Workspace credential issued from the automation console at `/automation`. Send it as `Authorization: Bearer vq_ws_...`. This is NOT a Data API key: a `vq_key_` credential is refused here and names the other product in the error.' externalDocs: description: Getting started guide and error reference url: https://vaquill.ai/docs/workspace-api x-refined-from: - vaquill-ai-workspace-openapi.json - vaquill-ai-workspace-openapi.yml