API reference

Create, send and read documents, and manage contacts, products, templates and webhooks.

Get started

There are two ways in, depending on what you want to do.

Try it here

See real responses from your own account, with no setup. Sign in, open an endpoint and press Run. Your token and client ID are added for you.

Connect your own system

For an app, script or integration you’re building. The setup guide on this page walks you through it on your own account, from creating an OAuth client to your first real request.

Read the steps in full or see how to create a client, with pictures.

Connect your own system

Most /api/v1 requests need two things: your Client ID as the client_id query parameter, and an access token in the Authorization: Bearer header. A token belongs to one company. These steps get you both.

  1. Check you have access

    The API needs the API & Zapier add-on on your company, and you need access to your organisation’s settings. Open the API dashboard to check. If the add-on is missing, that page shows the pricing and a button to turn it on. Without it, requests return a 403 with addon_required.

  2. Create an OAuth client

    In the API dashboard, choose Manage Integrations, open the OAuth Clients tab and choose New OAuth client. See each step with pictures. Fill in:

    Name
    A name you’ll recognise, such as the system you’re connecting.
    Redirect URIs
    The page in your system that people return to after allowing access. Step 3 has to send exactly the same address.
    Scopes
    What the connection is allowed to do. They’re all on to start with, so turn off what you don’t need. See what each one does.

    When you save, you get two values:

    Client ID
    Public. It goes on every request as client_id.
    Client Secret
    Private. Only use it from your server.

    Just testing from Postman or a script? Open the API Testing tab instead and choose Generate Credentials. You get a Client ID and an access token that work for 24 hours, so you can skip to step 5.

  3. Ask for access

    Send the person connecting their account to this address in their browser:

    Browser address
    https://app.quote.cloud/api/oauth/authorize?response_type=code&client_id=<your client id>&redirect_uri=https://yourapp.example.com/callback&state=<random value>

    They sign in if they need to, choose a company and press Allow access. The company needs an active plan or a current trial. For state, use any random value and check it matches when they come back.

    QuoteCloud then returns them to your redirect URI with code and state added to the address. If they cancel, you get error=access_denied instead.

    Clients with no secret, such as mobile apps, must also send code_challenge and code_challenge_method=S256. Authorize OAuth client has every option.

  4. Swap the code for a token

    Do this from your server, because it includes your client secret:

    Terminal
    curl -X POST https://app.quote.cloud/api/oauth/accessToken \
      -d grant_type=authorization_code \
      -d code=<code from the redirect> \
      -d redirect_uri=https://yourapp.example.com/callback \
      -d client_id=<your client id> \
      -d client_secret=<your client secret>

    The response includes access_token, refresh_token and expires_in, which is how many seconds the access token lasts. Save all three.

  5. Make your first request

    Put the access token in the header and your Client ID in the query string. 1234 is a document number from your account. Here’s where to find it.

    Terminal
    curl "https://app.quote.cloud/api/v1/getDocumentStatus?client_id=<your client id>&document_id=1234" \
      -H "Authorization: Bearer <access token>"
  6. Keep the connection going

    Before expires_in runs out, use the refresh token to get a new access token. You get a new refresh token each time, so save that as well.

    Terminal
    curl -X POST https://app.quote.cloud/api/oauth/accessToken \
      -d grant_type=refresh_token \
      -d refresh_token=<refresh token> \
      -d client_id=<your client id> \
      -d client_secret=<your client secret>

Where to find IDs

Requests often ask for the ID of something in your account. Here’s where each one comes from.

Client IDclient_id
In QuoteCloud, go to Settings → API dashboard → Manage Integrations → OAuth Clients. It’s in the Client ID column.
Document IDdocument_id, ref
The number shown as #1234 in the ID column of your documents list and beside the title in the editor. Click it to copy, and leave out the #. It’s also the displayId in the response from List documents.
Template IDtemplate
The id of the template in the response from List templates.
Contact IDcontact_id
The id of the contact in the response from Get contacts.
Product IDproduct_id
The id of the product in the response from Get products.
RecipientrecipientRef
The recipientRef in the response when you add the recipient with Add document recipient.
CommentcommentRef
The commentRef of the comment in the response from List document comments.

Rate limits

120 requests a minute per company, shared across REST, Zapier and MCP.

On a 429, wait for the number of seconds in Retry-After before trying again. Your Zapier and other integrations draw on the same limit, so a busy Zap can leave less for you.

Scopes

templates:read
Read document templates.
documents:create
Create documents and read creation metadata.
documents:read_status
Read document status.
documents:write_status
Change document status.
documents:read
Read document summaries and hydrated document data.
documents:write
Copy, update, and transfer documents and recipients.
documents:send
Send, schedule, cancel, reschedule, or retry deliveries.
documents:read_delivery
Read scheduled-delivery details.
documents:archive
Archive and restore documents.
contacts:read
Read contacts and resolve existing recipients.
contacts:create
Create contacts.
contacts:write
Create, update, and remove contacts.
products:read
Read products.
products:create
Create or update products.
workflows:approve
Approve or reject workflows.
comments:read
Read document comments.
comments:write
Create, resolve, and reopen comments.
webhooks:document_status
Subscribe to document status changes.
webhooks:document_delivery
Subscribe to delivery status changes.
webhooks:form_submission
Subscribe to form submissions.
webhooks:contact_created
Subscribe to contact creation.
webhooks:document_created
Subscribe to document creation.
webhooks:recipient_activity
Subscribe to recipient views and signatures.
webhooks:contact_changes
Subscribe to contact updates and removals.
webhooks:product_changes
Subscribe to product changes.
webhooks:document_payments
Subscribe to document payment events.
webhooks:document_comments
Subscribe to document comment events.

Endpoints