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#

SettingValue
URLhttps://YOUR-QUILO/api/v1/clients (or another endpoint)
MethodGET, POST, PATCH or DELETE
HeaderAuthorization = Bearer qk_…
Header (POST/PATCH)Content-Type = application/json
BodyJSON (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#

  1. Add an HTTP Request node.
  2. Authentication: Generic Credential Type → Header Auth. Name: Authorization, Value: Bearer qk_…. Save it as the credential Quilo API.
  3. Method POST, URL https://YOUR-QUILO/api/v1/clients, Send Body on, Body Content Type JSON.
  4. Body, using expressions from earlier nodes:
JSON
{
  "brand_id": "0b7e9a52-1c3d-4f6e-9a8b-7c6d5e4f3a2b",
  "first_name": "{{ $json.first_name }}",
  "email": "{{ $json.email }}",
  "tags": ["n8n"]
}
  1. Under Options → Retry on Fail, allow 3 retries with 5 seconds wait, and add the header Idempotency-Key = {{ $execution.id }}-client.

Zapier#

  1. Add the action Webhooks by Zapier → Custom Request.
  2. Method POST, URL the endpoint, Data the JSON body (map fields from the trigger).
  3. Headers: Authorization | Bearer qk_… and Content-Type | application/json.
  4. Test the step: a 201 answer with the new record's id means it worked.

Make (Integromat)#

  1. Add the module HTTP → Make a request.
  2. URL and Method as above; Headers Authorization and Content-Type.
  3. Body type Raw, Content type JSON (application/json), Request content your JSON.
  4. 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.