openapi: 3.0.3 info: title: LinkSquares Account Agreements API description: 'The LinkSquares API is the public REST API for the LinkSquares AI-powered contract lifecycle management (CLM) platform. It spans two products. Analyze exposes processed agreements plus the metadata, Smart Values, terms, types, tags, and parent/child hierarchy extracted from them, and lets you import DOCX/PDF documents for AI processing. Finalize lets external systems retrieve templates, create draft/intake/request agreements, and retrieve and approve tasks. All requests authenticate with an API key passed as an `x-api-key` header; the same token is shared across Analyze and Finalize. API access is gated to LinkSquares customers and keys are self-managed by Administrator users. GROUNDING NOTE: The Analyze paths in this document (under /api/analyze) are CONFIRMED against the public LinkSquares API Overview and Analyze API Sample Use Cases help-center articles, including live cURL examples. The Finalize paths (under /api/finalize) are MODELED from the capability-level descriptions in the LinkSquares API Overview - LinkSquares documents that Finalize can retrieve templates, retrieve and approve tasks, and create agreements, but the concrete request paths are behind the customer-gated API reference and must be confirmed before use. Request and response schemas throughout are modeled from documented behavior and examples, not copied from an official OpenAPI definition.' version: '1.0' contact: name: LinkSquares url: https://linksquares.com license: name: Proprietary url: https://linksquares.com/saas-terms-of-service servers: - url: https://api.linksquares.com description: LinkSquares production API gateway security: - apiKeyAuth: [] tags: - name: Agreements description: Analyze agreements and document import/upload (confirmed). paths: /api/analyze/v1/agreements: get: operationId: listAgreements tags: - Agreements summary: List agreements description: Lists the Analyze agreements the API user has permission to view. Supports filtering by agreement type, tag, and an updated-since date, and uses cursor pagination via a next_cursor value. Confirmed. parameters: - name: type in: query required: false description: Filter results by agreement type name. schema: type: string - name: tag in: query required: false description: Filter results by agreement tag. schema: type: string - name: next_cursor in: query required: false description: Cursor for the next page of results. In documented examples this is also passed as a next_cursor header. schema: type: string responses: '200': description: A page of agreements. content: application/json: schema: $ref: '#/components/schemas/AgreementList' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' post: operationId: createAgreement tags: - Agreements summary: Create an agreement (step 1 of import) description: First step of the two-step import flow. POSTs the file name and metadata (name, agreement_type, tags, optional parent agreement id) and returns a presigned upload URL on 200 OK. The second step is a PUT of the binary DOCX/PDF to that presigned URL (an Amazon S3 upload; Base64 is not supported). Confirmed. requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AgreementCreateInput' responses: '200': description: Agreement metadata created; presigned upload URL returned. content: application/json: schema: $ref: '#/components/schemas/AgreementUpload' '401': $ref: '#/components/responses/Unauthorized' '429': $ref: '#/components/responses/RateLimited' /api/analyze/v1/agreements/{agreement_id}: parameters: - $ref: '#/components/parameters/AgreementId' get: operationId: getAgreement tags: - Agreements summary: Retrieve a single agreement description: Retrieves the metadata and Smart Values for one processed agreement by its identifier. Confirmed. responses: '200': description: The requested agreement. content: application/json: schema: $ref: '#/components/schemas/Agreement' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/analyze/v2/agreements/{agreement_id}: parameters: - $ref: '#/components/parameters/AgreementId' patch: operationId: updateAgreement tags: - Agreements summary: Update an agreement description: Updates fields on an existing agreement. Confirmed (v2). requestBody: required: true content: application/json: schema: type: object additionalProperties: true responses: '200': description: The updated agreement. content: application/json: schema: $ref: '#/components/schemas/Agreement' '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' /api/analyze/v1/uploads/{upload_id}: parameters: - name: upload_id in: path required: true description: The identifier of the upload returned by the create-agreement step. schema: type: string get: operationId: getUpload tags: - Agreements summary: Retrieve upload status description: Retrieves the status of an in-progress or completed document upload. Confirmed. responses: '200': description: The upload status. content: application/json: schema: type: object additionalProperties: true '401': $ref: '#/components/responses/Unauthorized' '404': $ref: '#/components/responses/NotFound' components: schemas: AgreementCreateInput: type: object required: - name - file_name properties: name: type: string description: Display name of the agreement. file_name: type: string description: File name of the document being imported (DOCX or PDF). agreement_type: type: string description: The agreement type name. tags: type: array items: type: string parent_id: type: string description: Optional identifier of the parent agreement. AgreementList: type: object properties: data: type: array items: $ref: '#/components/schemas/Agreement' next_cursor: type: string Error: type: object properties: error: type: string message: type: string AgreementUpload: type: object properties: upload_id: type: string upload_url: type: string format: uri description: Presigned URL to PUT the binary document to. Agreement: type: object properties: id: type: string format: uuid name: type: string agreement_type: type: string tags: type: array items: type: string smart_values: type: object additionalProperties: true terms: type: object additionalProperties: true additionalProperties: true responses: NotFound: description: The requested resource was not found. content: application/json: schema: $ref: '#/components/schemas/Error' RateLimited: description: Rate limit exceeded (documented as ~15 requests/second, burst 30); returns a "Rate exceeded" error. content: application/json: schema: $ref: '#/components/schemas/Error' Unauthorized: description: Missing or invalid API key. content: application/json: schema: $ref: '#/components/schemas/Error' parameters: AgreementId: name: agreement_id in: path required: true description: The unique identifier (UUID) of the agreement. schema: type: string format: uuid securitySchemes: apiKeyAuth: type: apiKey in: header name: x-api-key description: LinkSquares API key passed as an `x-api-key` header on every request. Keys are self-managed by Administrator users and are shared across the Analyze and Finalize products.