SendPulse v2
Provides integration with SendPulse Bulk Email, the SendPulse email marketing service where you keep subscribers in mailing lists, store extra contact details in list variables and send email campaigns to those lists.
Use the Node to list, create, rename, and delete mailing lists, look up and search contacts, add contacts with or without list variables, update contact variables and phone numbers, and remove or unsubscribe contacts, for example to keep SendPulse mailing lists in step with a CRM or to load sign-ups collected in another system.
Revision History
0.0.0.2 - Initial release.
0.0.0.3 - Added mailing-list templates that prefill the list ID and load that list's variable fields.
0.0.0.5 - Each Create, Update, Delete and Unsubscribe item can now name the mailing list it targets, so one step can write to many lists without a For Each.
Connection
This Connection stores the credentials used by every SendPulse method. Choose an AuthenticationType; only the properties for the selected type are shown.
| Property | Type | Description |
|---|---|---|
AuthenticationType |
Enum | ClientCredentials to authenticate with a SendPulse API client ID and secret, or ApiKey to use a permanent SendPulse API key. Defaults to ClientCredentials. |
ClientId |
String | ClientCredentials only. The client ID from your SendPulse API settings. |
ClientSecret |
Masked | ClientCredentials only. The client secret from your SendPulse API settings. |
ApiKey |
Masked | ApiKey only. A permanent SendPulse API key, sent as a Bearer token. Replace it if it is revoked. |
TimeoutSeconds |
Integer | Timeout for each request, in seconds. Defaults to 30 and must be greater than zero. |
Setup Notes
- The SendPulse Node is available on Cloud Runtime clusters.
- In SendPulse, open your account's API settings and copy the API client ID and secret, or generate a permanent API key.
- With
ClientCredentials, the Node obtains short-lived access tokens and renews them automatically. Tokens are saved with the Connection so later runs can reuse an unexpired token. - With
ApiKey, the key cannot be renewed automatically. If SendPulse rejects the key, replace it in the Connection. - Click
Acquire Metadataon the Connection before loading template details or running the Node. This downloads SendPulse's public Bulk Email API description and saves it with the Connection. RunAcquire Metadataagain to refresh it. If a refresh fails, the previously saved metadata is kept. - Test Connection obtains a fresh access token, when
ClientCredentialsis selected, and performs a read-only request for one mailing list. It does not requireAcquire Metadataand does not change the saved Connection. - An HTTP
403response usually means your SendPulse account or tariff plan does not allow the requested operation.
Methods
Each method exposes templates for a fixed set of SendPulse mailing-list and contact operations. Select a template to populate the stable Operation value and the operation-specific Options and Items fields. Template names come from the SendPulse API, and each template description shows its HTTP method and path.
getEmailsFromMailingList and Add contacts with variables are also listed once for each mailing list in your account. These templates are named after the operation, the mailing list name, and its ID, prefill Options.id with that list's ID, and load the list's variable fields. Use the (Custom mailing list) version of these templates when you supply the mailing-list id yourself, for example from an earlier step in the Workflow.
Read operations use Options only. Write operations use Items for the request body, with one SendPulse request per row. Each row can name its own mailing list in id; rows that do not use the mailing list in Options.id. See Mailing Lists on Items.
Query
Retrieves mailing lists, list variables, and contacts. The Node pages through mailing-list and contact listings automatically and emits one row for each record.
Available templates:
getMailingLists(GET /addressbooks) - Lists the mailing lists in your account.getMailingListById(GET /addressbooks/{id}) - Gets one mailing list.getMailingListVariables(GET /addressbooks/{id}/variables) - Lists the variables defined for a mailing list.getEmailsFromMailingList (Custom mailing list)(GET /addressbooks/{id}/emails) - Lists the contacts in a mailing list, including their variable values. A template for each mailing list in your account is also available.getEmailsTotalCount(GET /addressbooks/{id}/emails/total) - Gets the number of contacts in a mailing list.getContactsByVariable(GET /addressbooks/{id}/variables/{variableName}/{searchValue}) - Finds contacts in a mailing list whose variable exactly matches a value.getEmailFromList(GET /addressbooks/{id}/emails/{email}) - Gets one contact from a mailing list by email address.
| Parameter | Type | Description |
|---|---|---|
Connection |
Connection | SendPulse Connection details. |
Operation |
String | Stable operation identifier populated by the selected template. |
Options |
Object | Path and filter values for the selected operation. Every template except getMailingLists requires the mailing-list id. getContactsByVariable also requires variableName and searchValue, and getEmailFromList requires email. Contact listings can accept optional filters such as order (asc or desc), active, and not_active, as shown by the template. |
| Return | Type | Description |
|---|---|---|
Response |
Array | One row per mailing list, variable, or contact returned by SendPulse, or a single row for a count or single-record lookup. |
Create
Creates mailing lists or adds contacts to a mailing list, one request for each row in Items.
Available templates:
createMailingList(POST /addressbooks) - Creates a mailing list.addEmailsToMailingList(POST /addressbooks/{id}/emails) - Adds email addresses to a mailing list.Add contacts with variables (Custom mailing list)(POST /addressbooks/{id}/emails) - Adds contacts to a mailing list together with values for the list's variables. A template for each mailing list in your account is also available.
| Parameter | Type | Description |
|---|---|---|
Connection |
Connection | SendPulse Connection details. |
Operation |
String | Stable operation identifier populated by the selected template. |
Options |
Object | For the contact templates, the mailing-list id used for rows that do not name their own list. Not used by createMailingList. |
Items |
Array | One request per row. createMailingList rows contain bookName. addEmailsToMailingList rows contain emails as a comma-separated list of up to 100 addresses. Add contacts with variables rows contain an emails array, where each entry has an email and a variables object holding the mailing list's variable fields. Contact template rows can also contain the target mailing-list id. |
| Return | Type | Description |
|---|---|---|
Response |
Array | One row per input item, containing the SendPulse response and Flowgear result metadata. createMailingList returns the new mailing list's id. |
Update
Renames a mailing list or updates contact details in a mailing list, using each row in Items as one request.
Available templates:
updateMailingList(PUT /addressbooks/{id}) - Renames a mailing list.updateContactVariables(POST /addressbooks/{id}/emails/variable) - Updates variable values for a contact.updateContactPhone(PUT /addressbooks/{id}/phone) - Updates the phone number for a contact.
| Parameter | Type | Description |
|---|---|---|
Connection |
Connection | SendPulse Connection details. |
Operation |
String | Stable operation identifier populated by the selected template. |
Options |
Object | The mailing-list id used for rows that do not name their own list. |
Items |
Array | One update request per row. updateMailingList rows contain the new name. updateContactVariables rows contain the contact's email and a variables array of name and value pairs. updateContactPhone rows contain the contact's email and the new phone. Each row can also contain the target mailing-list id. |
| Return | Type | Description |
|---|---|---|
Response |
Array | One row per input item, containing the SendPulse response and Flowgear result metadata. |
Delete
Deletes a mailing list or removes contacts from a mailing list.
Available templates:
deleteMailingList(DELETE /addressbooks/{id}) - Deletes a mailing list.deleteEmailsFromMailingList(DELETE /addressbooks/{id}/emails) - Removes email addresses from a mailing list.
| Parameter | Type | Description |
|---|---|---|
Connection |
Connection | SendPulse Connection details. |
Operation |
String | Stable operation identifier populated by the selected template. |
Options |
Object | The mailing-list id used for rows that do not name their own list. Required for deleteMailingList when Items is not connected. |
Items |
Array | For deleteEmailsFromMailingList, one request per row, each containing emails as a comma-separated list of up to 100 addresses and optionally the target mailing-list id. For deleteMailingList, optional rows that each name the mailing list to delete in id; a row without id deletes the list in Options.id. |
| Return | Type | Description |
|---|---|---|
Response |
Array | One row per request, containing the SendPulse response and Flowgear result metadata. |
Unsubscribe
Unsubscribes contacts from a mailing list without removing them. Select the unsubscribeEmailsFromMailingList template (POST /addressbooks/{id}/emails/unsubscribe).
| Parameter | Type | Description |
|---|---|---|
Connection |
Connection | SendPulse Connection details. |
Operation |
String | Stable operation identifier populated by the selected template. |
Options |
Object | The mailing-list id used for rows that do not name their own list. |
Items |
Array | One request per row, each containing emails as a comma-separated list of up to 100 addresses and optionally the target mailing-list id. |
| Return | Type | Description |
|---|---|---|
Response |
Array | One row per input item, containing the SendPulse response and Flowgear result metadata. |
Mailing Lists on Items
Create, Update, Delete and Unsubscribe templates that act on an existing mailing list let each item name its list in id. This lets one step write to many mailing lists without a For Each. createMailingList has no existing list, so it does not use id.
- An item's
idapplies to that item's request only. Items that leave it out, or set it tonull, useOptions.id, so you can leaveOptions.idempty when every item has its own. idselects the mailing list only and is not sent in the body to SendPulse.Flowgear.Requestshows the whole item withidset to the list actually used, so an item that usedOptions.idreports that list.- An item
idmust be a positive whole number, given as a number or as digit-only text such as"12". An object, a list,true/false, zero, a negative or decimal number, or any other text fails that item and does not fall back toOptions.id, so a mapping mistake never writes to theOptionslist. - If an item has no list in either place, or its
idis invalid, that item returnsFlowgear.IsSuccessset tofalseand aFlowgear.Messagenamingid. SendPulse is not called for that item, and the remaining items still run. This applies to the first item too. Add contacts with variablesreads the variable fields of each item's own list, so items can mix lists with different variables. A variable that does not belong to the item's list fails that item.- Templates list
idunderItemswith a sample but no value. Refresh the template in existing write steps to see it. - If the items in an existing write step already contain
id, that value now selects the mailing list. Before this change, anidfield on a body operation was rejected as an unsupported field. A missing list on the first item now returns a failed row instead of failing the Node.
Warning: For
deleteMailingList, an item that is empty or hasidset tonullnow deletes the mailing list inOptions.id. Before this change, such an item failed. If an existing Workflow setsOptions.idand its mapping can leaveidempty, clearOptions.idor mapidon every item before you update the Node.
Usage Notes
- The Node supports SendPulse mailing lists and contacts only. Campaigns, SMTP, SMS, chatbots, double opt-in, tags, the blacklist, account balance, and webhooks are not available.
Optionsaccepts only the path and filter values shown by the selected template. Unknown fields are rejected. Paging is managed by the Node, solimitandoffsetare not available.Queryuses the mailing list inOptions.idfor the whole invocation. To read several mailing lists, run the Node once per list, for example inside a For Each. Write rows can name their own mailing list, as described in Mailing Lists on Items.getContactsByVariablematchessearchValueliterally. It is not a filter expression. Template samples are not applied unless you enter a value.getEmailsFromMailingListandAdd contacts with variablesuse the variables defined on the selected mailing list. Select the template for a specific mailing list to see that list's typed variable fields. With a(Custom mailing list)template, supplyOptions.idwhen loading template details to see the same fields. Without it, the template shows an emptyvariablesobject as a placeholder. You do not need to fill it in.- The per-mailing-list templates are listed only after
Acquire Metadatahas been run on the Connection. Before that, only the(Custom mailing list)templates are available. Existing Workflows continue to work unchanged. - Mailing-list variables of type string, number, and date are supported. Any other variable type, or a list with duplicate or unnamed variables, causes an error.
- Enter
emailsinaddEmailsToMailingList,deleteEmailsFromMailingList, andunsubscribeEmailsFromMailingListas a comma-separated list of no more than 100 addresses per row. Quote values that contain commas, quotes, or line breaks, and double any embedded quotes. Spaces are preserved, and an empty value produces an empty list. Split larger lists across several rows. - Contact additions require plain email addresses, for example
contact@example.com. Addresses that include a display name or surrounding spaces are rejected before the request is sent. - A successful contact addition means SendPulse accepted the request. It does not confirm that every address was added, because SendPulse can process contacts asynchronously or filter them. The
Flowgear.Messagefor these rows isSendPulse accepted the request; contact insertion is not confirmed.Use aQuerytemplate to confirm the result when required. deleteMailingListruns once usingOptions.idwhenItemsis not connected. WhenItemsis connected, each row deletes the list it names inid, or the list inOptions.idwhen it has none. A row may contain onlyid; fields set tonullare ignored, and any other field fails that row without a request. An emptyItemsinput deletes nothing.Create,Update,Delete, andUnsubscriberesponses includeFlowgear.IsSuccess,Flowgear.Message, andFlowgear.Request. Failed rows also include SendPulse'smessageanderror_codewhen SendPulse returns them.- When SendPulse rejects an individual item, for example because of a validation error, the Node returns a failed row and continues with later items. Authentication, permission, connection, and other request-wide failures stop the operation.
Queryrows return records as SendPulse provides them, withoutFlowgearmetadata. An empty result returns no rows. Numeric contactphonevalues are returned as strings.getEmailFromListreturns contactvariablesas an array ofname,type, andvalueobjects.- If SendPulse briefly limits the request rate, the Node waits and retries a limited number of times. If the account quota is exhausted, the operation fails until the quota resets.
- Writes that time out or return an unexpected response are not retried automatically. Check the mailing list in SendPulse before running the write again.
- SendPulse stores phone numbers without a leading
+, so+27115550100reads back as27115550100. An unsubscribed contact reads back withstatus_explainset toIn blacklist. A mailing list that does not exist returns HTTP404witherror_code213, which becomes a failed row for that item.
Known Issues
getContactsByVariablereturns the results from a single SendPulse response. SendPulse does not document paging for this search, so very large result sets may not be returned in full.