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.
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.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:
NameA name you’ll recognise, such as the system you’re connecting.Redirect URIsThe page in your system that people return to after allowing access. Step 3 has to send exactly the same address.ScopesWhat 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 IDPublic. It goes on every request asclient_id.Client SecretPrivate. 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.
Ask for access
Send the person connecting their account to this address in their browser:
Browser addresshttps://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
codeandstateadded to the address. If they cancel, you geterror=access_deniedinstead.Clients with no secret, such as mobile apps, must also send
code_challengeandcode_challenge_method=S256. Authorize OAuth client has every option.Swap the code for a token
Do this from your server, because it includes your client secret:
Terminalcurl -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_tokenandexpires_in, which is how many seconds the access token lasts. Save all three.Make your first request
Put the access token in the header and your Client ID in the query string.
1234is a document number from your account. Here’s where to find it.Terminalcurl "https://app.quote.cloud/api/v1/getDocumentStatus?client_id=<your client id>&document_id=1234" \ -H "Authorization: Bearer <access token>"
Keep the connection going
Before
expires_inruns out, use the refresh token to get a new access token. You get a new refresh token each time, so save that as well.Terminalcurl -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.
#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.id of the template in the response from List templates.id of the contact in the response from Get contacts.id of the product in the response from Get products.recipientRef in the response when you add the recipient with Add document recipient.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:readdocuments:createdocuments:read_statusdocuments:write_statusdocuments:readdocuments:writedocuments:senddocuments:read_deliverydocuments:archivecontacts:readcontacts:createcontacts:writeproducts:readproducts:createworkflows:approvecomments:readcomments:writewebhooks:document_statuswebhooks:document_deliverywebhooks:form_submissionwebhooks:contact_createdwebhooks:document_createdwebhooks:recipient_activitywebhooks:contact_changeswebhooks:product_changeswebhooks:document_paymentswebhooks:document_commentsEndpoints
OAuth
Documents
- POSTCreate a blank document or a document from a template
- POSTDuplicate or revise a document
- POSTTransfer document ownership to an active company user
- POSTTransition a document to another status
- POSTUpsert an image in a named document or template block
- POSTRender a saved document page as a PNG preview
- POSTFetch or generate a document PDF link
- GETList documents with bounded cursor pagination
- GETHydrate a document for Zapier or retrieve a summary
- GETGet a document's current status
- PATCHUpdate document metadata and custom fields
- POSTAdd a recipient to an editable document
- PATCHUpdate an existing document recipient
- POSTArchive a document and its revision family
- POSTRestore a document and its revision family
- POSTApprove or reject a pending document workflow
- GETList document comments
- POSTAdd a document comment
- PATCHResolve or reopen a document comment