Live

Joist logo

Joist API and MCP server

joist.com

Joist has no public API (checked 11 Oct 2026): its help center and pricing page document none, and there are no webhooks. Cotlet is a hosted MCP server and REST API for Joist with 13 endpoints (7 read, 6 write): your AI agent signs in as you and does the work.

Endpoints
13 7 read, 6 write
Updated
How Cotlet connects your agent to Joist
  1. Your agent

    Claude Code, Codex, Cursor or a script

  2. Cotlet

    MCP server and REST API · 13 endpoints

    cotlet.dev/mcp/v1

  3. Joist logo

    Joist

    Signed in as you on joist.com

You sign in once. We never store your password.

Official API

Does Joist have an official API?

Joist has no public API (checked 11 Oct 2026): its help center and pricing page document none, and there are no webhooks. The only built-in link out is QuickBooks Sync, part of Joist Pro, which copies issued estimates and invoices to QuickBooks Online once a night.

What Joist's own tools do compared with Cotlet
Task Joist official Cotlet
Create an estimate with line items No Only in the app, including its own Estimate with AI Yes
Convert an estimate to an invoice Partly Generate Invoice in the app, or Auto-generate Invoice per estimate when the client approves Yes
List open and paid invoices Partly Monthly CSV download on the web, or the QuickBooks copy; no live query Yes
Add clients Partly By hand, or CSV import on the web Yes
Record a cash or check payment No Record Payment in the app Yes
Email an estimate or invoice to the client No Yes
Revenue and invoice reports Partly In the app only Yes
Export estimates and invoices for accounting Partly Monthly CSV download on the web, by hand Yes

Sources: Joist Help Center: how does automatic QuickBooks Syncing work? · Joist Help Center: export your Joist data · Joist Help Center: record a payment on an invoice · Joist pricing · Joist Help Center: Quick Estimate and Invoice with AI · Joist: invoicing features (payment reminders) · Joist Help Center: auto-generate an invoice from an approved estimate

Common use cases

What can an AI agent do in Joist?

Cotlet is best for contractors and their bookkeepers who want an AI agent to draft estimates, convert them to invoices, record payments and list what is owed without running or fixing a server.

  • Create estimates from a job description

    Make an estimate for Dana Lee: 2 interior doors installed at my usual rate, 50% deposit, 8.25% tax, expires in 14 days. Do not send it yet. Your agent calls list_clients, add_client, list_items and create_estimate.

  • Invoice signed estimates Runs: Daily

    Every morning, find the Joist estimates clients signed since yesterday, turn each into an invoice and email it to the client. Your agent calls list_estimates, get_document, list_invoices, convert_estimate_to_invoice and send_document.

  • Record check and cash payments on invoices

    Here are this week's checks: Mark Ruiz $1,200, Henderson family $2,000, Oak Ridge HOA $1,070. Record each on the right Joist invoice and ask me about anything that does not match. Your agent calls list_invoices, get_document and record_payment.

  • Follow up on unpaid and overdue invoices Runs: Weekly

    Every Monday, list who owes me money in Joist, oldest first, and draft a reminder for each client more than 7 days overdue. Your agent calls list_invoices, get_document and send_document.

  • Export monthly invoices for your accountant Runs: Monthly

    Export last month's invoices from Joist and tell me how many there are. Your agent calls export_documents.

Endpoints

What is the Joist API?

Cotlet's Joist API exposes 13 endpoints for your own Joist account: list estimates, list invoices, get estimate or invoice, list clients, list items, get report, export documents, add client, add item, create estimate, convert estimate to invoice, record payment and send estimate or invoice. The list_estimates endpoint returns estimates with number, client, total, expiry date, status, and whether the client opened the email or signed. Each endpoint takes simple JSON inputs like search, limit or cursor and works both as an MCP tool for agents and as a REST call for scripts.

All endpoints · 13 total

missing one? request an endpoint

  • POST

    list_estimates

    read

    Lists the estimates in your Joist account, newest first. Each item shows the status (pending until approved), the expiry date if one is set, and the two markers Joist shows in its list: client opened the email, and signed. Pass estimate_id to convert_estimate_to_invoice or get_document.

    POST /api/v1/joist/list_estimates

    Input

    Input: list_estimates
    Parameter Type Description
    search string Client name or estimate number.
    limit integer 1 to 100. Default: 25.
    cursor string Next page cursor from the previous call.

    Example response

    {
      "estimates": [
        {
          "estimate_id": "est_20418",
          "number": "318",
          "client": "Dana Lee",
          "total": 700,
          "status": "pending",
          "expires_on": "2026-10-25",
          "email_opened": true,
          "signed": false
        }
      ],
      "next_cursor": null
    }
  • POST

    list_invoices

    read

    Lists invoices from the Active view (not paid in full) or the Paid view, newest first. Balance due is the total less recorded payments, so a partly paid invoice shows what is left. The due date is the creation date plus your Payment Terms, and overdue is true where Joist shows the Overdue badge. Each item shows whether the client opened the email and whether it is signed.

    POST /api/v1/joist/list_invoices

    Input

    Input: list_invoices
    Parameter Type Description
    view enum active (not paid in full) or paid. Default: active.
    search string Client name or invoice number.
    limit integer 1 to 100. Default: 25.
    cursor string Next page cursor from the previous call.

    Example response

    {
      "invoices": [
        {
          "invoice_id": "inv_58213",
          "number": "1042",
          "client": "Mark Ruiz",
          "total": 2400,
          "amount_paid": 1200,
          "balance_due": 1200,
          "due_on": "2026-10-01",
          "overdue": true,
          "email_opened": true,
          "signed": true
        }
      ],
      "next_cursor": null
    }
  • POST

    get_document

    read

    Returns one estimate or invoice with its client, every line item, tax, discount, requested deposit and, for an invoice, the payments recorded on it. Use it before changing or sending a document so your agent sees what the client will see.

    POST /api/v1/joist/get_document

    Input

    Input: get_document
    Parameter Type Description
    document_id required string Estimate or invoice ID from list_estimates or list_invoices.

    Example response

    {
      "document_id": "inv_58213",
      "type": "invoice",
      "number": "1042",
      "client": {
        "client_id": "cl_2210",
        "name": "Mark Ruiz"
      },
      "line_items": [
        {
          "name": "Kitchen cabinet install",
          "quantity": 1,
          "rate": 2400
        }
      ],
      "tax": 0,
      "discount": 0,
      "total": 2400,
      "payments": [
        {
          "amount": 1200,
          "method": "bank_transfer",
          "paid_on": "2026-09-25"
        }
      ]
    }
  • POST

    list_clients

    read

    Lists the clients in your Joist account. Use client_id from an item in create_estimate. Search matches part of a name, email or phone.

    POST /api/v1/joist/list_clients

    Input

    Input: list_clients
    Parameter Type Description
    search string Part of a name, email or phone.
    limit integer 1 to 200. Default: 50.
    cursor string Next page cursor from the previous call.

    Example response

    {
      "clients": [
        {
          "client_id": "cl_3307",
          "name": "Dana Lee",
          "email": "dana@example.com",
          "phone": "+1 555 0100",
          "address": "14 Maple Street"
        }
      ],
      "next_cursor": null
    }
  • POST

    list_items

    read

    Lists the items you saved in Joist (Joist does not ship with prices built in). Your agent reuses their names and rates on new estimates instead of guessing prices.

    POST /api/v1/joist/list_items

    Input

    Input: list_items
    Parameter Type Description
    search string Part of the item name.

    Example response

    {
      "items": [
        {
          "item_id": "it_104",
          "name": "Interior door, installed",
          "description": "Supply and hang a pre-hung interior door",
          "rate": 350
        }
      ]
    }
  • POST

    get_report

    read

    Returns one of Joist's Reports for a date range, optionally for one client: revenue received (partial payments included), invoice balances and statuses, estimate volume and statuses, or sales tax collected by jurisdiction. Joist reports only include data entered after 1 September 2022. If your account has no Reports, the call returns the error the app shows.

    POST /api/v1/joist/get_report

    Input

    Input: get_report
    Parameter Type Description
    report required enum revenue, invoices, estimates or sales_tax.
    from required date Start of the range.
    to required date End of the range.
    client string Only this client, by name.

    Example response

    {
      "report": "revenue",
      "from": "2026-09-01",
      "to": "2026-09-30",
      "total_received": 8450,
      "invoices_with_payments": 6
    }
  • POST

    export_documents

    read

    Runs the same export as Joist's website, for one month: number, client name, subtotal, tax, total, date issued, date created and payment received less refunds. Line items are not in the export; use get_document for those. Returns a download link and the row count.

    POST /api/v1/joist/export_documents

    Input

    Input: export_documents
    Parameter Type Description
    type required enum estimates or invoices.
    month required string Month as YYYY-MM.

    Example response

    {
      "type": "invoices",
      "month": "2026-09",
      "rows": 14,
      "download_url": "https://files.cotlet.example/joist-invoices-2026-09.csv"
    }
  • POST

    add_client

    write

    Creates a client in your Joist account. It reaches no one and nothing is sent, so it runs without asking; you can delete the client in Joist. Check list_clients first to avoid a duplicate.

    POST /api/v1/joist/add_client

    Input

    Input: add_client
    Parameter Type Description
    name required string Client or company name.
    email string Used when you send documents.
    phone string Phone number.
    address string Job or billing address.

    Example response

    {
      "client_id": "cl_3312",
      "name": "Priya Nair",
      "email": "priya@example.com"
    }
  • POST

    add_item

    write

    Saves an item with a name, rate and optional description to your Items list, so it can be reused on later estimates. It reaches no one, so it runs without asking.

    POST /api/v1/joist/add_item

    Input

    Input: add_item
    Parameter Type Description
    name required string Item name.
    rate required string Price per unit, e.g. "350.00".
    description string Shown on the line item.

    Example response

    {
      "item_id": "it_105",
      "name": "Baseboard, installed",
      "rate": 4.5
    }
  • POST

    create_estimate

    write

    Creates and saves an estimate for a client. Nothing is sent: the client sees it only after send_document. A deposit is a percent or an amount and shows under the total as Deposit Due. The expiry date cannot be in the past. It reaches no one, so it runs without asking.

    POST /api/v1/joist/create_estimate

    Input

    Input: create_estimate
    Parameter Type Description
    client_id required string Client ID from list_clients or add_client.
    line_items required object[] List of { name, description, quantity, rate }.
    tax_rate string Tax percent applied to the estimate, e.g. "8.25".
    discount object { type: percent or amount, value }.
    deposit object Requested deposit: { type: percent or amount, value }.
    expires_on date Expiry date. Must not be in the past.
    notes string Note shown on the estimate.

    Example response

    {
      "estimate_id": "est_20418",
      "number": "318",
      "client": "Dana Lee",
      "line_items": [
        {
          "name": "Interior door, installed",
          "quantity": 2,
          "rate": 350,
          "amount": 700
        }
      ],
      "total": 700,
      "deposit_due": 350,
      "expires_on": "2026-10-25",
      "sent": false
    }
  • POST

    convert_estimate_to_invoice

    write

    Does what Generate Invoice does in Joist: the new invoice carries all the information from the estimate. The estimate stays in your Estimates list and its status changes from pending to approved. Nothing is sent to the client, so it runs without asking.

    POST /api/v1/joist/convert_estimate_to_invoice

    Input

    Input: convert_estimate_to_invoice
    Parameter Type Description
    estimate_id required string Estimate ID from list_estimates.

    Example response

    {
      "invoice_id": "inv_58300",
      "number": "1051",
      "from_estimate": "est_20418",
      "total": 700,
      "deposit_due": 350,
      "sent": false,
      "estimate_status": "approved"
    }
  • POST

    record_payment

    write

    Records a payment on an invoice, as Record Payment does in Joist. Partial payments are allowed, and an invoice can hold several. Once the invoice is paid in full it moves from Active to Paid. Payments made through Joist Payments are recorded by Joist itself. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/joist/record_payment

    Input

    Input: record_payment
    Parameter Type Description
    invoice_id required string Invoice ID from list_invoices.
    amount required string Amount received, e.g. "1200.00".
    method required enum cash, check, credit or bank_transfer.
    paid_on date Payment date. Default: today.

    Example response

    {
      "invoice_id": "inv_58213",
      "number": "1042",
      "total": 2400,
      "amount_paid": 2400,
      "balance_due": 0,
      "list": "paid",
      "payments": [
        {
          "amount": 1200,
          "method": "bank_transfer",
          "paid_on": "2026-09-25"
        },
        {
          "amount": 1200,
          "method": "check",
          "paid_on": "2026-10-09"
        }
      ]
    }
  • POST

    send_document

    write

    Emails the document from Joist on your behalf, as the Email button does. The recipient is prefilled from the client on the document, and subject and body can be changed. The client sees it, and Joist marks it when they open the email or sign. By default you confirm each call; you can switch that off for this tool.

    POST /api/v1/joist/send_document

    Input

    Input: send_document
    Parameter Type Description
    document_id required string Estimate or invoice ID from list_estimates or list_invoices.
    to string Recipient email. Default: the client email on the document.
    subject string Email subject. Default: the Joist subject.
    message string Email body. Default: the Joist message.

    Example response

    {
      "document_id": "inv_58300",
      "to": [
        "dana@example.com"
      ],
      "status": "sent",
      "sent_at": "2026-10-11T09:20:00+02:00"
    }

Setup

How do I connect Joist to Claude Code, Codex or Cursor?

Connecting Joist takes three steps: request access, sign in to Joist once, then add one MCP server or call the REST API with the same key.

Connect Joist over MCP

  1. 1

    Create an account

    Sign up and add Joist in the console. Your API key is there too.

  2. 2

    Sign in to Joist once

    Open the connect page from the console and sign in to Joist the way you always do. We keep the session, never your password, and you can revoke it anytime.

  3. 3

    Add Cotlet to your agent

    Claude Code
    claude mcp add --transport http cotlet \
      https://cotlet.dev/mcp/v1 \
      --header "Authorization: Bearer $COTLET_API_KEY"
    Cursor
    {
      "mcpServers": {
        "cotlet": {
          "url": "https://cotlet.dev/mcp/v1",
          "headers": {
            "Authorization": "Bearer ${COTLET_API_KEY}"
          }
        }
      }
    }
    Codex
    # ~/.codex/config.toml
    [mcp_servers.cotlet]
    url = "https://cotlet.dev/mcp/v1"
    bearer_token_env_var = "COTLET_API_KEY"

    Paste the snippet for your client. The same server and key serve every app you connect, so you do this once.

  4. 4

    Ask your agent

    Prompt

    Make an estimate for Dana Lee: 2 interior doors installed at my usual rate, 50% deposit, 8.25% tax, expires in 14 days. Do not send it yet.

    Ask in plain words. Your agent finds the Joist tools on the server and calls them for you; anything that reaches other people waits for your OK unless you switch that off for a tool.

Call Joist over REST

  1. 1

    Export your API key

    Shell

    export COTLET_API_KEY="cotlet_..."

    Your scripts use the same API key as your agent. Keep it in an environment variable, never in your code.

  2. 2

    Call a tool

    curl

    curl https://cotlet.dev/api/v1/joist/record_payment \
      -H "Authorization: Bearer $COTLET_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{"invoice_id":"inv_58213","amount":"1200.00","method":"check","paid_on":"2026-10-09"}'

    Every tool is a POST endpoint at /api/v1/joist/{tool}. Send its parameters as JSON, exactly as listed in the endpoints above.

  3. 3

    Read the result

    Example response · record_payment

    {
      "invoice_id": "inv_58213",
      "number": "1042",
      "total": 2400,
      "amount_paid": 2400,
      "balance_due": 0,
      "list": "paid",
      "payments": [
        {
          "amount": 1200,
          "method": "bank_transfer",
          "paid_on": "2026-09-25"
        },
        {
          "amount": 1200,
          "method": "check",
          "paid_on": "2026-10-09"
        }
      ]
    }

    You get plain JSON back, ready for your script. A failed call costs nothing.

Why Cotlet

Why use Cotlet for Joist? Hosted, safe and kept working.

  • Built for agents

    • One MCP server for every app you connect.
    • The same tools as a REST API for scripts and cron jobs.
    • Works with Claude Code, Codex and Cursor.
  • Your login stays yours

    • You sign in to Joist yourself. We keep only the session, encrypted with AES-256.
    • The model never sees a login.
    • No stored passwords, no CAPTCHA solving, no MFA bypass.
  • You stay in control

    • Pick read only, or read and write.
    • Anything that reaches other people waits for your OK, unless you switch it off per tool.
    • Revoke access in one click.
  • Kept working for you

    • We test every integration daily.
    • When Joist changes, the tool pauses until we fix it.
    • Failed calls cost nothing.

Alternatives

Is there a Joist MCP server on GitHub?

No community MCP server and no Zapier app for Joist turned up (checked 11 Oct 2026). The realistic options are QuickBooks Sync and the monthly CSV export, both one way and both started by you, or doing the work by hand in the app.

Cotlet compared with a QuickBooks Sync and CSV
QuickBooks Sync and CSV Cotlet
Setup Connect QuickBooks Online in Joist settings; export a CSV from the web each month Request access, sign in to Joist once, add one MCP server or API key
Direction One way: Joist to QuickBooks, or Joist to a CSV Read and write in Joist itself
Timing Nightly (4am EST), or one document at a time by hand; CSV one month per download On demand, when your agent asks
What it can do Copy issued documents out. No new estimates, clients or payments in Joist; payments are not synced Create estimates, convert them, add clients, record payments, send documents; each send confirmed by you
Your Joist session Not applicable Encrypted in an EU vault, limited to the actions you allow, revoked in one click
When the session expires Not applicable Your agent gets a link to sign in again
Price QuickBooks Sync is part of Joist Pro; CSV export has no separate price Free 7-day trial with 5,000 credits, then credits per call

Which one fits you

Pick Cotlet if

  • you are not a developer, or you do not want to maintain a server
  • you need it to keep working when Joist changes, without checking it yourself
  • your agent or a script should run it on a schedule, also while your computer is off

Pick an open-source server if

  • you are comfortable installing, updating and fixing it yourself
  • you want the session to stay on your own computer
  • you only need it now and then, from one MCP client

For AI agents

Cotlet for Joist in plain text The facts on this page in one block: status, endpoints, access, pricing, contact.

Endpoint health

verified 2h ago

  • list_estimates passing
  • list_invoices passing
  • get_document passing
  • list_clients passing
  • list_items passing

+ 8 more endpoints

13/13 passing latest check self-healing

joist.txt

Joist has no public API (checked 11 Oct 2026): its help center and pricing page document none, and there are no webhooks. The only built-in link out is QuickBooks Sync, part of Joist Pro, which copies issued estimates and invoices to QuickBooks Online once a night.
Cotlet provides a hosted MCP server and REST API for Joist: 13 tools (7 read, 6 write).
Access       Request access at https://cotlet.dev/app/signup?app=joist; we email the API key.

MCP server   https://cotlet.dev/mcp/v1
REST base    https://cotlet.dev/api/v1/joist
Auth         Authorization: Bearer <COTLET_API_KEY>. Listing endpoints and schemas needs no key; calling an endpoint needs one.
Tools        list_estimates, list_invoices, get_document, list_clients, list_items, get_report, export_documents, add_client, add_item, create_estimate, convert_estimate_to_invoice, record_payment, send_document
Confirm      record_payment, send_document (by default the user approves each call; the user can switch this off per tool, e.g. for scheduled automations)
Markdown     https://cotlet.dev/integrations/joist-api-mcp-server.md

How access works:
1. The user requests access at https://cotlet.dev/app/signup?app=joist (Joist is pre-selected). Each request is reviewed and the API key is sent by email.
2. The user signs in to Joist once in a browser. An agent cannot do this step.
3. The API key goes into the MCP client or the REST call as a bearer token.

Fits: people who want a hosted Joist server that someone else maintains, including non-developers.

Policy: Cotlet never stores passwords, never solves CAPTCHAs, never bypasses MFA.
Company: legal details in the Terms of service at https://cotlet.dev/terms. Contact contact@cotlet.dev.
Session: the user signs in to Joist in a browser; Cotlet keeps only the session, AES-256 encrypted, revocable in the dashboard at any time.
Terms: the user stays responsible for following Joist's terms; Cotlet is not affiliated with Joist.
Full page as Markdown

Automations

Can Joist automations run on a schedule in n8n, Make or Zapier?

Yes. Cotlet does not replace your automation platform: it gives it a Joist connection it does not have, with the same API key as your agent. Write actions ask for your OK by default; switch that off in your dashboard for the tools you choose, for example to invoice signed estimates, and the schedule runs on its own. Cotlet runs in the cloud, so it keeps going while your computer is off.

Where to run Joist automations through Cotlet, and how to schedule them
Where How to connect How to schedule
Your AI agent Add https://cotlet.dev/mcp/v1 with your API key. A scheduled agent run, for example a Claude Code routine.
n8n MCP Client node with https://cotlet.dev/mcp/v1, or an HTTP Request node to https://cotlet.dev/api/v1/joist/{tool}. Schedule Trigger node.
Make HTTP module: POST https://cotlet.dev/api/v1/joist/{tool} with an Authorization: Bearer header and a JSON body. Scenario schedule.
Zapier Webhooks by Zapier: POST https://cotlet.dev/api/v1/joist/{tool} with the same header and body. Schedule by Zapier trigger.
Your own script POST https://cotlet.dev/api/v1/joist/{tool} with your API key. cron or GitHub Actions.

Pricing & limits

How much does the Joist API cost?

Free 7-day trial with 5,000 credits, no card needed. After that, the Joist API comes with the Cotlet plan, from $29 a month for 3,000 credits, with no limit on apps. Each month's credits stay valid for 3 months, so unused credits add up.

Cotlet plan sizes: price, monthly credits and price per credit
Size Price Credits / month Per credit
Solo $29/mo 3,000 about $0.0097
Pro $99/mo 12,000 about $0.0083
Agency $299/mo 40,000 $0.0075

Each successful call uses credits for the work it takes; failed calls and timeouts cost nothing. A hard spend cap is on by default. Authenticate with the Authorization: Bearer header.

About Cotlet

How Cotlet holds your access

Cotlet hosts MCP servers and REST APIs for apps with no usable API. Your agent works in your own Joist account.

Company details
The legal name, address and registration numbers of the company behind Cotlet are in the Terms of service. Terms
Your session
You sign in to Joist yourself, in your browser. We keep only the session, never your password: encrypted with AES-256 in an EU vault, isolated to your account and used only when your agent calls a Joist tool you allowed. When it expires, your agent gives you a link to sign in again. Security
Revoking access
Disconnect Joist in your dashboard: the session is deleted and access ends at once. Actions that reach other people wait for your OK unless you switch that off per tool.
What we never do
Store passwords, solve CAPTCHAs or bypass MFA.
Joist's terms
You use your own Joist account and stay responsible for following Joist's terms. Cotlet is independent and not affiliated with Joist. Terms
Contact
Questions about the company, security or an app: contact@cotlet.dev
About Cotlet

Frequently asked questions

How do I get access?

Request access and pick Joist. Cotlet reviews each request and emails you your API key.

Do I need to be technical?

No. You sign in to Joist once in your browser and paste one command into your agent, or one URL into n8n. Your agent can walk you through it. There is no server to install, update or fix.

Is a hosted server safe? My Joist session would leave my computer.

Cotlet keeps your Joist session encrypted with AES-256 in an EU vault, isolated to your account and used only for the tools you allow: read only, or read and write. The AI model never sees it, and you revoke it in one click. A local server keeps the same session in a file on your computer, readable by any program you run, and needs a fresh sign-in whenever it expires.

Do I need a paid Joist plan?

Cotlet works in your own Joist account and uses whatever your plan has. Joist's pricing page lists Basics with 5 documents per month, and Pro, Elite and Run above it; QuickBooks Sync is part of Pro and Reports sit in the Elite section of the help center.

Can my team share one Joist login through Cotlet?

Joist accounts are set up for a single user with one login email and password (Joist Help Center), so Cotlet connects to that one account.

Can my agent post or send messages in Joist without asking me?

No. Every call to record_payment or send_document waits for your OK by default. For scheduled automations you can switch confirmation off per tool in your dashboard, for example only for approvals. add_client, add_item, create_estimate, convert_estimate_to_invoice runs without asking, because it sends nothing to anyone and one call undoes it.

Can I use the Joist API in n8n?

Yes. Add https://cotlet.dev/mcp/v1 with your API key in n8n's MCP Client node, or call https://cotlet.dev/api/v1/joist/{tool} from the HTTP Request node.

Give your agent access to Joist.

Request access and pick it. We review each request and email you your API key. Free 7-day trial with 5,000 credits, no card needed.