Skip to content

API Reference v2.3

Build powerful document management workflows with our developer-focused API

Our REST API provides a comprehensive set of endpoints for programmatically managing documents, e-signatures, and more. The API uses standard HTTP methods, returns JSON-encoded responses, and authenticates via API keys.

Introduction

Understand general concepts, response codes, and authentication strategies.

Base URL

The API is built on REST principles. We enforce HTTPS in every request to improve data security, integrity, and privacy. The API does not support HTTP.

All requests contain the following base URL:

bash
https://api.myharbourshare.com/v2

Authentication

To authenticate you need to add an x-api-key header with your API key:

bash
x-api-key: YOUR_API_KEY

Security Note

Your API keys carry many privileges, so be sure to keep them secure:

  • Never use API keys in client-side code, JavaScript, mobile apps, or public repositories
  • Store keys securely as environment variables or in secure configuration files
  • Limit API key access to only essential team members
  • Don't embed credentials directly in your code base, even if it's private
  • Rotate keys periodically and immediately if compromised
  • Monitor API key usage for suspicious activity

Errors

The Harbour API uses conventional HTTP status codes and provides standardized error responses following RFC7807.

Error Response Structure

json
{
  "code": 3001,
  "message": "Invalid request",
  "detail": "The request payload failed validation",
  "docs": "https://docs.harbourshare.com/errors/3001",
  "errors": [
    {
      "path": "field_values.email.value",
      "code": "email",
      "message": "Must be a valid email address.",
      "value": "invalid.email@",
      "internal_message": "Field 'Email' (ID: email) received an invalid email format.",
      "resolution": "Ensure the email follows the standard format (e.g., user@domain.com).",
      "docs": "https://docs.harbourshare.com/errors/validation/email"
    }
  ]
}

Error Response Fields

FieldTypeDescription
codeintegerGeneral error code indicating the type of error (e.g., 3001 for validation errors).
messagestringBrief summary of the error.
detailstringDetailed explanation of what went wrong.
docsstringURL linking to detailed documentation about the error.
errorsarrayList of specific validation errors encountered.

Common HTTP Status Codes

CodeDescription
200Success
400Bad Request - Invalid input
401Unauthorized - Missing API key
403Forbidden - Invalid API key
404Not Found - Resource doesn't exist
429Too Many Requests - Rate limit exceeded
5xxServer Error

Common Error Types


Authentication Errors (2xxx)
CodeDescription
2001Missing API key
2002Invalid API key
2003Rate limit exceeded
Validation Errors (3xxx)
CodeDescription
3001Invalid request payload
3002Missing required fields
3003Invalid field format

TIP

See our Error Reference for a complete list of error codes and handling strategies.

Pagination

API resources support pagination for GET methods using offset-based pagination with three main parameters:

Pagination Parameters

ParameterTypeDescriptionDefaultConstraints
sizeintegerNumber of records to return per page100Min: 1, Max: 500
pageintegerPage number to fetch1-
order_bystringSort order for recordscreated_at DESC-

Pagination Response Format

json
{
  "items": [
    { ... }, // Record objects
    { ... }
  ],
  "total": 50,        // Total number of records
  "page": 2,          // Current page number
  "size": 10,         // Records per page
  "pages": 5          // Total number of pages
}

Filtering

The API supports advanced filtering capabilities through query parameters. You can use different operators to create complex filter conditions:

Operators

OperatorDescriptionExample
, (comma)OR condition - matches any of the valuesstate=draft,agreement
+ (plus)AND condition - matches all valuesstate=draft+active
= (equals)Exact matchorganization_id=ORG-123

Examples

  1. OR Conditions
http
GET /documents?state=draft,agreement

Returns resources matching either value

  1. AND Conditions
http
GET /documents?state=draft+active

Returns resources matching both values

  1. Multiple Fields
http
GET /documents?state=draft,agreement&organization_id=ORG-123

Returns resources matching either state AND the specific organization

  1. Combined Operators
http
GET /documents?state=draft,agreement&created_by=USER-123+USER-456

Returns resources matching either state AND created by both users

Standard fields

The following fields support filtering for all resources:

FieldTypeDescriptionExample
organization_idstringOrganization IDorganization_id=ORG-123
created_bystringCreator's user IDcreated_by=USER-123
updated_bystringLast updater's user IDupdated_by=USER-123
created_attimestampCreation datecreated_at=1732827939000
updated_attimestampLast update dateupdated_at=1732827939000

Core resources

Below all are available Core Resources within Harbour's API. For each resource there should be an available endpoint to make requests to.

ResourceDescription
DocumentsManage collections of documents with versioning capabilities
InsightsAI-based document analysis and information extraction
Document Versions soonControl and track different versions of your Document
Files soonHandle individual files within Documents

📄 Documents

Documents allow you to manage collections of files and control access to them. Each document can have multiple versions and files.

Endpoints

NameEndpoint
List DocumentsGET /documents
Get DocumentGET /documents/{document_id}
Create DocumentPOST /documents
Annotate DocumentPOST /documents/{document_id}/annotate
Convert Document newPOST /documents/{document_id}/convert

List Documents

Returns a list of Documents in your organization.

http
GET /documents

Query Parameters

This endpoint supports:

Additional parameters:

FieldTypeDescriptionExample
statestringFilter by document statestate=draft,agreement
Response

Returns a paginated list of Document objects.

Note

Documents in the list response do not include files or version_number fields. To get these fields, use the Get Document endpoint.

Example Response
json
{
  "items": [
    {
      "id": "doc_80b6213a571e48f19e4da0f585799769",
      "name": "New name",
      "state": "draft",
      "organization_id": "ORG-HARBOURSTAGING",
      "created_at": 1732827939000,
      "updated_at": 1733766968000,
      "created_by": {
        "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
        "email": "caio@harbourshare.com",
        "name": "Caio Pizzol"
      },
      "updated_by": {
        "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
        "email": "caio@harbourshare.com",
        "name": "Caio Pizzol"
      }
    }
  ],
  "total": 77, // Total number of documents
  "page": 1, // Current page number
  "size": 50, // Number of items per page
  "pages": 2 // Total number of pages
}

Get Document

Retrieves a specific Document by ID. By default, returns the latest version of the document. It also performs several automatic operations:

  • Verify permissions
  • Generates download URL for the files
http
GET /documents/{document_id}
Path Parameters
FieldTypeDescriptionRequired
document_idstringID of the Document
Query Parameters
FieldTypeDescriptionDefault
version_numberintegerSpecific version of the document to retrieveLatest version
Response

Returns a complete Document object including files and version_number fields if found, otherwise returns a 404 error.

The response includes additional fields not present in the List Documents endpoint:

FieldTypeDescription
version_numberintegerCurrent version number of the Document
filesarray<File>Array of File objects associated with this Document

Example Request:

http
# Get latest version (default)
GET /documents/doc_80b6213a571e48f19e4da0f585799769

# Get specific version
GET /documents/doc_80b6213a571e48f19e4da0f585799769?version_number=3
Response

Returns a complete Document object including files and version_number fields if found, otherwise returns a 404 error.

The response includes additional fields not present in the List Documents endpoint:

FieldTypeDescription
version_numberintegerCurrent version number of the Document
filesarray<File>Array of File objects associated with this Document
Example Response
json
{
  "id": "doc_80b6213a571e48f19e4da0f585799769",
  "name": "New name",
  "state": "draft",
  "organization_id": "ORG-HARBOURSTAGING",
  "created_at": 1732827939000,
  "updated_at": 1733766968000,
  "created_by": {
    "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
    "email": "caio@harbourshare.com",
    "name": "Caio Pizzol"
  },
  "updated_by": {
    "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
    "email": "caio@harbourshare.com",
    "name": "Caio Pizzol"
  },
  "version_number": 7, // Only included in GET response
  "files": [
    // Only included in GET response
    {
      "id": "file_d4bade02fe724adfb66ba5478f9000c0",
      "name": "Page 2.docx",
      "type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      "download_url": "https://storage.googleapis.com/harbour-prod-webapp.appspot.com/..."
    }
  ]
}

Create Document

Creates a new document with its initial file. The endpoint performs several automatic operations:

  • Creates the document with initial metadata
  • Sets up permission structure
  • Generates upload URL for the file

Endpoint

http
POST /documents

Request Body

FieldTypeDescriptionRequired
namestringName of the document
filesarray<File>Initial file metadata. See note about upload_url
created_bystringUnique identifier for the User
stateenumInitial state of the document. Defaults to draft if not specified

Important

  • The id and upload_url fields will be generated and returned in the response. Do not include them in the request.
  • The response includes a pre-signed upload URL. See the File Upload Guide for detailed instructions on how to use this URL to upload your file content
Example Request
json
{
  "name": "My new document",
  "state": "draft",
  "files": [
    {
      "name": "sample.pdf",
      "type": "application/pdf"
    }
  ]
}
Response

Returns a Document object containing:

  • Generated document ID
  • Document metadata (name, state, timestamps)
  • File information with upload URL if file was specified
Example Response
json
{
  "id": "doc_ef1cebfc3d5043d78e2d98ea3ff6521c",
  "name": "My new document",
  "state": "draft",
  "organization_id": "ORG-HARBOURSTAGING",
  "created_at": 1733780836000,
  "updated_at": 1733780836000,
  "created_by": {
    "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
    "email": "caio@harbourshare.com",
    "name": "Caio Pizzol"
  },
  "updated_by": {
    "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
    "email": "caio@harbourshare.com",
    "name": "Caio Pizzol"
  },
  "files": [
    {
      "id": "file_722c11a4ff6b4732878dc233c66409af",
      "name": "sample.pdf",
      "type": "application/pdf",
      "upload_url": "https://storage.googleapis.com/documents/..."
    }
  ]
}

Annotate Document

This endpoint adds annotations on an existing document. You can annotate multiple fields in a single request.

Endpoint

http
POST /documents/{document_id}/annotate

Path Parameters

FieldTypeDescriptionRequired
document_idstringID of the document to annotate

Request Body

FieldTypeDescriptionRequired
field_valuesobjectMap of field annotations

The field_values object contains field annotations where:

  • Each key is a field identifier in the format agreementinput-{id}
  • Each value is an object containing the field value

Field Value Object

FieldTypeDescriptionRequired
valuestring|arrayValue to annotate the field with. Type depends on field type

Important

  • Field IDs must be unique within a request
  • Field IDs must follow the format agreementinput-{id}
  • Values must match the expected type for each field
  • For checkbox fields, value must be an array of selected options
  • For dropdown fields, value must be one of the predefined options

Response Body

FieldTypeDescription
download_urlstringSigned URL to download the annotated file
expires_atnumberUnix timestamp (milliseconds) when the download URL expires
Example Request
json
{
  "field_values": {
    "agreementinput-checkbox-input": {
      "value": ["Checkbox 1", "Checkbox 3"]
    },
    "agreementinput-dropdown-input": {
      "value": "Option 1"
    },
    "agreementinput-url-input": {
      "value": "https://harbourshare.com"
    },
    "agreementinput-fee-input": {
      "value": "1000.00"
    }
  }
}
Success Response
json
{
  "download_url": "https://cdn.harbourshare.com/files/annotated_doc.pdf?token=xyz",
  "expires_at": 1731342461000
}
Error Response
json
{
  "code": 3001,
  "message": "Invalid request",
  "detail": "The request payload failed validation",
  "docs": "https://docs.harbourshare.com/errors/3001",
  "errors": [
    {
      "path": "field_values.agreementinput-checkbox-input.value",
      "code": "checkbox_invalid_option",
      "message": "Contains invalid option.",
      "value": ["Checkbox 1", "Invalid Option"],
      "internal_message": "Invalid checkbox label: 'Invalid Option'",
      "resolution": "Select from available options: 'Checkbox 1', 'Checkbox 2', 'Checkbox 3'"
    }
  ]
}

Field Types and Validation

  1. Checkbox Fields

    • Value must be an array of strings
    • Each value must match one of the predefined options
    • No duplicate selections allowed
    • May have minimum/maximum selection requirements
  2. Dropdown Fields

    • Value must be a single string
    • Must match one of the predefined options
  3. URL Fields

    • Value must be a valid URL string
    • Must include protocol (http:// or https://)
  4. Number Fields

    • Value must be a valid number string
    • Decimal values allowed (e.g., "1000.00")
  5. SSN Fields

    • Must follow format: XXX-XX-XXXX or XXXXXXXXX
    • Digits only (besides hyphens)
  6. Gender Fields

    • Must match predefined options (e.g., "Male", "Female", "Other")
  7. Image Fields

    • Value must be a base64-encoded string with proper header (e.g., "data:image/jpeg;base64,...")
    • Only JPG and PNG formats supported
    • Maximum file size: 10MB per image
    • For multiple images, value must be an array of base64 strings
    • Base64 content must be valid and decodable

Convert Document new

This endpoint converts a document to a specified format and returns a download URL for the converted file.
There are 2 ways to use it: first, if a document is uploaded to your Harbour organization; second, if you want to use it without uploading to the Web App.

Options

  1. Document is uploaded to your Harbour organization

Endpoint

http
POST /documents/{document_id}/convert

Path Parameters

FieldTypeDescriptionRequired
document_idstringID of the document to convert

Query Parameters

FieldTypeDescriptionRequired
formatstringFormat to convert to (default: pdf)
version_numberintegerVersion number of the document to convert

Response Body

FieldTypeDescription
download_urlstringSigned URL to download the converted file
expires_atnumberUnix timestamp (milliseconds) when the download URL expires

Important

  • The document must be in a format that can be converted to the requested output format
  • You must have permission to view the document to convert it
  • The download URL is temporary and will expire at the time specified in expires_at
Example Request
POST /documents/doc123/convert?format=pdf&version_number=2
Success Response
json
{
  "download_url": "https://cdn.harbourshare.com/files/converted_doc.pdf?token=xyz",
  "expires_at": 1731342461000
}
Error Response
json
{
  "code": 3001,
  "message": "Invalid request",
  "detail": "No convertible files found in this document or conversion failed.",
  "docs": "https://docs.harbourshare.com/errors/3001"
}

Supported Formats

The API currently supports the following conversion formats:

  1. PDF
    • Convert documents to PDF format
    • Maintains formatting and layout of the original document
    • Default format if none specified

Notes

  • Conversion operations are asynchronous and may take a few seconds to complete
  • If you request a version that doesn't exist, the API will return a 404 error
  • Document must be accessible to the authenticated user or API key
  1. Document is being sent in base64 format without uploading to Harbour

Endpoint

http
POST /documents/convert

Request Body

FieldTypeDescriptionRequired
file_base64stringBase64 of original docx document
filenamestringOriginal name of the document
final_formatstringFormat to convert to (default: pdf)

Response Body

FieldTypeDescription
file_base64stringBase64 of converted document
filenamestringUpdated filename with proper format

Important

  • The document must be in a format that can be converted to the requested output format
  • The Base64 string should be valid
Example Request
json
POST /documents/convert

{
  "file_base64": "UEsDBBQABgAIAAAAIQDTutUjug...",
  "filename": "example_document.docx",
  "final_format": "pdf"
}
Success Response
json
{
  "file_base64": "JVBERi0xLjcKJcOkw7zDtsOfCjIgMCBvYmoK...",
  "filename": "example_document.pdf"
}
Error Response
json
{
    "code": 3001,
    "message": "Invalid request",
    "detail": "The request payload failed validation. Please check the errors array for details.",
    "docs": "https://docs.harbourshare.com/errors/3001",
    "errors": [
        {
            "path": "file_base64",
            "code": "custom",
            "message": "file_base64 must be a valid Base64-encoded string",
            "internal_message": "Validation error: value_error",
            "resolution": "Provide a valid value that meets all requirements",
            "docs": "https://docs.harbourshare.com/errors/#custom"
        }
    ]
}

Supported Formats

The API currently supports the following conversion formats:

  1. PDF
    • Convert documents to PDF format
    • Maintains formatting and layout of the original document
    • Default format if none specified

Notes

  • Conversion operations are asynchronous and may take a few seconds to complete
  • If the base64 is invalid, the conversion won't be possible
  • This approach is secure as data is not persisted and uploading a document is not required

Core objects

File Object

The File object represents a file stored in Harbour.

Attributes

FieldTypeDescription
idstringUnique identifier for the file
namestringName of the file with extension
typestringMIME type of the file
download_urlstringSigned URL to download the file
upload_urlstringSigned URL to upload the file

Example

json
{
  "id": "file_d4bade02fe724adfb66ba5478f9000c0",
  "name": "Page 2.docx",
  "type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
  "download_url": "https://storage.googleapis.com/harbour-prod-webapp.appspot.com/..."
}

User Object

The User object represents a user in Harbour's system.

Attributes

FieldTypeDescription
idstringUnique identifier for the User
emailstringEmail address of the User
namestringFull name of the User

Example

json
{
  "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
  "email": "caio@harbourshare.com",
  "name": "Caio Pizzol"
}

Document Object

The Document object represents a document in Harbour's system. It can contain multiple files and collaborators.

Attributes

FieldTypeDescription
idstringUnique identifier for the Document
namestringName of the Document
stateenumCurrent state of the Document (draft, agreement)
organization_idstringID of the organization that owns the Document
created_atunix timestampWhen the Document was created
updated_atunix timestampWhen the Document was last updated
created_byUser objectInformation about the user who created the Document
updated_byUser objectInformation about the user who last updated the Document
version_numberintegerCurrent version number of the Document
filesarray<File>Array of File objects associated with this Document

Example

json
{
  "id": "doc_80b6213a571e48f19e4da0f585799769",
  "name": "New name",
  "state": "draft",
  "organization_id": "ORG-HARBOURSTAGING",
  "created_at": 1732827939000,
  "updated_at": 1733766968000,
  "created_by": {
    "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
    "email": "caio@harbourshare.com",
    "name": "Caio Pizzol"
  },
  "updated_by": {
    "id": "HWAGEzg7iFec1heYWQjWZMLFj2ViqG2",
    "email": "caio@harbourshare.com",
    "name": "Caio Pizzol"
  },
  "version_number": 7,
  "files": [
    {
      "id": "file_d4bade02fe724adfb66ba5478f9000c0",
      "name": "Page 2.docx",
      "type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
      "download_url": "https://storage.googleapis.com/harbour-prod-webapp.appspot.com/..."
    }
  ]
}

❇️ Insights

Insights allow you to create AI-based document analysis and information extractions. You can create a custom prompt to answer any question you have about the document.

Endpoints

NameEndpoint
Create InsightsPOST /insights

Create Insights

Creates a new insights from provided completed document, draft or url. The endpoint performs several automatic operations:

  • Extract important document insights and information
  • Index the document insights for future search (soon)
  • Detect bounding boxes for extracted fields, dates, fees and any other requested information

Endpoint

http
POST /insights

Request Body

FieldTypeDescriptionRequired
draft_idstringId of draft document in Harbour
completed_idstringId of completed agreement in Harbour (asset_id)
doc_textstringdocument text
urlstringUrl of a public document to analyze
contextstringcontext (background information) the model can use to generate insights
insightslistList of insights to be extracted from the document
streamboolboolean value of whether you need the insights to be streamed or not

Important

  • One of the following fields should be provided: draft_id, document_id, doc_text url.

Insight Types

List of available insights

Below are the available insight types that can be extracted using the /insights endpoint.

Insight NameRequest ExampleResponse ExampleDescription
document_title{ "type": "document_title" }{ "document_title": [{ "title": "NDA", "source": "AI" }] }Extracts the document's title from its content or metadata.
document_type{ "type": "document_type" }{ "document_type": "NDA" }Classifies the document type based on content.
document_ids{ "type": "document_ids" }{ "md5_hash": "abcd1234", "docx_guid": "1234-5678" }Returns unique document identifiers.
document_signers{ "type": "document_signers" }{ "signers": [{ "name": "Ada Lovelace", "role": "Talent" }] }Lists the document's signers and their roles.
document_fields{ "type": "document_fields" }{ "fields": [{ "type": "signature", "page": 1 }] }Identifies and extracts fields.
document_clauses{ "type": "document_clauses" }{ "clauses": [{ "type": "confidentiality", "text": "..." }] }Extracts contract clauses and legal terms.
custom_prompt{ "type": "custom_prompt", "message": "get event location" }{ "response": "San Francisco, CA" }Runs a custom AI query.
contract_values{ "type": "contract_values" }{ "value": { "amount": 10000, "currency": "USD" } }Extracts financial values.
contract_expiration_dates{ "type": "contract_expiration_dates" }{ "date": "2025-12-12" }Extracts contract expiration dates.
contract_renewal_dates{ "type": "contract_renewal_dates" }{ "date": "2026-01-01" }Extracts contract renewal dates.
contract_limit_of_liability{ "type": "contract_limit_of_liability" }{ "years": 5 }Extracts contract liability limits.
contract_renewal_term_length{ "type": "contract_renewal_term_length" }{ "years": 3 }Identifies contract renewal term lengths.
payment_due_date{ "type": "payment_due_date" }{ "date": "2025-07-15" }Extracts payment due date.
organization_matching_documents{ "type": "organization_matching_documents" }{ "asset_id": "xyz123" }Finds related documents within the organization.
Example Request
json
{
    "draft_id": "doc_9d6ea5f1ab7a47f2a2197d628d1591ba",
    "insights": [
        {"type":"document_ids"},
        {"type":"document_title"},
        {"type":"document_type"},
        {"type":"document_signers"},
        {"type":"document_fields"},
        {"type":"document_clauses"},
        {"type":"contract_values"},
        {"type":"document_dates"},
        {"type":"limit_of_liability"},
        {"type":"renewal_term_length"},
        {"type":"payments"}
    ]
}
Response

Returns an Insight object containing:

  • Requested insights
Example Response
json
{
    "document_title": [
        {
            "title": "DAVID GEFFEN HALL: ARTIST PERFORMANCE AGREEMENT",
            "title_source": "AGREEMENT TEXT",
            "page_number": 1,
            "reasoning": null,
            "confidence_score": 0.9
        }
    ],
    "document_type": [
        {
            "document_type": "Performance Agreement",
            "page_number": 1,
            "reasoning": null,
            "confidence_score": 0.8
        }
    ],
    "document_ids": {
        "md5_hash": "//ODJj61n1CPB+es0jKvCw==",
        "crc32c": "tvjQXA==",
        "docx_guid": null,
        "create_datetime": 1744138578.482,
        "PDF_HBREF": null,
        "mime_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    },
    "document_signers": [
        {
            "signer_index": null,
            "signer_id": "signer_id738492",
            "signer_full_name": "Jordana Leigh",
            "first_name": "Jordana",
            "last_name": "Leigh",
            "email": null,
            "signer_role": "Vice President, Artistic Programming",
            "is_agreement_owner": true,
            "page_number": 1,
            "reasoning": null,
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "signer_full_name": "[ARTIST NAME]",
            "first_name": null,
            "last_name": null,
            "email": null,
            "signer_role": "ARTIST",
            "is_agreement_owner": false,
            "page_number": 1,
            "reasoning": null,
            "confidence_score": 0.8
        }
    ],
    "document_fields": [
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-7d008f8990e94810a4476e5a47b5791b-9a84326bb6a642489a7385b7201c3e8d",
            "field_type": "NAMETEXTINPUT",
            "field_label": "Artist Name",
            "field_value": "__________________________________________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[7]/w:r[1]/w:t[3]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-07d509c8d8134522a96928a83a7e5e5b-c6c3d2582b9d4f929f482b44376c1804",
            "field_type": "ADDRESSTEXTINPUT",
            "field_label": "Address",
            "field_value": "______________________________________________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[8]/w:r[1]/w:t[3]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-f0b6269dd292480796c565758824079e-6463e815e397415081cb9c534f876a56",
            "field_type": "PHONETEXTINPUT",
            "field_label": null,
            "field_value": "______",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[8]/w:r[3]/w:t[1]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-d7510f1605af447db8d514f6453f8064-a4097201005c4965b5572423836c0e1d",
            "field_type": "PHONETEXTINPUT",
            "field_label": "Primary Contact Name and Phone Number",
            "field_value": "________________________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[9]/w:r[1]/w:t[3]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-e73aa476505548f7a1b0825ef6216b23-d4877883e7c74c548d50d219ef1054db",
            "field_type": "EMAILTEXTINPUT",
            "field_label": "Email",
            "field_value": "______________________________________________________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[10]/w:r/w:t[3]",
            "confidence_score": 0.9
        },
        {
            "signer_index": null,
            "signer_id": "signer_id738492",
            "field_id": "agreementinput-a6551b3a2e7c49098dd1f953f18c57d5-373a735a89b140729812165d9b523778",
            "field_type": "FREETEXTINPUT",
            "field_label": "INSERT DETAIL",
            "field_value": "[INSERT DETAIL]",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[73]/w:sdt[3]/w:sdtContent/w:r/w:t[1]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-5c6a4347363b49b2a69c07217f45369f-6c5d6d971a5a4d27a5ff2ff26839265a",
            "field_type": "NAMETEXTINPUT",
            "field_label": "ARTIST NAME",
            "field_value": "[ARTIST NAME]",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[219]/w:r[3]/w:t[1]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-9a82b03a89a04828af5433c3f5187975-0d5b96720685439381d104294f919111",
            "field_type": "SIGNATUREINPUT",
            "field_label": null,
            "field_value": "_______________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[222]/w:r[1]/w:t[3]",
            "confidence_score": 0.9
        },
        {
            "signer_index": null,
            "signer_id": "signer_id738492",
            "field_id": "agreementinput-18b0817a75c74741a9b1c083c9341320-f2d04c9393e04d47bb03e94aa7c982c4",
            "field_type": "SIGNATUREINPUT",
            "field_label": null,
            "field_value": "___________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[222]/w:r[1]/w:t[6]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-a5e40f7783a54cfb9258081387e62978-3c0c5135738c41c4993e3d347d5761a2",
            "field_type": "NAMETEXTINPUT",
            "field_label": "Print Name",
            "field_value": "____________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[223]/w:r/w:t[4]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-a0e66c9485154832a988f45712d926f7-e16706f899224859b9c1e9bb115d9869",
            "field_type": "ADDRESSTEXTINPUT",
            "field_label": "Address",
            "field_value": "______________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[224]/w:r/w:t[4]",
            "confidence_score": 0.9
        },
        {
            "signer_index": 0,
            "signer_id": "signer_id847593",
            "field_id": "agreementinput-55e70d76f2ba49e9aa9f760723c751ef-cf56b2f9b06d4f22b146d6d3390e82d8",
            "field_type": "ADDRESSTEXTINPUT",
            "field_label": null,
            "field_value": "______________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[225]/w:r/w:t[1]",
            "confidence_score": 0.9
        },
        {
            "signer_index": null,
            "signer_id": "signer_id738492",
            "field_id": "agreementinput-e6236a542a914632a456f1e7bb81c357-fd7c1f7b2a1b45308d697e2b65e819d1",
            "field_type": "ADDRESSTEXTINPUT",
            "field_label": null,
            "field_value": "______________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[226]/w:r/w:t[1]",
            "confidence_score": 0.9
        },
        {
            "signer_index": null,
            "signer_id": "signer_id738492",
            "field_id": "agreementinput-3041b1ebf6614a1eb4927a7c8942f551-5734b82c953c490f84ba087c31403097",
            "field_type": "CHECKTEXTINPUT",
            "field_label": "CHECK MADE PAYABLE TO",
            "field_value": "_____________________________________",
            "page_number": null,
            "reasoning": null,
            "bounding_box": null,
            "xml_path": "/w:body/w:p[229]/w:r/w:t[1]",
            "confidence_score": 0.9
        }
    ],
    "document_fields_pages": null,
    "document_clauses": [
        {
            "clause_type": "Performance",
            "clause_description": "Artist shall perform one (1) set of seventy-five (75) minutes in length and shall be responsible for hiring and compensating all additional artists necessary for the Performance(s) (the "Artist Ensemble"). Artist and Artist Ensemble shall adhere to the reasonable direction of LCPA or its designee.",
            "paragraph_index": "12",
            "page_number": 2,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Fees",
            "clause_description": "The fee for all the services and rights granted in this Agreement will be [$ 0,000.00] (the "Fee") payable to Artist in the form of a check by mail or wire transfer: (a) within five (5) business days after LCPA's receipt of a fully executed contract, applicable payment information (tax forms, bank information, etc.), or (b) within five (5) business days after the Performance(s), whichever is later.",
            "paragraph_index": "27",
            "page_number": 4,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Publicity",
            "clause_description": "Artist shall not begin publicizing and promoting the Performance(s) until the official announcement date determined by LCPA.  Artist shall participate and reasonably cooperate with LCPA in any joint marketing and promotional activities reasonably requested by LCPA, in advance of the Performance(s). The Parties agree to work together to promote the Performance(s) including but not limited to promotion on social media platforms, to the extent such platforms are used by Artist and/or Artist Ensemble.",
            "paragraph_index": "36",
            "page_number": 5,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Artist Right to Photograph and Record",
            "clause_description": "Should Artist and/or Artist Parties desire to photograph and/or record the Performance(s) and ancillary Performance related activities at the Venue, Artist shall notify LCPA in advance and in writing and specify the type of device Artist intends to use, no less than fourteen (14) days before the Performance(s). LCPA reserves the right to approve or deny any such request in its sole discretion.",
            "paragraph_index": "45",
            "page_number": 6,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Force Majeure/Cancellation",
            "clause_description": "If the Performance(s) are prevented by: Artist's and Artist Ensemble failure for any reason to be available for the rehearsal(s) or the Performance(s) provided for herein (except for Force Majeure Event (defined below) determined by LCPA), LCPA shall have no obligation or liability to Artist for payment of the fees provided for in this Agreement nor shall LCPA be obligated to reschedule the Performance(s); or Accident, riots, civil unrest, insurrection, war, terrorist act, act or order of any public authority, strikes, lockouts, other labor difficulties, fire, flood, epidemics, natural disasters, acts of God, widespread power shortages/outages or other conditions or events, similar or dissimilar, or any threat thereof, beyond LCPA's control ("Force Majeure Event"), Artist shall be entitled to and LCPA shall pay fifty (50) percent of Fee without any further performance required under this agreement.",
            "paragraph_index": "48",
            "page_number": 7,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Indemnification",
            "clause_description": "Artist hereby agrees to defend (by counsel reasonably satisfactory to LCPA), indemnify and hold LCPA, its officers, directors, employees and agents ("LCPA Indemnitees") harmless from and against (and shall pay the full amount of) any and all liability, claims, proceedings, damages, losses, obligations, and expenses, including but not limited to outside attorneys' fees, disbursements and other litigation-related expenses, judgments and settlements relating to any claim arising out of or in connection with: Artist's actual or alleged breach of any of the representations, warranties and/or agreements set forth herein;",
            "paragraph_index": "53",
            "page_number": 8,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Limitation on Liability",
            "clause_description": "LCPA shall not be responsible or have any liability for any loss of or damage to instruments, equipment or other personal property of Artist and/or Artist Parties entrusted to any person employed by LCPA, or kept or placed anywhere within the LCPA complex or other venue used in connection with this Agreement.  Any property insurance on any of the foregoing instruments, equipment and other personal property must contain a waiver of subrogation against the LCPA Indemnitees.",
            "paragraph_index": "54",
            "page_number": 8,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Artist Parties",
            "clause_description": "Artist shall be solely responsible for Artist Parties and Artist shall compensate all such persons for their services in connection with this Agreement and shall comply with and satisfy all terms of collective-bargaining or other union or guild agreements, if any, covering or applicable to the employment of such persons, including terms relating to wages, working conditions, and fringe benefits.",
            "paragraph_index": "55",
            "page_number": 9,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Confidentiality",
            "clause_description": "The provisions of this Agreement are confidential, except as otherwise expressly contemplated herein, and neither party shall disclose the Agreement or any portion thereof to any third party (other than its own legal counsel or financial representatives), except as required by law, or except to any Artist Parties on a "need-to-know" basis in connection with the performance of this Agreement.",
            "paragraph_index": "56",
            "page_number": 9,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Governing Law",
            "clause_description": "This Agreement and all matters collateral to this Agreement will be governed by and construed in accordance with the laws of the State of New York applicable to contracts made and to be performed solely in New York (without giving effect to any conflict of laws principles under New York law).  The Parties agree that the sole and exclusive jurisdiction of any action or suit in connection with the Agreement or any claim, dispute or controversy arising therefrom or in connection therewith will lie in State or Federal Court located in the County of New York, State of New York.",
            "paragraph_index": "57",
            "page_number": 10,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Severability",
            "clause_description": "If any term or provision of this Agreement is held to be invalid, illegal, or unenforceable, the validity, legality and enforceability of the remaining terms and provisions will not in any way be affected or impaired thereby and will be valid and enforced to the fullest extent permitted by law.",
            "paragraph_index": "58",
            "page_number": 10,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Relationship of the Parties",
            "clause_description": "Artist shall not incur any obligation in LCPA's name.  No act of the Parties hereto shall be construed as creating or establishing a partnership, joint venture, employer-employee or any other relationship other than that of an independent contractor between Artist and LCPA.  Artist understands and agrees that Artist, and not LCPA, is the employer of Artist Parties.",
            "paragraph_index": "59",
            "page_number": 10,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        },
        {
            "clause_type": "Waiver; Modification",
            "clause_description": "No waiver or modification of any of the terms of this Agreement shall be valid unless in writing and signed by the Parties hereto.  No waiver by either party of a breach hereof or a default hereunder shall be deemed a waiver by such party of a subsequent breach or default of like or unlike or similar or dissimilar nature.",
            "paragraph_index": "60",
            "page_number": 10,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        }
    ],
    "custom_prompt": null,
    "contract_values": [
        {
            "contract_value_type": "Total Contract Value",
            "contract_value_label": "Fee",
            "contract_value": 0,
            "currency": "USD",
            "contract_value_usd": 0,
            "page_number": 13,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        }
    ],
    "document_dates": [
        {
            "date_type": "effective_date",
            "date_label": null,
            "date_value": "[MONTH] [DAY], [YEAR]",
            "date_epochms": null,
            "page_number": 3,
            "confidence_score": 0.9,
            "insertion_positions": null,
            "reasoning": null
        }
    ],
    "limit_of_liability": [
        {
            "limit_type": "General",
            "limit_label": null,
            "limit_value": "0",
            "page_number": 19,
            "confidence_score": 0.8,
            "insertion_positions": null,
            "reasoning": null
        }
    ],
    "renewal_term_length": [],
    "payments": [
        {
            "payment_type": "Fee",
            "payment_label": null,
            "payment_value": "$ 0,000.00",
            "payment_value_number": 0,
            "payment_value_usd": 0,
            "payment_currency": "USD",
            "page_number": 13,
            "confidence_score": 0.9,
            "reasoning": null
        },
        {
            "payment_type": "Travel",
            "payment_label": "Travel Buyout",
            "payment_value": "AMOUNT USD ($ 000.00)",
            "payment_value_number": 0,
            "payment_value_usd": 0,
            "payment_currency": "USD",
            "page_number": 14,
            "confidence_score": 0.9,
            "reasoning": null
        }
    ],
    "signed_url": "https://storage.googleapis.com/documents-depot/insights/annotated_docx/file_5cac9c43829e4d54a12d61f6e2f56892?X-Goog-Algorithm=GOOG4-RSA-SHA256&X-Goog-Credential=191591660773-compute%40developer.gserviceaccount.com%2F20250414%2Fauto%2Fstorage%2Fgoog4_request&X-Goog-Date=20250414T194812Z&X-Goog-Expires=900&X-Goog-SignedHeaders=host&X-Goog-Signature=002e10544920705dbb04101e39a659a348f114ce5cf9c4e71451b01835ddb28573315c8e8f06c74d6bbe3a46f000e052a99e682173d9c554b141b8ed898b18f0f1c0614bd55419eeecd6753fcf89b6b2419d5c0d21a7439e24323625238f48fca152ca5bde70b4a34ec757338fd2b106f22e1831f29f28f2da8d1e813f41870c63fbedf95d3e067d9ffb1cc417d88562f541d20c09c0d81cc98cd9d1e6ca2ef8aedc78aa9a9153189ffbb5ff09abb33d5e11b8f08acc2fc3648d4ea1e7a7a084395f9cac7828bbeecda46d85bd4502a98ea0f24dea32a8a522a2f181f394bda6f18c9efb78c621062c584e4127b1922784b312bd656b39ccbae398283bcb0f4a"
}

Versioning Policy

Our API uses semantic versioning to provide a predictable and consistent experience as we evolve our services. This policy explains how we manage changes and what to expect from different types of updates.

Version Format

We use a three-part version number: vMAJOR.MINOR.PATCH

For example: v2.1.0

  • MAJOR: Breaking changes
  • MINOR: New features, backwards-compatible
  • PATCH: Bug fixes, backwards-compatible

Types of Changes

1. Patch Updates (Current Version)

Changes that don't require a version bump and are automatically available:

  • Adding new endpoints
  • Adding optional request parameters
  • Adding new response fields (when null by default)
  • Reordering existing response fields
  • Adding new resources
  • Bug fixes and performance improvements

INFO

Patch updates are automatically available to all API users and require no changes to your integration.

2. Minor Version Updates

Backwards-compatible changes that add functionality:

  • Adding required response fields
  • New features and capabilities
  • Enhanced validation rules
  • Additional authentication methods
  • New event types or webhooks

INFO

Minor updates are opt-in. Your existing integration will continue to work, but you can upgrade to access new features.

3. Major Version Updates

Breaking changes that require client updates:

  • Removing endpoints or features
  • Changing resource names
  • Changing field types
  • Changing authentication mechanisms
  • Adding required fields
  • Modifying existing validations

INFO

Major version updates require careful planning and updates to your integration code. We provide detailed migration guides and extended support for previous major versions.

Version Lifecycle

  1. Active Development

    • Latest version with ongoing feature additions
    • Regular patches and minor updates
    • Full support and validation
  2. Maintenance Mode

    • Previous major version
    • Security updates and critical fixes only
    • Basic support maintained
  3. Deprecated

    • Advance notice given (minimum 6 months)
    • Limited to critical security fixes
    • Migration validation available

Best Practices

  • Monitor our change log for updates
  • Test integrations in sandbox before upgrading
  • Plan ahead for major version migrations

Version Stability Promise

We commit to:

  • Never making breaking changes within a major version
  • Maintaining backwards compatibility in minor releases
  • Providing detailed migration guides for major updates
  • Giving advance notice before deprecating features
  • Supporting at least one previous major version

Changelog

v2.3.1 new

May 5, 2025

  • Documents Endpoints:
    • Added files to the response structure (now accepting array of files)
    • Made created_by and updated_by optional in the request body. When not provided, the system will use the user that created the API key as fallback.

v2.3.0

December 9, 2024

  • Enhanced Documents Endpoints:

    • Added examples for filtering with advanced query parameters, such as state and organization_id, and clarified pagination details.
    • Detailed the response structure, including files, version_number, and metadata fields such as created_by and updated_by when getting a Document.
    • Provided comprehensive explanations for required fields, such as name and file, and outlined the process of obtaining upload_url for file uploads during Document creation.
  • File Upload Guide: Introduced a dedicated file upload guide, providing step-by-step instructions for obtaining upload URLs, uploading files, and understanding related best practices.

v2.2.0

November 15, 2024

New Features

  • Enhanced error responses with:
    • Detailed internal messages
    • Resolution steps
    • Validation links
  • Added comprehensive validation for:
    • Image fields (format, size, dimensions)
    • Checkbox selections (duplicates, min/max)
    • Field formats (SSN, URLs, numbers)

Validation

  • Added detailed validation error validation
  • Enhanced field types specifications and validation rules
  • Updated API examples with new payload format

v2.1.0

November 8, 2024

This release introduces file annotation capabilities and includes several improvements to the API validation.

New Features

Added file annotation capabilities:

  • New endpoint POST /documents/{document_id}/annotate
  • Support for multiple field annotations in a single request
  • Secure download URLs for annotated documents

Validation Updates

  • Added comprehensive validation for file annotations
  • Improved API versioning policy section
  • Enhanced error handling validation with examples

API Improvements

  • Improved error responses
  • Updated request/response examples

v2.0.0

October 15, 2024

Initial release of Harbour API v2, featuring a complete redesign of our file management API.

python
print("Hello World v2.0")
  • Complete API redesign with improved developer experience
  • New Documents system for file versioning
  • Enhanced error handling and validation
  • Comprehensive validation with examples

© 2025 Harbour Enterprises, Inc. 💙💛