Use cases
Twelve integrations SpaceKru customers set up with the API, each with its flow, the exact steps and the honest limits. The first five connect your own platform; the rest need no code with Zapier, Make or n8n.
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.
1. Customer served in person → lead in a follow-up campaign
Your point-of-sale or front-desk system creates the lead and, in the same request, puts it in a prospecting or recontact campaign: the campaign's AI Employee follows up on its own.
Customer at the counter → Your POS → POST /leads + campaign_id → AI Employee follows up
- Pick the campaign.
GET /campaigns?type=prospectingand keep theidof a campaign withenrollable: true. - Create the lead with campaign_id. Send
external_id(the customer id in your POS) so you never need the SpaceKru id.curl curl -X POST "https://app.spacekru.com/api/public/v1/leads" \ -H "Authorization: Bearer $SPACEKRU_API_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: typeform-resp-8f2a1c" \ -d '{ "full_name": "Laura Gomez", "work_phone": "+573001112233", "external_id": "pos-88412", "campaign_id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8", "tags": [ "walk-in" ] }'Node.js const res = await fetch('https://app.spacekru.com/api/public/v1/leads', { method: 'POST', headers: { Authorization: `Bearer ${process.env.SPACEKRU_API_KEY}`, 'Content-Type': 'application/json', 'Idempotency-Key': 'typeform-resp-8f2a1c', }, body: JSON.stringify({ "full_name": "Laura Gomez", "work_phone": "+573001112233", "external_id": "pos-88412", "campaign_id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8", "tags": [ "walk-in" ] }), }); 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/leads", headers={ "Authorization": f"Bearer {os.environ['SPACEKRU_API_KEY']}", "Idempotency-Key": "typeform-resp-8f2a1c", }, json={ "full_name": "Laura Gomez", "work_phone": "+573001112233", "external_id": "pos-88412", "campaign_id": "4e5f6a7b-8c9d-4e0f-a1b2-c3d4e5f6a7b8", "tags": ["walk-in"], }, 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) - Read the outcome. The response has
enrollment.status:enrolled,already_in_campaignorexcludedwith areason(no_contact,no_channel_match,email_unverified).
2. Two-way sync with your CRM or platform
A lead edited in your platform updates SpaceKru, and a lead edited in SpaceKru (by your team or an AI Employee) updates your platform — without echo loops.
Your platform → PUT /leads/external/{id} → SpaceKru → lead.updated (triggered_by: app) → Your platform
- Write with
PUT /leads/external/{external_id}: it creates, updates or adopts the lead. - Subscribe to
lead.createdandlead.updatedwithexclude_own_changes: true. - On each webhook, update your record by
data.external_id(or storedata.idthe first time).
The full recipe: Two-way sync.
3. Your AI Employee inside your app or website
Your customers write in your app; your Customer Service AI Employee answers with everything it can do in WhatsApp: quote, book, check the catalog and the knowledge base, or call a person.
Customer writes in your app → POST /conversations/{id}/messages → AI Employee replies → Your app shows the reply
Requirements, lifecycle and costs: AI conversations.
4. Catalog and stock from your e-commerce or ERP
Your AI Employees quote and sell with the prices and stock of your real catalog.
- Create each product once with
POST /productsand yourexternal_id(your SKU id). - When price or stock changes in your system, send
PATCH /products/{id}(orPATCH /products/{id}/variants/{variant_id}for a variant). - Listen to
product.updatedto bring back the stock SpaceKru deducts when it creates orders.
5. Bookings from your website or booking system
GET /availability → Customer picks a slot → POST /bookings → booking.created
GET /availability?date=2026-10-24&party_size=4returns the free slots in the time zone of the business.POST /bookingswith theresource_idand times of the slot. A taken slot answers409 SLOT_UNAVAILABLE.- Bookings your AI Employees make in WhatsApp reach you as
booking.created.
6. Website or Typeform → lead in SpaceKru
Every form response becomes a SpaceKru lead in seconds, without duplicates.
Form response → Zapier / Make / n8n → POST /leads → Lead in SpaceKru
- Create an API key. In SpaceKru → Integrations → API & Webhooks, create a key with Read & write access. Name it "Zapier — forms".
- Trigger. In Zapier, use your form tool's trigger, for example Typeform → New Entry.
- Action. Add Webhooks by Zapier → POST. URL:
https://app.spacekru.com/api/public/v1/leads. Payload Type: json. Header:Authorization=Bearer <your key>. - Map the fields. In Data, add
full_name,work_email,work_phoneandtags(a comma-separated value such astypeform, spring-promoworks). Fields you leave empty are ignored. - Turn it on. Test it once, then publish. If the person already exists, SpaceKru answers
409withexisting_idinstead of creating a duplicate.
7. New SpaceKru lead → contact in HubSpot (or any CRM)
Every new lead — from WhatsApp, Instagram, forms, CSV imports or the Lead Finder — reaches your other CRM in seconds.
New lead in SpaceKru → lead.created → Zapier Catch Hook → HubSpot contact
- Catch Hook. In Zapier, create a Zap with the trigger Webhooks by Zapier → Catch Hook and copy its URL.
- Register the webhook once. Run this request once with your key and the Catch Hook URL. Save the
secretit returns.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) - Map to HubSpot. Add HubSpot → Create or Update Contact and map
data.work_email,data.full_name,data.work_phoneanddata.company_name.
8. Deal won → message on Slack
Deal marked won → deal.stage_changed → Filter: status is won → Slack message
- Subscribe. Subscribe a Catch Hook URL to
deal.stage_changed. - Filter. Continue only if
data.statusiswonandchanges.statusexists. - Slack. Add Slack → Send Channel Message: "🎉 {data.title} won — {data.value}".
9. Order paid → accounting or Google Sheets
Payment recorded → order.status_changed → Filter: payment_status is paid → New row in Sheets
- Subscribe a Catch Hook URL to
order.status_changed. - Continue only if
changes.payment_statusexists and its second value ispaid. - Add the row with
data.number,data.total,data.amount_paidanddata.items.
10. Nightly sync to your data warehouse or ERP
Scheduled job → GET with updated_since → Follow next_cursor → Upsert by id
- Save the time the job starts.
- Call
GET /leads?updated_since=<last run>&limit=100and follownext_cursoruntilhas_moreisfalse. - Upsert every record by
id. Repeat for/deals,/quotes,/orders,/productsand/bookings. - Store the start time as the next
updated_since.
The complete code is in Pagination & sync. Use a Read only key for this job.
11. Campaign reply → alert the sales rep
Lead replies to a campaign → campaign_lead.replied → Your automation → Email, Slack or SMS to the rep
- Subscribe to
campaign_lead.replied. - Send
data.lead.full_name,data.lead.work_emailanddata.campaign_idto the rep through your tool.
12. Agencies: one integration per client
- Each client account has its own keys (up to 5 active) and its own webhooks. A key can only ever see the account it belongs to.
- Name keys after the tool and the client ("Zapier — Client A") so the panel tells you what each one does.
- Revoking one key stops that tool and deactivates the webhooks it created, without touching anything else.