Loops
Create contacts and send events in Loops email platform.
On this page
Connect
Auth type: API key (secret_text). Paste the API key (or token) from the provider's settings into the connect dialog. It is encrypted at rest and only decrypted on the server when an action runs.
- In the editor: Backend panel, Integrations tab, then Connect. This connects it for the project.
- For every project in a workspace: Workspace settings, Integrations.
- Owners and admins choose which integrations members may connect in the admin panel (Integrations tab), and can attach their own OAuth app there.
Call it from a workflow
Pass the action name and its input. The call resolves with { success, output, error? }; a missing connection resolves with success false and the reason. See ctx.integrations.invoke and ctx.integrations.call.
// .workflow.js (native ctx)
export async function run(ctx) {
const res = await ctx.integrations.invoke("loops", "create_contact", {
"email": "<email>"
});
if (!res.success) throw new Error(res.error);
ctx.log.info("Loops answered", { output: res.output });
}// defineWorkflow module (@app/sdk ctx)
import { defineWorkflow } from "@app/sdk";
export default defineWorkflow({
id: "loops-create-contact",
name: "Loops: Create Contact",
description: "Calls Loops when a row is created.",
trigger: { type: "entity_event", entity: "tickets", event: "created" },
async run(ctx, event) {
const res = await ctx.integrations.call("loops", {
"action": "create_contact",
"email": "<email>"
}) as { success: boolean; error?: string };
if (!res.success) throw new Error(res.error);
},
});curl -X POST "$APP_ORIGIN/__appbricx/connector-proxy/loops/create_contact" \
-H "Authorization: Bearer $APP_KEY" \
-H "content-type: application/json" \
-d '{"props":{"email":"<email>"}}'Actions
create_contactin catalog
Create Contact. Creates a new contact in Loops. Returns an error if a contact with the given email already exists.
| Input | Type | Description |
|---|---|---|
emailrequired | text | The email address of the contact. |
firstNameoptional | text | The contact's first name. |
lastNameoptional | text | The contact's last name. |
userIdoptional | text | Your internal user ID for this contact. |
subscribedoptional | one of "no_change" | "true" | "false" | Set subscription status. Leave as "No Change" to preserve existing status on update. |
userGroupoptional | text | A group/segment to assign to this contact. |
sourceoptional | text | Where this contact came from (e.g. "signup-form", "import"). |
mailingListsoptional | object | Subscribe or unsubscribe this contact from mailing lists. Provide list IDs as keys with `true` (subscribe) or `false` (unsubscribe) as values. |
customPropertiesoptional | object | Additional custom contact properties as key-value pairs. Reserved fields (email, firstName, lastName, userId, subscribed, userGroup, source) are ignored here. |
send_eventin catalog
Send Event. Sends an event to Loops for a contact. Events can trigger email automations configured in your Loops dashboard.
| Input | Type | Description |
|---|---|---|
emailoptional | text | The email address of the contact to send the event for. |
userIdoptional | text | Your internal user ID of the contact (used if email is not provided). |
eventNamerequired | text | The name of the event to send (e.g. "signup", "purchase", "password-reset"). Must match an event set up in Loops. |
eventPropertiesoptional | object | Optional key-value pairs to attach to the event (used in email templates). |
mailingListsoptional | object | Subscribe or unsubscribe this contact from mailing lists. Provide list IDs as keys with `true` (subscribe) or `false` (unsubscribe) as values. |
contactPropertiesoptional | object | Optional contact property updates to apply when the event is sent. |
custom_api_call
Custom API Call. Make a custom API call to a specific endpoint
| Input | Type | Description |
|---|---|---|
urlrequired | object (depends on other props) | url |
methodrequired | one of "GET" | "POST" | "PATCH" | "PUT" | "DELETE" | "HEAD" | Method |
headersrequired | object | Authorization headers are injected automatically from your connection. |
queryParamsrequired | object | Query Parameters |
body_typeoptional | one of "none" | "json" | "form_data" | "raw" | Body Type |
bodyoptional | object (depends on other props) | Body |
response_is_binaryoptional | boolean | Enable for files like PDFs, images, etc. |
failsafeoptional | boolean | No Error on Failure |
timeoutoptional | number | Timeout (in seconds) |
followRedirectsoptional | boolean | Follow redirects |
delete_contact
Delete Contact. Permanently deletes a contact from Loops by their email address or user ID.
| Input | Type | Description |
|---|---|---|
emailoptional | text | The email address of the contact to delete. |
userIdoptional | text | Your internal user ID of the contact to delete. |
find_contact
Find Contact. Finds a contact in Loops by their email address or user ID.
| Input | Type | Description |
|---|---|---|
searchByrequired | one of "email" | "userId" | The field to search by. The Loops API only allows one search parameter. |
searchValuerequired | text | The email address or user ID to search for. |
send_transactional_email
Send Transactional Email. Sends a transactional email to a contact using a pre-built template in Loops.
| Input | Type | Description |
|---|---|---|
emailrequired | text | The recipient's email address. |
transactionalIdrequired | text | The ID of the transactional email template in Loops (find it in your Loops dashboard). |
addToAudienceoptional | boolean | If true, the recipient will be added to your Loops audience if they are not already a contact. |
dataVariablesoptional | object | Key-value pairs to populate dynamic variables in your email template (e.g. { "name": "Alice", "resetUrl": "https://..." }). |
Details
- Id
loops- Category
- Marketing
- Tags
- email, transactional, product-email, saas
- Package
@activepieces/piece-loops@0.0.1- Tier
- Community