Appearance
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
Field | Type | Description |
---|---|---|
code | integer | General error code indicating the type of error (e.g., 3001 for validation errors). |
message | string | Brief summary of the error. |
detail | string | Detailed explanation of what went wrong. |
docs | string | URL linking to detailed documentation about the error. |
errors | array | List of specific validation errors encountered. |
Common HTTP Status Codes
Code | Description |
---|---|
200 | Success |
400 | Bad Request - Invalid input |
401 | Unauthorized - Missing API key |
403 | Forbidden - Invalid API key |
404 | Not Found - Resource doesn't exist |
429 | Too Many Requests - Rate limit exceeded |
5xx | Server Error |
Common Error Types
Authentication Errors (2xxx)
Code | Description |
---|---|
2001 | Missing API key |
2002 | Invalid API key |
2003 | Rate limit exceeded |
Validation Errors (3xxx)
Code | Description |
---|---|
3001 | Invalid request payload |
3002 | Missing required fields |
3003 | Invalid 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
Parameter | Type | Description | Default | Constraints |
---|---|---|---|---|
size | integer | Number of records to return per page | 100 | Min: 1, Max: 500 |
page | integer | Page number to fetch | 1 | - |
order_by | string | Sort order for records | created_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
Operator | Description | Example |
---|---|---|
, (comma) | OR condition - matches any of the values | state=draft,agreement |
+ (plus) | AND condition - matches all values | state=draft+active |
= (equals) | Exact match | organization_id=ORG-123 |
Examples
- OR Conditions
http
GET /documents?state=draft,agreement
Returns resources matching either value
- AND Conditions
http
GET /documents?state=draft+active
Returns resources matching both values
- Multiple Fields
http
GET /documents?state=draft,agreement&organization_id=ORG-123
Returns resources matching either state AND the specific organization
- 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:
Field | Type | Description | Example |
---|---|---|---|
organization_id | string | Organization ID | organization_id=ORG-123 |
created_by | string | Creator's user ID | created_by=USER-123 |
updated_by | string | Last updater's user ID | updated_by=USER-123 |
created_at | timestamp | Creation date | created_at=1732827939000 |
updated_at | timestamp | Last update date | updated_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.
Resource | Description |
---|---|
Documents | Manage collections of documents with versioning capabilities |
Insights | AI-based document analysis and information extraction |
Document Versions soon | Control and track different versions of your Document |
Files soon | Handle 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
Name | Endpoint |
---|---|
List Documents | GET /documents |
Get Document | GET /documents/{document_id} |
Create Document | POST /documents |
Annotate Document | POST /documents/{document_id}/annotate |
Convert Document new | POST /documents/{document_id}/convert |
List Documents
Returns a list of Documents in your organization.
http
GET /documents
Query Parameters
This endpoint supports:
Additional parameters:
Field | Type | Description | Example |
---|---|---|---|
state | string | Filter by document state | state=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
Field | Type | Description | Required |
---|---|---|---|
document_id | string | ID of the Document | ✓ |
Query Parameters
Field | Type | Description | Default |
---|---|---|---|
version_number | integer | Specific version of the document to retrieve | Latest 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:
Field | Type | Description |
---|---|---|
version_number | integer | Current version number of the Document |
files | array<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:
Field | Type | Description |
---|---|---|
version_number | integer | Current version number of the Document |
files | array<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
Field | Type | Description | Required |
---|---|---|---|
name | string | Name of the document | ✓ |
files | array<File> | Initial file metadata. See note about upload_url | ✓ |
created_by | string | Unique identifier for the User | |
state | enum | Initial state of the document. Defaults to draft if not specified |
Important
- The
id
andupload_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
Field | Type | Description | Required |
---|---|---|---|
document_id | string | ID of the document to annotate | ✓ |
Request Body
Field | Type | Description | Required |
---|---|---|---|
field_values | object | Map 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
Field | Type | Description | Required |
---|---|---|---|
value | string|array | Value 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
Field | Type | Description |
---|---|---|
download_url | string | Signed URL to download the annotated file |
expires_at | number | Unix 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
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
Dropdown Fields
- Value must be a single string
- Must match one of the predefined options
URL Fields
- Value must be a valid URL string
- Must include protocol (http:// or https://)
Number Fields
- Value must be a valid number string
- Decimal values allowed (e.g., "1000.00")
SSN Fields
- Must follow format: XXX-XX-XXXX or XXXXXXXXX
- Digits only (besides hyphens)
Gender Fields
- Must match predefined options (e.g., "Male", "Female", "Other")
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
- Document is uploaded to your Harbour organization
Endpoint
http
POST /documents/{document_id}/convert
Path Parameters
Field | Type | Description | Required |
---|---|---|---|
document_id | string | ID of the document to convert | ✓ |
Query Parameters
Field | Type | Description | Required |
---|---|---|---|
format | string | Format to convert to (default: pdf ) | |
version_number | integer | Version number of the document to convert |
Response Body
Field | Type | Description |
---|---|---|
download_url | string | Signed URL to download the converted file |
expires_at | number | Unix 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:
- 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
- Document is being sent in base64 format without uploading to Harbour
Endpoint
http
POST /documents/convert
Request Body
Field | Type | Description | Required |
---|---|---|---|
file_base64 | string | Base64 of original docx document | ✓ |
filename | string | Original name of the document | ✓ |
final_format | string | Format to convert to (default: pdf ) |
Response Body
Field | Type | Description |
---|---|---|
file_base64 | string | Base64 of converted document |
filename | string | Updated 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:
- 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
Field | Type | Description |
---|---|---|
id | string | Unique identifier for the file |
name | string | Name of the file with extension |
type | string | MIME type of the file |
download_url | string | Signed URL to download the file |
upload_url | string | Signed 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
Field | Type | Description |
---|---|---|
id | string | Unique identifier for the User |
email | string | Email address of the User |
name | string | Full 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
Field | Type | Description |
---|---|---|
id | string | Unique identifier for the Document |
name | string | Name of the Document |
state | enum | Current state of the Document (draft, agreement) |
organization_id | string | ID of the organization that owns the Document |
created_at | unix timestamp | When the Document was created |
updated_at | unix timestamp | When the Document was last updated |
created_by | User object | Information about the user who created the Document |
updated_by | User object | Information about the user who last updated the Document |
version_number | integer | Current version number of the Document |
files | array<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
Name | Endpoint |
---|---|
Create Insights | POST /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
Field | Type | Description | Required |
---|---|---|---|
draft_id | string | Id of draft document in Harbour | ✓ |
completed_id | string | Id of completed agreement in Harbour (asset_id) | ✓ |
doc_text | string | document text | ✓ |
url | string | Url of a public document to analyze | ✓ |
context | string | context (background information) the model can use to generate insights | ✓ |
insights | list | List of insights to be extracted from the document | ✓ |
stream | bool | boolean 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 Name | Request Example | Response Example | Description |
---|---|---|---|
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
Active Development
- Latest version with ongoing feature additions
- Regular patches and minor updates
- Full support and validation
Maintenance Mode
- Previous major version
- Security updates and critical fixes only
- Basic support maintained
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
andupdated_by
optional in the request body. When not provided, the system will use the user that created the API key as fallback.
- Added
v2.3.0
December 9, 2024
Enhanced Documents Endpoints:
- Added examples for filtering with advanced query parameters, such as
state
andorganization_id
, and clarified pagination details. - Detailed the response structure, including
files
,version_number
, and metadata fields such ascreated_by
andupdated_by
when getting a Document. - Provided comprehensive explanations for required fields, such as
name
andfile
, and outlined the process of obtainingupload_url
for file uploads during Document creation.
- Added examples for filtering with advanced query parameters, such as
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