Guides
Guide: n8n, Zapier, Make and Google Sheets
Call the Quilo API from no-code tools with a generic HTTP step.
All these tools have a generic HTTP request step. Configure it once, then copy it.
Common settings#
| Setting | Value |
|---|---|
| URL | https://YOUR-QUILO/api/v1/clients (or another endpoint) |
| Method | GET, POST, PATCH or DELETE |
| Header | Authorization = Bearer qk_… |
| Header (POST/PATCH) | Content-Type = application/json |
| Body | JSON (see the API reference) |
Store the key in the tool's credentials or connections feature, not in a plain text field, so it is hidden and not copied with the workflow.
n8n#
- Add an HTTP Request node.
- Authentication: Generic Credential Type → Header Auth. Name:
Authorization, Value:Bearer qk_…. Save it as the credentialQuilo API. - Method
POST, URLhttps://YOUR-QUILO/api/v1/clients, Send Body on, Body Content Type JSON. - Body, using expressions from earlier nodes:
JSON
{
"brand_id": "0b7e9a52-1c3d-4f6e-9a8b-7c6d5e4f3a2b",
"first_name": "{{ $json.first_name }}",
"email": "{{ $json.email }}",
"tags": ["n8n"]
}- Under Options → Retry on Fail, allow 3 retries with 5 seconds wait, and add the header
Idempotency-Key={{ $execution.id }}-client.
Zapier#
- Add the action Webhooks by Zapier → Custom Request.
- Method POST, URL the endpoint, Data the JSON body (map fields from the trigger).
- Headers:
Authorization|Bearer qk_…andContent-Type|application/json. - Test the step: a
201answer with the new record'sidmeans it worked.
Make (Integromat)#
- Add the module HTTP → Make a request.
- URL and Method as above; Headers
AuthorizationandContent-Type. - Body type Raw, Content type JSON (application/json), Request content your JSON.
- Turn on Parse response to use the returned fields in later modules.
Google Sheets (Apps Script)#
Pull open tasks into a sheet. Store the key in Project settings → Script properties as QUILO_API_KEY, never in a cell.
JavaScript
function importOpenTasks() {
const props = PropertiesService.getScriptProperties();
const res = UrlFetchApp.fetch(props.getProperty('QUILO_URL') + '/api/v1/tasks?status=todo&limit=200', {
headers: { Authorization: 'Bearer ' + props.getProperty('QUILO_API_KEY') },
muteHttpExceptions: true,
});
if (res.getResponseCode() !== 200) throw new Error(res.getContentText());
const rows = JSON.parse(res.getContentText()).data.map((t) => [t.title, t.priority, t.due_on, t.id]);
const sheet = SpreadsheetApp.getActive().getSheetByName('Tasks');
sheet.clearContents().getRange(1, 1, 1, 4).setValues([['Title', 'Priority', 'Due', 'Quilo ID']]);
if (rows.length) sheet.getRange(2, 1, rows.length, 4).setValues(rows);
}Use a Read only key for reports like this.
Built-in alternatives#
Inside Quilo, Automations react to events (new client, task done, invoice overdue…) without any code, and Settings → Integrations connects Shopify, Calendly, AbaNinja and others directly. Use the API when you need something those do not cover.