PHP code example of loops-so / loops
1. Go to this page and download the library: Download loops-so/loops library . Choose the download type require .
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
loops-so / loops example snippets
use Loops\LoopsClient;
$loops = new LoopsClient(env('LOOPS_API_KEY'));
// Test API key
$result = $loops->apiKey->test();
// Create a contact and catch errors
try {
$result = $loops->contacts->create('[email protected] ', [
'firstName' => 'John'
]);
} catch (Loops\Exceptions\APIError $e) {
// Handle API errors (400, 401, 403, etc)
echo $e->getMessage();
$returnedJson = $e->getJson(); // JSON returned by the API
$statusCode = $e->getStatusCode(); // HTTP status code from the response
} catch (\Exception $e) {
// Handle any other unexpected errors
echo "Unexpected error: " . $e->getMessage();
}
try {
$result = $loops->contacts->create('[email protected] ', [
'firstName' => 'John'
]);
} catch (Loops\Exceptions\RateLimitExceededError $e) {
// Handle rate limiting
echo "Rate limit hit. Limit: " . $e->getLimit() . ", requests remaining: " . $e->getRemaining();
} catch (Loops\Exceptions\APIError $e) {
// Handle API errors (400, 401, 403, etc)
echo $e->getMessage();
} catch (\Exception $e) {
// Handle any other unexpected errors
echo "Unexpected error: " . $e->getMessage();
}
$result = $loops->apiKey->test();
$result = $loops->contacts->create("[email protected] ");
$contact_properties = [
'firstName' => "Bob" /* Default property */,
'favoriteColor' => "Red" /* Custom property */,
];
$mailing_lists = [
'cm06f5v0e45nf0ml5754o9cix' => TRUE,
'cm16k73gq014h0mmj5b6jdi9r' => FALSE,
];
$result = $loops->contacts->create(
email: "[email protected] ",
properties: $contact_properties,
mailing_lists: $mailing_lists
);
$result = $loops->contacts->update(
email: '[email protected] ',
properties: [
'firstName' => 'Bob', /* Default property */
'favoriteColor' => 'Blue' /* Custom property */
]
);
// Updating a contact's email address using $user_id
$result = $loops->contacts->update(
user_id: '1234',
email: '[email protected] '
);
// Subscribe a contact to a mailing list
$result = $loops->contacts->update(
email: '[email protected] ',
mailing_lists: [
'cm06f5v0e45nf0ml5754o9cix' => true /* Subscribe */,
'cm16k73gq014h0mmj5b6jdi9r' => false /* Unsubscribe */
]
);
$result = $loops->contacts->find(email: '[email protected] ');
$result = $loops->contacts->find(user_id: '12345');
$result = $loops->contacts->delete(email: '[email protected] ')
$result = $loops->contacts->delete(user_id: '12345')
$result = $loops->contacts->checkSuppression(email: '[email protected] ');
$result = $loops->contacts->checkSuppression(user_id: '12345');
$result = $loops->contacts->removeSuppression(email: '[email protected] ');
$result = $loops->contacts->removeSuppression(user_id: '12345');
$result = $loops->contactProperties->create("planName", "string");
$result = $loops->contactProperties->list();
$result = $loops->contactProperties->list(list: "custom");
$result = $loops->mailingLists->list();
$result = $loops->events->send(
event_name: 'signup',
email: '[email protected] '
);
$result = $loops->events->send(
event_name: 'signup',
email: '[email protected] ',
event_properties: [
'username' => 'user1234',
'signupDate' => '2024-03-21T10:09:23Z'
],
mailing_lists: [
'cm06f5v0e45nf0ml5754o9cix' => true,
'cm16k73gq014h0mmj5b6jdi9r' => false
]
;
# In this case with both email and user_id present, the system will look for a contact with either a
# matching `email` or `user_id` value.
# If a contact is found for one of the values (e.g. `email`), the other value (e.g. `user_id`) will be updated.
# If a contact is not found, a new contact will be created using both `email` and `user_id` values.
# Any values added in `contact_properties` will also be updated on the contact.
$result = $loops->events->send(
event_name: 'signup',
email: '[email protected] ',
user_id: '1234567890',
contact_properties: [
'firstName' => 'Bob',
'plan' => 'pro',
}]
});
# Example with Idempotency-Key header
$result = $loops->events->send(
event_name: 'signup',
email: '[email protected] ',
headers: [
'Idempotency-Key' => '550e8400-e29b-41d4-a716-446655440000'
]
);
$result = $loops->transactional->send(
transactional_id: 'clfq6dinn000yl70fgwwyp82l',
email: '[email protected] ',
data_variables: [
'loginUrl' => 'https://myapp.com/login/',
]
);
# Example with Idempotency-Key header
$result = $loops->transactional->send(
transactional_id: 'clfq6dinn000yl70fgwwyp82l',
email: '[email protected] ',
data_variables: [
'loginUrl' => 'https://myapp.com/login/',
],
headers: [
'Idempotency-Key' => '550e8400-e29b-41d4-a716-446655440000'
]
);
# Please contact us to enable attachments on your account.
$result = $loops->transactional->send(
transactional_id: 'clfq6dinn000yl70fgwwyp82l',
email: '[email protected] ',
data_variables: [
'loginUrl' => 'https://myapp.com/login/',
],
attachments: [
[
'filename' => 'presentation.pdf',
'contentType' => 'application/pdf',
'data' => base64_encode(file_get_contents('path/to/presentation.pdf'))
]
]
);
$result = $loops->transactional->list();
$result = $loops->transactional->list(per_page: 15);
$result = $loops->transactional->create(name: 'Welcome email');
$result = $loops->transactional->get(transactional_id: 'clfq6dinn000yl70fgwwyp82l');
$result = $loops->transactional->update(
transactional_id: 'clfq6dinn000yl70fgwwyp82l',
name: 'Updated welcome email'
);
$result = $loops->transactional->ensureDraft(transactional_id: 'clfq6dinn000yl70fgwwyp82l');
$result = $loops->transactional->publish(transactional_id: 'clfq6dinn000yl70fgwwyp82l');
$result = $loops->uploads->upload(path: '/path/to/image.png');
$imageUrl = $result['finalUrl'];
$result = $loops->dedicatedSendingIps->list();
$result = $loops->themes->list();
$result = $loops->themes->list(per_page: 15, cursor: 'clyo0q4wo01p59fsecyxqsh38');
$result = $loops->themes->get(theme_id: 'clo5p8q0r0132ntx6flkunw89');
$result = $loops->themes->create(
name: 'Dark mode',
styles: ['backgroundColor' => '#111827', 'bodyColor' => '#1f2937']
);
$result = $loops->themes->update(
theme_id: 'clo5p8q0r0132ntx6flkunw89',
name: 'Updated theme'
);
$result = $loops->components->list();
$result = $loops->components->get(component_id: 'clp6q9r1s0154ouy7gmlovx90');
$result = $loops->components->create(
name: 'Header',
lmx: '<Paragraph>Welcome to Acme</Paragraph>'
);
$result = $loops->components->update(
component_id: 'clp6q9r1s0154ouy7gmlovx90',
lmx: '<Paragraph>Updated header</Paragraph>'
);
$result = $loops->campaigns->list();
$result = $loops->campaigns->create(name: 'Spring announcement');
$result = $loops->campaigns->create(
name: 'Spring announcement',
mailing_list_id: 'cm06f5v0e45nf0ml5754o9cix',
scheduling: ['method' => 'schedule', 'timestamp' => '2026-06-01T10:00:00Z']
);
$result = $loops->campaigns->get(campaign_id: 'cln4o7p9q0110msw5ekjtmv78');
$result = $loops->campaigns->update(
campaign_id: 'cln4o7p9q0110msw5ekjtmv78',
name: 'Updated name'
);
// Clear the mailing list audience target
$result = $loops->campaigns->update(
campaign_id: 'cln4o7p9q0110msw5ekjtmv78',
mailing_list_id: null
);
$result = $loops->campaignGroups->list();
$result = $loops->campaignGroups->create(name: 'Newsletters', description: 'Monthly updates');
$result = $loops->campaignGroups->get(campaign_group_id: 'clq7r0s2t0176pvz8hnmpwy01');
$result = $loops->campaignGroups->update(
campaign_group_id: 'clq7r0s2t0176pvz8hnmpwy01',
name: 'Updated name'
);
$result = $loops->audienceSegments->list();
$result = $loops->audienceSegments->create(
name: 'Power users',
filter: [
'match' => 'all',
'conditions' => [
[
'type' => 'property',
'key' => 'plan',
'operator' => 'equals',
'value' => 'pro',
],
],
],
description: 'Contacts on the pro plan'
);
$result = $loops->audienceSegments->get(audience_segment_id: 'clr8s1t3u0198qw09iotqzx12');
$result = $loops->workflows->list();
$result = $loops->workflows->create(
name: 'Welcome series',
description: 'Onboarding emails for new signups'
);
$result = $loops->workflows->get(workflow_id: 'cls9t2u4v0210rx20jpuary23');
$result = $loops->workflows->update(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
name: 'Updated welcome series'
);
$result = $loops->workflows->delete(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8'
);
$result = $loops->workflows->delete(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
confirm_delete: true
);
$result = $loops->workflows->changeMailingList(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
mailing_list_id: 'cm06f5v0e45nf0ml5754o9cix',
dry_run: true
);
$result = $loops->workflows->getNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
node_id: 'clt0u3v5w0232sy31kqvbzs34'
);
$result = $loops->workflows->createNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
insert_mode: 'between',
node_type_name: 'TimerAction',
from_node_id: 'clt0u3v5w0232sy31kqvbzs34',
to_node_id: 'clt0u3v5w0232sy31kqvbzs35'
);
$result = $loops->workflows->createNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
insert_mode: 'after',
node_type_name: 'TimerAction',
from_node_id: 'clt0u3v5w0232sy31kqvbzs34'
);
$result = $loops->workflows->createNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
insert_mode: 'before',
node_type_name: 'TimerAction',
to_node_id: 'clt0u3v5w0232sy31kqvbzs35'
);
$result = $loops->workflows->updateNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
node_id: 'clt0u3v5w0232sy31kqvbzs34',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
payload: ['amount' => 2, 'unit' => 'd']
);
$result = $loops->workflows->deleteNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
node_id: 'clt0u3v5w0232sy31kqvbzs34',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
dry_run: true
);
$result = $loops->workflows->addBranch(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
node_id: 'clt0u3v5w0232sy31kqvbzs34',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8'
);
$result = $loops->workflows->rerouteNode(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
node_id: 'clt0u3v5w0232sy31kqvbzs34',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
new_target_node_id: 'cln3c5d7e9f1g3h5i7j9k1l3'
);
$result = $loops->workflows->deleteNodeRecursive(
workflow_id: 'cls9t2u4v0210rx20jpuary23',
node_id: 'clt0u3v5w0232sy31kqvbzs34',
expected_revision_id: 'clrev1s10n2i3d4e5f6g7h8',
dry_run: true
);
$result = $loops->eventPatterns->list();
$result = $loops->eventPatterns->get(event_pattern_id: 'cle1v2e3n4t5p6a7t8t9e0r1');
$result = $loops->eventPatterns->getByName(event_name: 'signup');
$result = $loops->emailMessages->get(email_message_id: 'cly8k3m0n0044jpx2bghepq45');
$result = $loops->emailMessages->update(
email_message_id: 'cly8k3m0n0044jpx2bghepq45',
expected_revision_id: 'clm9n4o6p0088lrz4dijslt67',
subject: 'Updated subject',
lmx: '<Email><Text>Hello</Text></Email>'
);
// Example with contact property fallbacks
$result = $loops->emailMessages->update(
email_message_id: 'cly8k3m0n0044jpx2bghepq45',
contact_properties_fallbacks: [
'firstName' => 'there', // If firstName is missing, use "there"
'company' => 'your company', // If company is missing, use "your company"
'planName' => null // null removes the fallback for "planName"
]
);
$result = $loops->emailMessages->preview(
email_message_id: 'cly8k3m0n0044jpx2bghepq45',
emails: ['[email protected] '],
contact_properties: ['firstName' => 'Alex']
);
$result = $loops->emailMessages->guardian(email_message_id: 'cly8k3m0n0044jpx2bghepq45');
$result = $loops->transactionalGroups->list();
$result = $loops->transactionalGroups->create(name: 'Account emails');
$result = $loops->transactionalGroups->get(transactional_group_id: 'clv2w3x4y0288xbb0kqrsuv67');
$result = $loops->transactionalGroups->update(
transactional_group_id: 'clv2w3x4y0288xbb0kqrsuv67',
name: 'Updated name'
);
json
{
"id": "clfq6dinn000yl70fgwwyp82l",
"url": "https://app.loops.so/transactional/clfq6dinn000yl70fgwwyp82l",
"name": "Welcome email",
"draftEmailMessageId": "cly8k3m0n0044jpx2bghepq45",
"draftEmailMessageContentRevisionId": "clm9n4o6p0088lrz4dijslt67",
"publishedEmailMessageId": null,
"createdAt": "2025-01-01T00:00:00.000Z",
"updatedAt": "2025-01-01T00:00:00.000Z",
"dataVariables": []
}