Use Klozeo in your Make scenarios
Klozeo has no dedicated Make app, and it doesn’t need one. Make’s HTTP app, module Make a request, sends every lead to the Klozeo REST API. Each push runs deduplication. A lead sent again merges only when it matches an existing lead on the email, the SIREN, the source_id or the phone with a similar name. Without any of those keys, Klozeo creates a new lead.
Authentication
Section titled “Authentication”Every request needs your API key in the X-API-Key header. Create one in the dashboard under API Keys, with New key. The key is shown only once, so copy it right away. Use a separate key for Make so you can revoke it without breaking your other integrations.
In Make a request, set Authentication type to API key and add a key:
| Field | Value |
|---|---|
| Name | Klozeo |
| Key | sk_live_... |
| API key placement | In the header |
| API key parameter name | X-API-Key |
Leave Headers empty. Make stores the key in its Keys section, outside your scenario, and you can reuse it in every Klozeo module.
Create or update a lead
Section titled “Create or update a lead”POST /leads checks for duplicates before every insert. If the lead matches on the email, the SIREN, the source_id or the phone with a similar name, Klozeo updates it instead of creating a second one.
HTTP › Make a request:
| Field | Value |
|---|---|
| Authentication type | API key (the key above) |
| URL | https://api.klozeo.com/api/v1/leads |
| Method | POST |
| Body content type | application/json |
| Body input method | Data structure |
| Parse response | Yes |
name and source are required. Every other field is optional. The body looks like this:
{ "name": "Acme", "source": "make", "city": "Lyon", "source_id": "typeform-8f2c"}Use source_id for the record’s ID in the system it comes from, such as a form response, a sheet row or a CRM record. Klozeo uses it to recognize the lead on the next run.
Map fields from a previous module
Section titled “Map fields from a previous module”Under Body structure, click Add and create one text item for each Klozeo field you send: name, source, email, city, source_id. Then, in Body content, map each item from the output of an earlier module, such as a form answer or a sheet column. Type a fixed value such as make for source.
Use Data structure rather than JSON string. Make escapes quotes and other JSON characters in mapped values for you, so a company name like "Acme" & Co does not break the request.
When Klozeo finds a duplicate
Section titled “When Klozeo finds a duplicate”A lead counts as a duplicate when it matches an existing lead’s email (case-insensitive), SIREN, or source_id, or its phone number with a similar name. In that case Klozeo updates the existing lead and returns 200 instead of 201:
- Each field you send with a value replaces the stored value, including phone, email and website, unless it is locked. A merge never changes the
name, thestatusor the GPS coordinates (latitude,longitude). - Fields you leave out, or send empty, stay unchanged.
tagsare added to the existing tags, never replaced.- A lead marked Do not contact stays marked, even if you send
"do_not_contact": false.
A lead that only shares a name and city with another one is still created, with a potential_duplicate_id in the response. → Deduplication guide
Read the response
Section titled “Read the response”Run the module once so Make learns the response’s shape. With Parse response set to Yes, you can then map its fields into later modules.
Created (201):
{ "id": "cl_...", "message": "Lead created successfully", "created_at": 1703520000}Merged into an existing lead (200):
{ "id": "cl_existing...", "message": "Duplicate detected, existing lead updated", "created_at": 1703520000, "duplicate": true}In both cases id is the lead’s ID. Map it into a later module, for example PUT https://api.klozeo.com/api/v1/leads/<id> to set a status after a scoring step. To branch on what happened, add a filter on duplicate: it is true only on a merge.
Handle errors
Section titled “Handle errors”Under advanced settings, set Return error if HTTP request fails to Yes. A 4xx or 5xx response then stops the run with an error, so a lead never goes missing without anyone noticing.
| Status | Meaning | What to do |
|---|---|---|
400 |
The body is invalid: name or source is missing or empty, the JSON is malformed, or website is not an absolute http(s) URL. The message field explains why. |
Fix the mapping. An empty mapped value counts as missing. |
401 |
The API key is missing, wrong or revoked. | Check the API key parameter name (X-API-Key) and the key itself. |
403 |
Your plan’s lead limit is reached (leads_limit_reached). |
Upgrade or delete leads. |
429 |
Too many requests: 250 per 10 minutes on Free, 2,500 on Pro, 5,000 on Scale, per API key. | Wait the number of seconds in the Retry-After header, then run again. For large lists, send up to 100 leads per request (500 on paid plans) with batch create. |
Errors use the same JSON shape:
{ "error": "bad_request", "message": "name is required", "code": "bad_request"}