Connect SpaceKru with Zapier, Make & n8n
Zapier, Make and n8n connect SpaceKru to thousands of apps through their built-in webhook and HTTP tools. Sending data INTO SpaceKru is point-and-click; receiving SpaceKru events needs one extra request, which this guide gives you ready to copy.
The SpaceKru API (v1.1) is a REST/JSON API available on every paid SpaceKru plan. It syncs leads both ways (upsert by external_id), adds leads to campaigns, creates and moves deals and asks AI Employees to follow up, manages products, quotes, orders, payments and bookings, lets your platform chat with your Customer Service AI Employee, and sends signed webhooks for 16 events that say who caused each change. Base URL: https://app.spacekru.com/api/public/v1. Authentication: Bearer API key (sk_live_…). Documentation: https://www.spacekru.com/developers (Spanish: https://www.spacekru.com/es/developers). OpenAPI 3.1: https://app.spacekru.com/api/public/v1/openapi.json.
Before you start
- A SpaceKru account on a paid plan (the 7-day free trial works).
- An API key with Read & write access, created by the account owner in Integrations → API & Webhooks. Name it after the tool ("Zapier", "Make", "n8n").
- The API base URL:
https://app.spacekru.com/api/public/v1.
Two directions
| Direction | Example | How |
|---|---|---|
| Into SpaceKru | New form response → lead in SpaceKru | An HTTP step in your tool calls POST /leads with your key. No code. |
| Out of SpaceKru | New lead in SpaceKru → row in Google Sheets | Your tool gives you a webhook URL; you register it once with POST /subscriptions; SpaceKru calls it on every event. |
Zapier
Send leads into SpaceKru
- Trigger. Choose the app where leads come from (Typeform, Google Forms, Facebook Lead Ads, Shopify, a spreadsheet…).
- Action: Webhooks by Zapier → POST. URL:
https://app.spacekru.com/api/public/v1/leads. Payload Type:json. Headers:Authorization→Bearer sk_live_…(your key). - Data. One row per field:
full_name,work_email,work_phone,company_name,city,country,tags… At least one email, phone or social profile is required. Unmapped or empty fields are ignored. - Test. A
201response means the lead was created.409 DUPLICATE_RESOURCEmeans it already existed (the response includes itsexisting_id).
Field names and limits: Create a lead. tags can be a comma-separated text such as zapier, webinar.
React to SpaceKru events
- Trigger: Webhooks by Zapier → Catch Hook. Copy the URL Zapier gives you (
https://hooks.zapier.com/hooks/catch/…). - Register the URL once. Run this request once, replacing the URL and choosing the event (
lead.created,lead.updated,deal.created,deal.stage_changed,deal.updated,quote.created,quote.status_changed,order.created,order.status_changed,campaign_lead.replied,campaign_lead.form_submitted,product.created,product.updated,booking.created,booking.updated,conversation.message_created). Use a terminal, any HTTP tool (Postman, Insomnia), or a temporary Zap with a Webhooks by Zapier → POST step. Save thesecretfrom the response.curl curl -X POST "https://app.spacekru.com/api/public/v1/subscriptions" \ -H "Authorization: Bearer $SPACEKRU_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "event_type": "lead.created", "target_url": "https://hooks.zapier.com/hooks/catch/1234567/abcdefg/" }'Node.js const res = await fetch('https://app.spacekru.com/api/public/v1/subscriptions', { method: 'POST', headers: { Authorization: `Bearer ${process.env.SPACEKRU_API_KEY}`, 'Content-Type': 'application/json', }, body: JSON.stringify({ "event_type": "lead.created", "target_url": "https://hooks.zapier.com/hooks/catch/1234567/abcdefg/" }), }); const body = await res.json(); if (!res.ok) { // Branch on body.error.code; quote body.error.request_id to support. throw new Error(`${body.error.code}: ${body.error.message} (request ${body.error.request_id})`); } console.log(body);Python import os import requests r = requests.post( "https://app.spacekru.com/api/public/v1/subscriptions", headers={ "Authorization": f"Bearer {os.environ['SPACEKRU_API_KEY']}", }, json={ "event_type": "lead.created", "target_url": "https://hooks.zapier.com/hooks/catch/1234567/abcdefg/", }, timeout=30, ) body = r.json() if not r.ok: # Branch on body["error"]["code"]; quote body["error"]["request_id"] to support. raise RuntimeError(f"{body['error']['code']}: {body['error']['message']} (request {body['error']['request_id']})") print(body) - Send a sample. Make the event happen in SpaceKru (for
lead.created, create a lead). Zapier receives it and shows every field:event,data.full_name,triggered_by,changes… - Build the rest of the Zap. Add your actions (Google Sheets, Slack, HubSpot, Gmail…) and publish.
Make
Send leads into SpaceKru
- Module: HTTP → Make a request. URL:
https://app.spacekru.com/api/public/v1/leads. Method:POST. Headers:Authorization=Bearer sk_live_…. - Body. Body type: Raw. Content type: JSON (application/json). Request content: the JSON of the lead, mapping your trigger's fields, e.g.
{"full_name": "{{1.name}}", "work_email": "{{1.email}}", "tags": ["make"]}. - Parse response. Turn on Parse response to use the new lead's
idin later modules.
React to SpaceKru events
- Add Webhooks → Custom webhook as the first module and copy its address (
https://hook.<region>.make.com/…). - Register the address once with the request above (
POST /subscriptions). - Make the event happen in SpaceKru so Make learns the data structure, then add your modules.
n8n
Send leads into SpaceKru
- Create a credential of type Header Auth: Name
Authorization, ValueBearer sk_live_…. - Add an HTTP Request node: Method
POST, URLhttps://app.spacekru.com/api/public/v1/leads, Authentication → Generic Credential Type → Header Auth (the credential above). - Turn on Send Body, Body Content Type JSON, and map the fields.
React to SpaceKru events
- Add a Webhook node with HTTP Method
POSTand copy its Production URL (not the Test URL). - Activate the workflow — the production URL only listens while the workflow is active.
- Register the production URL once with
POST /subscriptions. - Self-hosted n8n must be reachable at a public
https://address on port 443:localhost, private IPs and internal hostnames are rejected.
Troubleshooting
| Symptom | Likely cause |
|---|---|
401 INVALID_API_KEY | The header is not exactly Authorization: Bearer sk_live_… (a missing "Bearer ", an extra space or quote), or the key was revoked. |
402 PLAN_UPGRADE_REQUIRED | The SpaceKru account is not on an active paid plan. |
403 INSUFFICIENT_SCOPE | The key is Read only. Creating leads and webhooks needs Read & write. |
400 "Unknown field(s)" | A field name that doesn't exist (e.g. email instead of work_email). See the field list in the reference. |
400 "At least one contact channel is required" | The trigger produced an empty email/phone. Add a filter so only complete responses continue. |
| No events arrive | The subscription was registered with another URL, or it was deactivated (check Integrations → API & Webhooks). Only events that happen after subscribing are sent. |
| Events stopped arriving | The URL kept failing (20 failed attempts in a row) or answered 410. Delete the subscription and create it again with a working URL. |
More detail on every code: Errors.