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": []
}