Uploading Contracts to Tabs via API

Last updated: June 9, 2026

A one-page guide for merchants using HubSpot, Salesforce, and QuickBooks


Overview

Tabs supports multiple ways to get contracts into the platform. Your CRM integrations can automatically sync contract documents from closed deals — and you can also upload contracts directly through the Tabs Integrators API when that fits your workflow better.

Channel

What it does

HubSpot integration

Automatically syncs PDFs from closed-won Deals

Salesforce integration

Automatically syncs contract documents from configured Salesforce opportunities

Tabs Integrators API

Lets you upload contracts programmatically from any source

QuickBooks

Handles accounting downstream (invoices, customers) — it does not upload contracts into Tabs

All three inbound channels (HubSpot, Salesforce, API) feed into the same Tabs contract processing pipeline. QuickBooks remains your ERP layer after contracts are processed.

Note: For contracts that already live in your CRM, letting your CRM integration handle sync is usually the simplest path. The API is best suited for contracts that fall outside CRM — or whenever your team has a specific workflow that calls for a direct upload.


When to use the API vs. your CRM

Situation

Recommended approach

Contract PDF is on a closed-won HubSpot Deal

Let HubSpot sync handle it

Contract PDF is on a closed Salesforce Opportunity

Let Salesforce sync handle it

Contract is not in your CRM (legacy agreements, partner paper, amendments, one-offs, internal sources)

Upload via API

You have a custom workflow that requires uploading a contract directly (e.g. a proprietary system, batch migration, or operational process outside CRM)

Upload via API — your CRM sync can continue running alongside

One deal has multiple PDFs

CRM sync creates one Tabs contract per file — use the API for any additional documents your CRM won't sync

Avoiding duplicates: CRM sync skips files it has already ingested. API uploads without a CRM external ID are treated as separate contracts. If the same file could arrive through both channels, link them explicitly (see Step 5).


Prerequisites

Before uploading, confirm you have:

  1. Tabs API key — provided by your Tabs team

  2. API base URL

    • Production: https://integrators.prod.api.tabsplatform.com

    • Development: https://integrators.dev.api.tabsplatform.com

  3. A Tabs customer ID — required for every contract

    • Customers are often already in Tabs from HubSpot or Salesforce sync (you'll see these as Created by HUBSPOT or similar in the UI)

    • You can also create customers via POST /v3/customers

  1. A valid PDF — must be a real PDF file (max ~50 MB)

Authentication: Include your API key in the Authorization header on every request.


Upload in two steps

Tabs uses a two-step upload: create the contract record, then attach the PDF.

Step 1 — Create the contract

POST /v3/contracts
Content-Type: application/json

{
"name": "Acme - 2026 Order Form",
"customerId": "{your-tabs-customer-uuid}",
"closeDate": "2026-01-15"
}

Save the id from the response. The contract is created with status NEW; processing has not started yet.

Step 2 — Upload the PDF

POST /v3/contracts/{contract-id}/file?shouldProcess=true
Content-Type: multipart/form-data

file: <your-contract.pdf>

With shouldProcess=true (the default), Tabs stores the file and begins contract processing. The response includes a jobId you can use to track progress.


Verify the upload

Action

Endpoint

Check contract status

GET /v3/contracts/{contract-id}

List all contracts

GET /v3/contracts

Download the uploaded file

GET /v3/contracts/{contract-id}/file

You can also confirm the contract appears under the customer in the Tabs dashboard.


Step 5 — Using the API alongside your CRM

Your CRM integrations keep running on their normal schedule. You do not need to disable HubSpot or Salesforce sync to use the API.

Typical pattern: Let CRM handle CRM-sourced contracts, and use the API for everything else — whatever your team's reason. Common examples include legacy contracts, documents from systems outside your CRM, batch imports, or any internal process where a direct upload makes more sense.

If a contract could appear in both places

This is uncommon, but if the same file might be ingested by CRM sync and uploaded via API, you have a few options:

Option A — Split by source (most common): CRM sync handles CRM deals; API handles non-CRM contracts. No overlap, no extra steps.

Option B — Link after API upload: If you've uploaded via API and want CRM sync to recognize it as the same document, attach the CRM file ID:

PATCH /v3/contracts/{contract-id}

{
"externalId": "{crm-file-or-attachment-id}",
"sourceType": "HUBSPOT"
}

Use "sourceType": "SALESFORCE" for Salesforce attachments. Future CRM syncs will skip that file.

Option C — Check before uploading:

GET /v3/contracts?filter=externalIds.externalId:{crm-attachment-id}

If a match exists, skip the upload.

How CRM sync handles customers

HubSpot and Salesforce syncs create and update customers automatically before syncing contracts — which is why you may see customers labeled Created by HUBSPOT in the UI. Contract sync then links each deal to that customer record. For API uploads, you need an existing Tabs customerId (often one your CRM sync already created).

CRM sync behavior to keep in mind

  • One PDF = one contract. Multiple attachments on a single deal create multiple Tabs contracts.

  • Only eligible deals sync. HubSpot syncs closed-won Deals; Salesforce syncs based on your configured opportunity criteria.

  • Customer sync must be enabled. If customer sync is off or a company hasn't synced yet, CRM contract sync may skip that deal.


QuickBooks note

QuickBooks does not upload contracts into Tabs. After a contract is processed, billing terms, invoices, and revenue data may sync to QuickBooks per your ERP configuration. Customers created by HubSpot may show EXISTS IN QBO once linked to QuickBooks — that's the ERP connection working downstream, separate from how the contract arrived in Tabs.


Quick reference

New contract to ingest

Screenshot 2026-06-09 at 11.59.48 AM.png

Common issues

Issue

What to do

Duplicate contracts

Split sources (CRM vs. API), or link a CRM externalId after API upload

Missing customerId

Look up via GET /v3/customers, or create one via the Customers API

Upload rejected

Confirm the file is a valid PDF starting with %PDF-

Processing didn't start

Complete Step 2 (file upload) with shouldProcess=true

CRM sync skipped a deal

Verify customer sync is enabled and the deal meets closed-won criteria


API documentation

Full endpoint reference, request schemas, and examples are at docs.tabsplatform.com under Integrators API v3 — Contracts and Customers.

For integration setup (HubSpot, Salesforce, or QuickBooks), contact your Tabs solutions team.