Skip to main content
Make (formerly Integromat) is a no-code automation platform. Connect Senderz to Make and you can create and update profiles, manage list membership, send transactional email and SMS, push custom events into your automations, and react to Senderz events in real time. Everything in Make runs on the Senderz Public API. Whatever a module does, you can do with a plain HTTP call.

What is available today

Read this before you plan a scenario. The API is the part we control and can promise. The app in Make is a separate artifact hosted by Make.

The API surface: live

Every operation on this page is a live endpoint you can call right now, from the Senderz app, from Make’s HTTP modules, or from your own code.

The app in Make: invite only

The Senderz app is shared through an invitation link, not published in Make’s public app directory. Searching Make for “Senderz” will not find it. Use the link on your Integrations screen.
Module names, field labels and grouping inside the Make app are defined in Make, not in Senderz, so they can differ from the endpoint names below. This page documents the API each module calls. If a module in the app looks different from what you read here, the API is the source of truth. When in doubt, use the universal API call module or an HTTP module.

Getting the app

1

Open Integrations in Senderz

Go to Integrations and scroll to the API & Webhooks section.
2

Open the Make card

Find the Make.com Module card and press Open Make. That opens an app invitation in Make.
3

Accept the invitation

Accept it while signed in to the Make organization you want the app in. The app then appears in that organization’s module list.
An invitation adds the app to one Make organization. If you work in several organizations, open the link again from each one.

If you would rather not use the app

You can build the same scenarios with Make’s built-in modules, and it is fully supported:
  • HTTP → Make a request for every action, search and dropdown.
  • Webhooks → Custom webhook for instant triggers, with a Senderz webhook endpoint pointed at the Make webhook URL.
Nothing on this page depends on the app being installed.

Before you connect

You need two values. Both live in Senderz. The Workspace ID shown in Settings is your workspace slug. The workspace UUID is also accepted if you happen to have it.

Create the connection

1

Copy your Workspace ID

Settings → Workspace. Press the copy icon next to Workspace ID.
2

Create an API key

Settings → API Tokens → Create key. Give it a name you will recognise later, such as Make. The key is shown once, in a dialog, with a copy button. Copy it before you close that dialog. Keys start with sk_evt_.Only an owner or admin can create a key.
3

Paste both into Make

Add a Senderz module in Make, create a new connection, and paste the Workspace ID and the key.If you are using HTTP modules instead, set the two headers on every request yourself.
4

Confirm it works

A connection check calls GET /public/me, which returns your workspace name, slug, plan and status plus the API version. If that call returns 401, one of the two values is wrong.
An API key is a password. It can read your contacts, change consent, send transactional messages and manage webhook endpoints on your workspace. Never paste it into a browser console, a shared document or a client-side script.

Use a separate key for Make

A workspace can hold several named keys, so give Make its own. Settings → API Tokens lists them with: Removal is two steps on purpose. Revoke stops the key working immediately and leaves the row visible so you keep the record. Delete then removes the revoked row permanently. A revoked key cannot be un-revoked, so create the replacement first, update the Make connection, then revoke the old one.
The Last used column is the quickest way to find a key nobody needs. If a key has never been used, or was last used months ago, revoking it is safe.

Instant triggers

Instant triggers are outbound webhooks. Senderz posts to a URL the moment something happens, and Make starts the scenario.

How a trigger is wired

1

Get a webhook URL

In Make, add a Custom webhook trigger (or the Senderz app’s own instant trigger) and copy the URL it gives you. It will be an https address.
2

Subscribe

Create a Senderz webhook endpoint pointing at that URL and listing the events you want. From Make that is POST /public/webhooks with { "url": "...", "events": ["contact.created"] }. From the dashboard it is Settings → Webhooks.The response includes a signingSecret, returned once and never again.
3

Receive

Senderz posts JSON to the URL for every matching event.

The delivery Make receives

Every delivery is a POST with this body:
And these headers: The data object differs per event family: A failed delivery is retried up to 5 times with an increasing delay, then gives up. Deliveries are not queued indefinitely, so a Make webhook that is offline for a long stretch will lose events.
Three delivery rules will silently break a trigger if you ignore them.The endpoint URL must be a public https address on the default port. Private, loopback and link-local addresses are rejected when you subscribe, and checked again before every single delivery, so an endpoint whose DNS later points somewhere private stops receiving.Redirects are never followed. If your URL answers 3xx, that delivery is marked failed and is not retried into the new location. Subscribe the final URL.A delivery has a 10 second timeout. Answer 2xx fast and do the work afterwards.

Events you can subscribe to

There are 29 event types. You can also subscribe an endpoint to * to receive all of them without listing each one.
contact.created, contact.updated, contact.unsubscribed, list.subscribed, list.unsubscribed.These fire from any source: the dashboard, an import, the API, a form.
email.opened, email.clicked, sms.delivered, sms.failed.Opens and clicks come from Senderz tracking. SMS delivery status comes from the carrier receipt.
order.completed, order.refunded, order.fulfilled, order.partially_fulfilled, order.cancelled, checkout.started, cart.abandoned, shipment.confirmed, shipment.out_for_delivery, shipment.delivered.These come from a connected store. With no store connected, nothing fires.
review.request_ready, review.submitted, review.question, review.answer.These require a connected reviews app.
loyalty.points_earned, loyalty.points_expiring, loyalty.tier_changed, loyalty.redemption, loyalty.referral.These require a connected loyalty app.
campaign.sent is accepted in a subscription and appears in the event list, but nothing in Senderz emits it today. An endpoint subscribed to it will never fire. Do not build a scenario on it.To act when a campaign goes out, trigger on the per-recipient engagement events instead, or poll the message log.
A custom event you post to /events/ingest does not come back out as an outbound webhook. Custom events start Senderz automations and record profile activity. They are an input, not a trigger source for Make. If Make needs to know about something, have Make branch on it directly rather than sending it to Senderz and waiting for it to return.

Polling triggers

If you would rather poll than receive webhooks, two endpoints are ordered so a polling trigger works.

New or updated profiles

string
-createdAt for newest first, -updatedAt to catch edits as well as creations. Also accepts email, firstName, lastName. A - prefix means descending.
integer
default:"25"
Page size, up to 200 on this endpoint.
integer
default:"1"
1-based page number.
integer
Records to skip. If you send offset, it wins over page.
Free text match.
string
Only profiles in this segment.
subscribed, unsubscribed, never_subscribed or cleaned.
string
email or sms, pairs with consent.
Store the newest createdAt you have seen and stop paging when you reach it.

Message delivery status

Returns messages newest first, each with id, channel, status, failureReason, providerMessageId, createdAt, sentAt, deliveredAt and updatedAt. Use it to follow up on a transactional send, or fetch one by id with GET /public/messages/{id}.

Actions

Every merchant-facing action is keyed by email. The UUID forms stay available for callers that already hold an id.

Create, upsert and update a profile

PUT /public/profiles is the one to reach for in a sync scenario. It looks for a profile by email, then by phone, updates it if found, and creates it if not. POST creates and conflicts on a duplicate. PATCH /public/profiles requires the profile to already exist and returns 404 if it does not.
email, phone, firstName, lastName, timezone, locale.On PATCH /public/profiles, email is the lookup key and is required. Send newEmail to change the address.
tags is an array of strings and replaces the profile’s tags. notes is free text, up to 4000 characters, and accepts null to clear.
city, country, stateProvince, zip, address1, address2, dateOfBirth, gender, jobTitle.These are stored as custom properties rather than as their own columns, so they come back inside customProperties on a read, not at the top level. Anything you put in customProperties yourself is merged in alongside them.

List membership

Lists in Senderz are manually managed, so both member calls work on any list. There is no separate rule for a different kind of list.
  • Up to 100 profiles per call, counting emails, email, contactIds and contactId together.
  • An email that does not match an existing profile is created as a new profile and then added.
  • Adding returns { added, count } and removing returns { removed, count }, where count is the list size afterwards.
  • Each add fires list.subscribed and each removal fires list.unsubscribed, so one Make scenario can feed another.
  • If none of the identifiers resolve to a profile, the call returns 400 rather than doing nothing quietly.
Get the list ids from GET /public/lists, which returns id, name, description, members, color, archived, source and timestamps.

Blacklist

POST /public/profiles/blacklist takes email or contactId, and an optional channel of email, sms or both. channel defaults to email, so pass both if you mean both. DELETE /public/profiles/blacklist reverses it, and restores the consent state the profile had before it was blacklisted rather than guessing a new one.

Send transactional email

string
Recipient email. Use this or contactId.
string
Existing profile UUID.
string
required
Sender address. Its domain must be a verified sending domain on your workspace, otherwise the call returns 400.
string
Display name.
string
Reply-to address.
string
Required unless you send templateId.
string
Required unless you send templateId.
string
Optional plain-text alternative.
string
Send a saved Senderz template instead of subject and html.
object
Values for the template’s merge fields, as flat key/value pairs.
Returns 202 with { "messageId": "..." }. That is an accepted-for-sending id, not a delivery confirmation. Poll GET /public/messages/{id} for status. If the recipient does not exist as a profile yet, one is created.
A transactional send skips marketing consent, quiet hours and Shabbat rules, because the recipient asked for it. It still respects suppression: a hard bounce or a spam complaint blocks the send.

Send transactional SMS

string
Recipient phone number. Use this or contactId.
string
Existing profile UUID.
string
required
The sender name recipients see. It must be an approved sender identity on your workspace. Up to 11 characters.
string
Message text. Required unless you send templateId.
string
A saved SMS template.
object
Merge-field values for the template.
Returns 202 with { "messageId": "..." }.
senderId is required and there is no default. Fetch the approved list from GET /public/sms-sender-ids and use one of those values. An unapproved value returns 400. See SMS Sender names for how a name gets approved.SMS costs credits. If your credit balance is lower than the message needs, the call returns 403 with the code insufficient_credits and nothing is sent. One credit covers up to 268 billable characters per recipient, so a long body costs more than one. See SMS for how credits, characters and carrier parts relate.
A transactional SMS carries no unsubscribe line. That line is added to marketing SMS only. Only send genuinely transactional content through this endpoint.

Send a custom event

string
required
Event name, up to 128 characters.
string
Identify the profile. One of email, phone or contactId.
string
Identify the profile by phone.
string
Identify the profile by UUID.
string
Used only if the profile has to be created.
string
Used only if the profile has to be created.
object
Details of this occurrence.
string
Your unique id for this occurrence. Two deliveries with the same id count once. Always send one from Make, where a scenario can legitimately re-run.
integer
Monetary value in minor units, for example agorot or cents.
string
Currency code for value.
string
ISO 8601 timestamp, if the event is not happening right now.
object
Profile fields to update at the same time. Kept separate from properties on purpose: an event property describes the occurrence and must never quietly become a contact field.
Returns { status, enrolled, contactId, created }. enrolled is how many automations the event started, so a 0 there tells you the event landed but no automation was listening.
The event name you send becomes selectable as an automation trigger in Senderz. Keep names stable and lowercase, such as subscription_renewed. Renaming an event later orphans any automation built on the old name.

Searches and dropdowns

These endpoints exist to fill pickers in Make, so you choose a template or a sender by name instead of pasting a UUID. They all return { value, label } plus a few extra fields. Two of these are worth calling out. GET /public/sender-addresses returns only addresses whose domain is verified and whose mailbox is confirmed. If it comes back empty, that is why POST /public/messages/email is returning 400. Fix it under Settings → Domains & senders, described in Sender addresses and names. GET /public/events returns the 29 system event names marked kind: "system", plus every custom event your workspace has actually recorded. It is the safest way to populate an event picker, because a name that is not in that list has never been seen in your workspace.

Pagination

Every list and dropdown returns the same envelope inside data:
To page through, keep calling with offset set to the previous next_cursor until has_more is false. That loop works on every endpoint below. Page sizes are not identical everywhere: Where both page and offset are accepted, sending offset wins.
Make caps how long a single module run may take and how many records it can return in one execution. Those caps are Make’s, not ours, and they vary by plan, so check Make’s own documentation. If you hit one, lower limit and let the scenario run more often rather than pulling everything in a single pass.

The universal API call module

For anything without a dedicated module, use the app’s generic API call module or Make’s HTTP module. The connection supplies both auth headers.
The base URL is https://api.senderz.app/api/v1, so a relative path of /public/profiles resolves to https://api.senderz.app/api/v1/public/profiles. If you are using Make’s HTTP module directly, set both headers yourself:
Successful responses are wrapped as { "success": true, "data": ... }, so map from data in Make, not from the root.

Worked examples

  1. Trigger: your CRM’s own “new record” module.
  2. Create or update a profile (PUT /public/profiles) with email, firstName, lastName.
  3. Add to a list (POST /public/lists/{id}/members) with emails: ["{{email}}"]. Pick the list id from GET /public/lists.
Do not set emailConsent: "subscribed" in step 2 unless the CRM record holds a real opt-in. Adding someone to a list is not the same as having permission to market to them.
  1. Trigger: an event in the other app, for example an invoice being issued.
  2. Send transactional email with to, a fromEmail from GET /public/sender-addresses, a templateId from GET /public/templates?channel=email, and templateFields filled from the trigger.
  3. Optional: store the returned messageId, then in a later scenario call GET /public/messages/{id} and alert yourself if status is a failure.
Call GET /public/templates/{id}/merge-fields once while building to see exactly which keys templateFields must contain.
  1. Trigger: an event in another tool, for example a delivery going out.
  2. Send transactional SMS with to, body and a senderId from GET /public/sms-sender-ids.
  3. Add an error handler on 403 so a run with too few credits fails loudly rather than skipping the message.
  1. In Make, add a Custom webhook and copy its URL.
  2. Subscribe it: POST /public/webhooks with { "url": "YOUR_MAKE_WEBHOOK_URL", "events": ["email.opened", "email.clicked"] }.
  3. Map event, data.contactId and data.occurredAt into your destination.
Store the signingSecret from step 2 somewhere safe and verify X-Sender-Signature if your destination is sensitive.
  1. Trigger: a subscription renewal in your billing tool.
  2. Send a custom event to /events/ingest with event: "subscription_renewed", the customer’s email, an eventId taken from the billing record, and properties such as the plan name.
  3. In Senderz, build an automation triggered on subscription_renewed.
Check enrolled in the response while testing. A 0 means the event arrived but no automation is listening yet.
  1. Trigger: the unsubscribe event in the other platform.
  2. Update a profile (PATCH /public/profiles) with email and emailConsent: "unsubscribed", or Blacklist a profile with channel: "both" if you want to stop every channel at once.
Mirroring opt-outs inward is always safe. Mirroring opt-ins inward is not, unless you can show where the consent came from.

Troubleshooting

Building your own Make app

If you are writing a custom Make app rather than using ours, the API publishes a machine-readable OpenAPI description you can import: The API version is 2026-01. New behaviour is added compatibly.

Reference

API introduction

Base URL, versioning and the response envelope.

Authentication

The two headers, in detail.

Profiles

Full field reference for create, upsert, update and lookup.

Lists

List membership endpoints.

Messages

Transactional email and SMS.

Events

The custom event payload.

Outbound webhooks

Endpoints, signing and the full event vocabulary.

Pagination

The paging envelope.