NAV Navbar
php json javascript

REST API

Caymland provides a REST API to manipulate leads and/or obtain information for various entities of Caymland.

Error Handling

If an OAuth error is encountered, it’ll be a JSON encoded array similar to:

{
  "error": "invalid_grant",
  "error_description": "The access token provided has expired."
}

If a system error encountered, it’ll be a JSON encoded array similar to:

{
    "error": {
        "message": "You do not have access to the requested area/action.",
        "code": 403
    }
}

Caymland version check

In case your API service wants to support several Caymland versions with different features, you might need to check the version of Caymland you communicate with. Since Caymland 2.4.0 the version number is added to all API response headers. The header name is Caymland-Version. With Caymland PHP API library you can get the Caymland version like this:

// Make any API request:
$api = $this->getContext('contacts');
$response = $api->getList('', 0, 1);

// Get the version number from the response header:
$version = $api->getCaymlandVersion();

$version will be in a semantic versioning format: [major].[minor].[patch]. For example: 2.4.0. If you’ll try it on the latest GitHub version, the version will have -dev at the end. Like 2.5.1-dev.

Authorization

Caymland uses OAuth or Basic Authentication (as of Caymland 2.3.0) for API authorization. It supports both OAuth 1a and OAuth 2; however, as of 1.1.2, the administrator of the Caymland instance must choose one or the other. Of course OAuth 2 is only recommended for servers secured behind SSL. Basic authentication must be enabled in Configuration -> API Settings.

The Caymland administrator should enable the API in the Configuration -> API Settings. This will add the “API Credentials” to the admin menu. A client/consumer ID and secret should then be generated which will be used in the following processes.

All authorization requests should be made to the specific Caymland instances URL, i.e. https://your-caymland.com.

OAuth 1a

<?php
use Caymland\Auth\ApiAuth;

// $initAuth->newAuth() will accept an array of OAuth settings
$settings = array(
    'baseUrl'      => 'https://your-caymland.com',
    'version'      => 'OAuth1a',
    'clientKey'    => '5ad6fa7asfs8fa7sdfa6sfas5fas6asdf8',
    'clientSecret' => 'adf8asf7sf54asf3as4f5sf6asfasf97dd', 
    'callback'     => 'https://your-callback.com'
);

// Initiate the auth object
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);

// Initiate process for obtaining an access token; this will redirect the user to the authorize endpoint and/or set the tokens when the user is redirected back after granting authorization

if ($auth->validateAccessToken()) {
    if ($auth->accessTokenUpdated()) {
        $accessTokenData = $auth->getAccessTokenData();

        //store access token data however you want
    }
}

The OAuth 1a method is recommended for servers that are not behind https. Note that OAuth 1a access tokens do not expire.

OAuth 1a can be a complicated method due to the need to generate a signature for the request. If anything is off with the signature, the request will not be validated.

Authorization

Step One - Obtain a Request Token

The first step is to obtain a request token that will be used when directing the user to the authorization page.

Make a POST to the request token endpoint /oauth/v1/request_token:

POST /oauth/v1/request_token
Authorization: 
        OAuth oauth_callback="https%3A%2F%2Fyour-callback-uri.com",
              oauth_consumer_key="CONSUMER_KEY",
              oauth_nonce="UNIQUE_STRING",
              oauth_signature="GENERATED_REQUEST_SIGNATURE",
              oauth_signature_method="HMAC-SHA1",
              oauth_timestamp="1318467427",
              oauth_version="1.0"

(note that the header has been wrapped for legibility)

Review Generating the Authorization Header on the specifics of generating the OAuth header.

The response will be a query string:

oauth_token=REQUEST_TOKEN&oauth_token_secret=REQUEST_TOKEN_SECRET&oauth_expires_in=3600

Parse the string and use the parameters in the next step as indicated.

Note that the refresh token is only good for the number of seconds specified in oauth_expires_in.

Step Two - Authorization

Now redirect the user to the authorization endpoint oauth/v1/authorize with the request token as part of the URL’s query.

If the callback is something different than what is configured in Caymland, url encode it and include in the query as oauth_callback.

/oauth/v1/authorize?oauth_token=REQUEST_TOKEN&oauth_callback=https%3A%2F%2Fyour-callback-uri.com

The user will login and Caymland will redirect back to the either the consumer’s configured callback or to the oauth_callback included in the query.

The callback will include oauth_token and oauth_verifier in the URL’s query.

Compare the oauth_token in the query with that obtained in step two to ensure they are the same and prevent cross-site request forgery.

oauth_verifier will need to be part of the header generated in step three.

Step Three - Obtain an Access Token

Generate the Authorization header and make a POST to the access token endpoint /oauth/v1/access_token.

When generating the header, the oauth_token_secret returned in step two should be used as the TOKEN_SECRET in the composite key.

oauth_verifier from step two should be part of the Authorization header generated.

POST /oauth/v1/access_token
Authorization: 
        OAuth oauth_callback="https%3A%2F%2Fyour-callback-uri.com",
              oauth_consumer_key="CONSUMER_KEY",
              oauth_nonce="UNIQUE_STRING",
              oauth_signature="GENERATED_REQUEST_SIGNATURE",
              oauth_signature_method="HMAC-SHA1",
              oauth_timestamp="1318467427",
              oauth_verifier="OAUTH_VERIFIER_FROM_STEP_TWO"
              oauth_version="1.0"

(note that the header has been wrapped for legibility)

The response should include a query string with the access token:

oauth_token=ACCESS_TOKEN&oauth_token_secret=ACCESS_TOKEN_SECRET

The oauth_token can be included in the authorize header and the oauth_token_secret should be used as the TOKEN_SECRET in the composite key when signing API requests.

Generating the Authorization Header

The OAuth header may include the following parameters:

Key Description
oauth_callback Optional, URL encoded callback to redirect the user to after authorization. If the callback URL is set in Caymland, this must match.
oauth_consumer_key The consumer key obtained from Caymland’s API Credentials
oauth_nonce Uniquely generated string that should be used only once
oauth_signature Signature generated from all applicable data for the request
oauth_signature_method Method for creating the signature. Currently, only HMAC-SHA1 is supported.
oauth_timestamp Current unix timestamp
oauth_token The access token
oauth_verifier Returned after authorization and used when requesting an access token
oauth_version Should always be 1.0
Step One - Build the Base String

The base string is used to generate the oauth_signature.

The structure of the base string is as follows:

METHOD&URL_ENCODED_URI&NORMALIZED_PARAMETERS

METHOD should be the request method and should always be capitalized.

URL_ENCODED_URI should be the base URI the request is made to. It should not include any query parameters (query parameters should be part of NORMALIZED_PARAMETERS).

NORMALIZED_PARAMETERS should be a url encoded, alphabetically sorted query string of the above oauth parameters (except oauth_signature) plus the parameters of the request (query/post body).

Each key and each value of the parameters must be url encoded individually as well.

Then each url encoded key/value pair should be concatenated into a single string with an ampersand (&) as the glue character.

For example, let’s say a request includes a query of title=Mr&firstname=Joe&lastname=Smith. The process would look something like the following (replacing urlencode() with whatever function is appropriate for the language being used). Of course realistically, natural sort and loop functions would be used.

urlencode(
    urlencode(firstname)=urlencode(Joe)
    &urlencode(lastname)=urlencode(smith)
    &urlencode(oauth_callback)=urlencode(https%3A%2F%2Fyour-callback-uri.com)
    &urlencode(oauth_consumer_key)=urlencode(kdjafs7fsdf86ads7a98a87df6ad9fsf98ad7f)
    &urlencode(oauth_nonce)=urlencode(ak877asdf6adf68asd9fas)
    &urlencode(oauth_signature_method)=urlencode(HMAC-SHA1)
    &urlencode(oauth_timestamp)=urlencode(1437604736)
    &urlencode(oauth_version)=urlencode(1.0)
    &urlencode(title)=urlencode(Mr)
)

Put all together, a base string might look like:

GET&http%3A%2F%2Fyour-caymland.com%2Fapi&firstname%3DJoe%26lastName%3DSmith%26oauth_callback%3Dhttps%253A%252F%252Fyour-callback-uri.com%26oauth_consumer_key%3Dkdjafs7fsdf86ads7a98a87df6ad9fsf98ad7f%26oauth_nonce%3Dak877asdf6adf68asd9fas%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1437604736%26oauth_version%3D1.0%26title%3DMr
Step Two - Build the Composite Key

The composite key is used to encrypt the base string. It is composed of the consumer secret and the token secret if available (post authorization) combined with an ampersand (&).

CLIENT_SECRET&TOKEN_SECRET

If the token secret is not available, i.e. during the request token process, then an ampersand (&) should still be used.

 CLIENT_SECRET&
 

Step Three - Generate the Signature

Now, using the base string and the composite key, the signature can be generated using the appropriate HMAC function available to the language used. The signature generated should then be base64 encoded prior to being used in the Authorization header.

 base64_encode(
    hmac_sha1(BASE_STRING, COMPOSITE_KEY)
 )
 

The resulting string should then be used included in the header as oauth_signature.

Signing the API Request

To sign the API request, generate the Authorization header using the obtained access token.

POST /api/leads/new
Authorization: 
        OAuth oauth_callback="https%3A%2F%2Fyour-callback-uri.com",
              oauth_consumer_key="CONSUMER_KEY",
              oauth_nonce="UNIQUE_STRING",
              oauth_signature="GENERATED_REQUEST_SIGNATURE",
              oauth_signature_method="HMAC-SHA1",
              oauth_timestamp="1318467427",
              oauth_token="ACCESS_TOKEN"
              oauth_version="1.0"
              
title=Mr&firstname=Joe&lastname=Smith

(note that the header has been wrapped for legibility)

OAuth 2

<?php
use Caymland\Auth\ApiAuth;

// $initAuth->newAuth() will accept an array of OAuth settings
$settings = array(
    'baseUrl'      => 'https://your-caymland.com',
    'version'      => 'OAuth2',
    'clientKey'    => '5ad6fa7asfs8fa7sdfa6sfas5fas6asdf8',
    'clientSecret' => 'adf8asf7sf54asf3as4f5sf6asfasf97dd', 
    'callback'     => 'https://your-callback.com'
);

// Initiate the auth object
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);

// Initiate process for obtaining an access token; this will redirect the user to the authorize endpoint and/or set the tokens when the user is redirected back after granting authorization

if ($auth->validateAccessToken()) {
    if ($auth->accessTokenUpdated()) {
        $accessTokenData = $auth->getAccessTokenData();

        //store access token data however you want
    }
}

Authorization

Step One - Obtain Authorization Code

Redirect the user to the authorize endpoint oauth/v2/authorize:

GET /oauth/v2/authorize?
    client_id=CLIENT_ID
    &grant_type=authorization_code
    &redirect_uri=https%3A%2F%2Fyour-redirect-uri.com%2Fcallback
    &response_type=code
    &state=UNIQUE_STATE_STRING

(note that the query has been wrapped for legibility)

The user will be prompted to login. Once they do, Caymland will redirect back to the URL specified in redirect_uri with a code appended to the query.

It may look something like: https://your-redirect-uri.com?code=UNIQUE_CODE_STRING&state=UNIQUE_STATE_STRING

The state returned should be compared against the original to ensure nothing has been tampered with.

Step Two - Replace with an Access Token

Obtain the value of the code from Step One then immediately POST it back to the access token endpoint oauth/v2/token with:

POST /oauth/v2/token

client_id=CLIENT_ID
    &client_secret=CLIENT_SECRET
    &grant_type=authorization_code
    &redirect_uri=https%3A%2F%2Fyour-redirect-uri.com%2Fcallback
    &code=UNIQUE_CODE_STRING

(note that the post body has been wrapped for legibility)

The response returned should be a JSON encoded string:

    {
        access_token: "ACCESS_TOKEN",
        expires_in: 3600,
        token_type: "bearer",
        scope: "",
        refresh_token: "REFRESH_TOKEN"
    }

This data should be stored in a secure location and used to authenticate API requests.

Refresh Tokens

The response’s expires_in is the number of seconds the access token is good for and may differ based on what is configured in Caymland. The code handling the authorization process should generate an expiration timestamp based on that value. For example <?php $expiration = time() + $response['expires_in']; ?>. If the access token has expired, the refresh_token should be used to obtain a new access token.

The refresh token is by default good for 14 days in which the user will need to reauthorize the application with Caymland. However, the refresh token’s expiration time is configurable through Caymland’s Configuration.

To obtain a new access token, a POST should be made to the access token’s endpoint oauth/v2/token using the refresh_token grant type.

POST /oauth/v2/token
    
client_id=CLIENT_ID
    &client_secret=CLIENT_SECRET
    &grant_type=refresh_token
    &refresh_token=REFRESH_TOKEN
    &redirect_uri=https%3A%2F%2Fyour-redirect-uri.com%2Fcallback

(note that the post body has been wrapped for legibility)

The response returned should be a JSON encoded string:

    {
        access_token: "NEW_ACCESS_TOKEN",
        expires_in: 3600,
        token_type: "bearer",
        scope: "",
        refresh_token: "REFRESH_TOKEN"
    }

Authenticating the API Request

Authenticating the API request with OAuth2 is easy. Choose one of the following methods that is appropriate for the application’s needs.

Authorization Header

By using an authorization header, any request method can be authenticated.

However, note that this method requires that the server Caymland is installed on passes headers to PHP or has access to the apache_request_headers() function. apache_request_headers() is not available to PHP running under fcgi.

Authorization: Bearer ACCESS_TOKEN
Method Specific

The access token can also be appended to the query or included in the body of a POST.

GET https://your-caymland.com/api/leads?access_token=ACCESS_TOKEN
POST https://your-caymland.com/api/leads/new

firstname=John&lastname=Smith&access_token=ACCESS_TOKEN

Basic Authentication

As of Caymland 2.3.0, support for basic authentication can be enabled through Caymland’s Configuration -> API Settings. As with OAuth2, it is only recommended to use basic authentication over HTTPS.

To authorize a request for basic authentication, set an Authorization header.

  1. Combine the username and password of a Caymland user with a colon :. For example, user:password.
  2. Base64 encode the string from above. dXNlcjpwYXNzd29yZA==.
  3. Add an Authorization header to each API request as Authorization: Basic dXNlcjpwYXNzd29yZA==

API Rate limiter

You can configure rate limiter cache in local.php By default, filesystem is used as: php api_rate_limiter_cache => [ 'type' => 'file_system', ],

You can configure memcached server: php 'api_rate_limiter_cache' => [ 'memcached' => [ 'servers' => [ [ 'host' => 'localhost', 'port' => 11211 ] ] ] ],

Or whatever cache you want described in Symfony cache documentation.

Libraries

PHP Library

Install Manually

Last update: 06.11.2019

Download the package from our server. Extract then include the following code in your project (of course change the file path if needed):

require_once __DIR__ . '/lib/Caymland/CaymlandApi.php';

Endpoints

Assets

Use this endpoint to obtain details on Caymland’s assets.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$assetApi = $api->newApi("assets", $auth, $apiUrl);

Get Asset

<?php

//...
$asset = $assetApi->get($id);
{
    "asset": {
        "id": 1,
        "title": "Product Whitepaper",
        "description": "Some description",
        "alias": "whitepaper",
        "language": "en",
        "isPublished": true,
        "publishUp": "2015-06-07T06:28:27+00:00",
        "publishDown": "2015-06-30T06:28:27+00:00",
        "dateAdded": "2015-06-07T06:28:27+00:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-06-010T09:30:47+00:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "downloadCount": 10,
        "uniqueDownloadCount": 8,
        "revision": 1,
        "category": {
            "createdByUser": "John Doe",
            "modifiedByUser": "John Doe",
            "id": 19,
            "title": "test",
            "alias": "test",
            "description": null,
            "color": null,
            "bundle": "asset"
        },
        "extension": "pdf",
        "mime": "application/pdf",
        "size": 269128,
        "downloadUrl": "https://your-caymland.com/asset/1:whitepaper"
    }
}

Get an individual asset by ID.

HTTP Request

GET /assets/ID

Response

Expected Response Code: 200

See JSON code example.

Asset Properties

Name Type Description
id int ID of the asset
title string Title/name of the asset
description string/null Description of the asset
alias string Used to generate the URL for the asset
language string Locale of the asset
isPublished bool Published state
publishUp datetime/null Date/time when the asset should be published
publishDown datetime/null Date/time the asset should be un published
dateAdded datetime Date/time asset was created
createdBy int ID of the user that created the asset
createdByUser string Name of the user that created the asset
dateModified datetime/null Date/time asset was last modified
modifiedBy int ID of the user that last modified the asset
modifiedByUser string Name of the user that last modified the asset
downloadCount int Total number of downloads
uniqueDownloadCount int Unique number of downloads
revision int Revision version
category object/null Object with the category details
extension string Extension of the asset
mime string Mime type of the asset
size int Filesize of the asset in bytes
downloadUrl string Public download URL for the asset

List Assets

<?php
// ...

$assets = $assetApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "assets": [
        {
            "id": 1,
            "title": "Product Whitepaper",
            "description": "Some description",
            "alias": "whitepaper",
            "language": "en",
            "isPublished": true,
            "publishUp": "2015-06-07T06:28:27+00:00",
            "publishDown": "2015-06-30T06:28:27+00:00",
            "dateAdded": "2015-06-07T06:28:27+00:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-06-010T09:30:47+00:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "downloadCount": 10,
            "uniqueDownloadCount": 8,
            "revision": 1,
            "category": null,
            "extension": "pdf",
            "mime": "application/pdf",
            "size": 269128,
            "downloadUrl": "https://your-caymland.com/asset/1:whitepaper"
        }
    ]
}

HTTP Request

GET /assets

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Asset.

Create Asset

<?php 

/**
 * Local asset example
 */
// Upload a local file first
$apiContextFiles = $this->getContext('files');
$apiContextFiles->setFolder('assets');
$fileRequest = array(
    'file' => dirname(__DIR__).'/'.'caymlandlogo.png'
);
$response = $apiContextFiles->create($fileRequest);

$data = array(
    'title' => 'Caymland Logo sent as a API request',
    'storageLocation' => 'local',
    'file' => $response['file']['name']
);

$asset = $assetApi->create($data);


/**
 * Remote asset example
 */
$data = array(
    'title' => 'PDF sent as a API request',
    'storageLocation' => 'remote',
    'file' => 'https://www.caymland.org/media/logos/logo/Caymland_Logo_DB.pdf'
);

$asset = $assetApi->create($data);

Create a new asset. There are 2 options: local or remote asset.

HTTP Request

POST /assets/new

Post Parameters

Name Description
title string
storageLocation string
file string

Response

Expected Response Code: 201

Properties

Same as Get Asset.

Edit Asset

<?php

$id   = 1;
$data = array(
    'type' => 'general',
);

// Create new a asset of ID 1 is not found?
$createIfNotFound = true;

$asset = $assetApi->edit($id, $data, $createIfNotFound);

Edit a new asset. Asset that this supports PUT or PATCH depending on the desired behavior.

PUT creates a asset if the given ID does not exist and clears all the asset information, adds the information from the request. PATCH fails if the asset with the given ID does not exist and updates the asset field values with the values form the request.

HTTP Request

To edit a asset and return a 404 if the asset is not found:

PATCH /assets/ID/edit

To edit a asset and create a new one if the asset is not found:

PUT /assets/ID/edit

Post Parameters

Name Description
title string
storageLocation string
file string

Response

If PUT, the expected response code is 200 if the asset was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Asset.

Delete Asset

<?php

$asset = $assetApi->delete($id);

Delete a asset. In case of local storage location, the local file will be deleted as well.

HTTP Request

DELETE /assets/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Asset.

Campaigns

Use this endpoint to obtain details on Caymland’s campaigns.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth    = new ApiAuth();
$auth        = $initAuth->newAuth($settings);
$apiUrl      = "https://your-caymland.com";
$api         = new CaymlandApi();
$campaignApi = $api->newApi("campaigns", $auth, $apiUrl);

Get Campaign

<?php

//...
$campaign = $campaignApi->get($id);
{
    "campaign": {
        "id": 3,
        "name": "Email A/B Test",
        "description": null,
        "isPublished": true,
        "publishUp": null,
        "publishDown": null,
        "dateAdded": "2015-07-15T15:06:02-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-20T13:11:56-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "category": null,
        "events": {
            "28": {
                "id": 28,
                "type": "lead.changepoints",
                "eventType": "action",
                "name": "Adjust lead points",
                "description": null,
                "order": 1,
                "properties": {
                  "points": 20
                },
                "triggerDate": null,
                "triggerInterval": 1,
                "triggerIntervalUnit": "d",
                "triggerMode": "immediate",
                "children": [],
                "parent": null,
                "decisionPath": null
            }
        }
    }
}

Get an individual campaign by ID.

HTTP Request

GET /campaigns/ID

Response

Expected Response Code: 200

See JSON code example.

Campaign Properties

Name Type Description
id int ID of the campaign
name string Name of the campaign
description string/null Description of the campaign
alias string Used to generate the URL for the campaign
isPublished bool Published state
publishUp datetime/null Date/time when the campaign should be published
publishDown datetime/null Date/time the campaign should be un published
dateAdded datetime Date/time campaign was created
createdBy int ID of the user that created the campaign
createdByUser string Name of the user that created the campaign
dateModified datetime/null Date/time campaign was last modified
modifiedBy int ID of the user that last modified the campaign
modifiedByUser string Name of the user that last modified the campaign
events array Array of Event entities for the campaign. See below.

Event Properties

Name Type Description
id int ID of the event
name string Name of the event
description string Optional description for the event
type string Type of event
eventType string “action” or “decision”
order int Order in relation to the other events (used for levels)
properties object Configured properties for the event
triggerMode string “immediate”, “interval” or “date”
triggerDate datetime/null Date/time of when the event should trigger if triggerMode is “date”
triggerInterval int/null Interval for when the event should trigger
triggerIntervalUnit string Interval unit for when the event should trigger. Options are i = minutes, h = hours, d = days, m = months, y = years
children array Array of this event’s children ,
parent object/null This event’s parent
decisionPath string/null If the event is connected into an action, this will be “no” for the non-decision path or “yes” for the actively followed path.

List Campaigns

<?php
// ...

$campaigns = $campaignApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "campaigns": {
        "3": {
            "id": 3,
            "name": "Welcome Campaign",
            "description": null,
            "isPublished": true,
            "publishUp": null,
            "publishDown": null,
            "dateAdded": "2015-07-15T15:06:02-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-07-20T13:11:56-05:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "category": null,
            "events": {
                "22": {
                    "id": 22,
                    "type": "email.send",
                    "eventType": "action",
                    "name": "Send welcome email",
                    "description": null,
                    "order": 1,
                    "properties": {
                        "email": 1
                    },
                    "triggerMode": "immediate",
                    "triggerDate": null,
                    "triggerInterval": null,
                    "triggerIntervalUnit": null,
                    "children": [],
                    "parent": null,
                    "decisionPath": null
                },
                "28": {
                    "id": 28,
                    "type": "lead.changepoints",
                    "eventType": "action",
                    "name": "Adjust lead points",
                    "description": null,
                    "order": 2,
                    "properties": {
                        "points": 20
                    },
                    "triggerMode": "immediate",                
                    "triggerDate": null,
                    "triggerInterval": null,
                    "triggerIntervalUnit": null,
                    "children": [],
                    "parent": null,
                    "decisionPath": null
                }
            }
        }
    }
}

HTTP Request

GET /campaigns

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
published Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Campaign.

List Campaign Contacts

This endpoint is basically an alias for the stats endpoint with ‘campaign_leads’ table and campaign_id specified. Other parameters are the same as in the stats endpoint.

<?php
// ...

$response = $campaignApi->getContacts($campaignId, $start, $limit, $order, $where);
{  
  "total":"1",
  "contacts":[  
    {  
      "campaign_id":"311",
      "lead_id":"3126",
      "date_added":"2017-01-25 15:11:10",
      "manually_removed":"0",
      "manually_added":"1"
    }
  ]
}

HTTP Request

GET /campaigns/ID/contacts

Query Parameters

Response

Expected Response Code: 200

See JSON code example.

Create Campaign

<?php

$data = array(
    'name'        => 'Campaign A',
    'description' => 'This is my first campaign created via API.',
    'isPublished' => 1
);

$campaign = $campaignApi->create($data);

Create a new campaign. To see more advanced example with campaing events and so on, see the unit tests.

HTTP Request

POST /campaigns/new

Post Parameters

Name Description
name Campaign name is the only required field
alias string
description A description of the campaign.
isPublished A value of 0 or 1

Response

Expected Response Code: 201

Properties

Same as Get Campaign.

Clone A Campaign

<?php

$camnpaignId = 12;

$campaign = $campaignApi->cloneCampaign($campaignId);

Clone an existing campaign. To see more advanced example with campaign events and so on, see the unit tests.

HTTP Request

POST /campaigns/clone/CAMPAIGN_ID

Response

Expected Response Code: 201

Properties

Same as Get Campaign.

Edit Campaign

<?php

$id   = 1;
$data = array(
    'name'        => 'New campaign name',
    'isPublished' => 0
);

// Create new a campaign of ID 1 is not found?
$createIfNotFound = true;

$campaign = $campaignApi->edit($id, $data, $createIfNotFound);

Edit a new campaign. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a campaign if the given ID does not exist and clears all the campaign information, adds the information from the request. PATCH fails if the campaign with the given ID does not exist and updates the campaign field values with the values form the request.

HTTP Request

To edit a campaign and return a 404 if the campaign is not found:

PATCH /campaigns/ID/edit

To edit a campaign and create a new one if the campaign is not found:

PUT /campaigns/ID/edit

Post Parameters

Name Description
name Campaign name is the only required field
alias Name alias generated automatically if not set
description A description of the campaign.
isPublished A value of 0 or 1

Response

If PUT, the expected response code is 200 if the campaign was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Campaign.

Delete Campaign

<?php

$campaign = $campaignApi->delete($id);

Delete a campaign.

HTTP Request

DELETE /campaigns/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Campaign.

Add Contact to a Campaign

<?php

//...
$response = $campaignApi->addContact($campaignId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually add a contact to a specific campaign.

HTTP Request

POST /campaigns/CAMPAIGN_ID/contact/CONTACT_ID/add

Response

Expected Response Code: 200

See JSON code example.

Remove Contact from a Campaign

<?php

//...
$response = $listApi->removeContact($campaignId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually remove a contact from a specific campaign.

HTTP Request

POST /campaigns/CAMPAIGN_ID/contact/CONTACT_ID/remove

Response

Expected Response Code: 200

See JSON code example.

Categories

Use this endpoint to obtain details on Caymland’s categories or to manipulate category memberships.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth    = new ApiAuth();
$auth        = $initAuth->newAuth($settings);
$apiUrl      = "https://your-caymland.com";
$api         = new CaymlandApi();
$categoryApi = $api->newApi("categories", $auth, $apiUrl);

Get Category

<?php

//...
$category = $categoryApi->get($id);
{  
  "category":{  
    "id":221,
    "title":"test",
    "alias":"test4",
    "description":null,
    "color":null,
    "bundle":"asset"
  }
}

Get an individual category by ID.

HTTP Request

GET /categories/ID

Response

Expected Response Code: 200

See JSON code example.

Category Properties

Name Type Description
id int ID of the category
isPublished boolean Whether the category is published
dateAdded datetime Date/time category was created
createdBy int ID of the user that created the category
createdByUser string Name of the user that created the category
dateModified datetime/null Date/time category was last modified
modifiedBy int ID of the user that last modified the category
modifiedByUser string Name of the user that last modified the category
title string The category title
alias string The category alias
description string The category description
color string The category color
bundle string The bundle where the category will be available

List Contact Categories

<?php

//...
$categories = $categoryApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
  "total":8,
  "categories":[  
    {  
      "id":1,
      "title":"Bold",
      "alias":"bold",
      "description":null,
      "color":"b36262",
      "bundle":"point"
    },
    [...]
  ]
}

Returns a list of contact categories available to the user. This list is not filterable.

HTTP Request

GET /categories

Response

Expected Response Code: 200

See JSON code example.

Category Properties

Name Type Description
id int ID of the category
isPublished boolean Whether the category is published
dateAdded datetime Date/time category was created
createdBy int ID of the user that created the category
createdByUser string Name of the user that created the category
dateModified datetime/null Date/time category was last modified
modifiedBy int ID of the user that last modified the category
modifiedByUser string Name of the user that last modified the category
title string The category title
alias string The category alias
description string The category description
color string The category color
bundle string The bundle where the category will be available

Create Category

<?php 

$data = array(
    'categoryname' => 'test',
    'categoryemail' => 'test@category.com',
    'categorycity' => 'Raleigh',
);

$category = $categoryApi->create($data);

Create a new category.

HTTP Request

POST /categories/new

Post Parameters

Name Description
title string
bundle string

Response

Expected Response Code: 201

Properties

Same as Get Category.

Edit Category

<?php

$id   = 1;
$data = array(
    'title' => 'test',
    'bundle' => 'asset'
);

// Create new a category of ID 1 is not found?
$createIfNotFound = true;

$category = $categoryApi->edit($id, $data, $createIfNotFound);

Edit a new category. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a category if the given ID does not exist and clears all the category information, adds the information from the request. PATCH fails if the category with the given ID does not exist and updates the category field values with the values form the request.

HTTP Request

To edit a category and return a 404 if the category is not found:

PATCH /categories/ID/edit

To edit a category and create a new one if the category is not found:

PUT /categories/ID/edit

Post Parameters

Name Description
title string
bundle string

Response

If PUT, the expected response code is 200 if the category was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Category.

Delete Category

<?php

$category = $categoryApi->delete($id);

Delete a category.

HTTP Request

DELETE /categories/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Category.

Assign a Category

To assign a category to an entity simply set category = [ID] to the payload. For example this is how a category 123 can be asssigned to a new Asset:

$data = array(
    'title' => 'PDF sent as a API request',
    'storageLocation' => 'remote',
    'file' => 'https://www.caymland.org/media/logos/logo/Caymland_Logo_DB.pdf'
    'category' => 123
);

$asset = $assetApi->create($data);

The category must exist in the Caymland instance and the entity must support categories,

Companies

Use this endpoint to obtain details on Caymland’s companies or to manipulate contact-company memberships.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth   = new ApiAuth();
$auth       = $initAuth->newAuth($settings);
$apiUrl     = "https://your-caymland.com";
$api        = new CaymlandApi();
$companyApi = $api->newApi("companies", $auth, $apiUrl);

Get Company

<?php

//...
$company = $companyApi->get($id);
{  
    "company":{  
        "isPublished":true,
        "dateAdded":"2016-10-25T09:46:36+00:00",
        "createdBy":1,
        "createdByUser":"John Doe",
        "dateModified":null,
        "modifiedBy":null,
        "modifiedByUser":null,
        "id":176,
        "fields":{  
            "core":{  
                "companywebsite":{  
                    "id":"91",
                    "label":"Website",
                    "alias":"companywebsite",
                    "type":"url",
                    "group":"core",
                    "field_order":"8",
                    "object":"company",
                    "value":null
                },
                [...]
            },
            "professional":{  
                "companyannual_revenue":{  
                    "id":"90",
                    "label":"Annual Revenue",
                    "alias":"companyannual_revenue",
                    "type":"number",
                    "group":"professional",
                    "field_order":"10",
                    "object":"company",
                    "value":null
                },
                [...]
            },
            "other":[],
            "all":{  
                "companywebsite":null,
                "companycountry":null,
                "companyzipcode":null,
                "companystate":null,
                "companycity":"Raleigh",
                "companyphone":null,
                "companyemail":"test@company.com",
                "companyaddress2":null,
                "companyaddress1":null,
                "companyname":"test",
                "companyannual_revenue":null,
                "companyfax":null,
                "companynumber_of_employees":null,
                "companydescription":null
            }
        }
    }
}

Get an individual company by ID.

HTTP Request

GET /companies/ID

Response

Expected Response Code: 200

See JSON code example.

Company Properties

Name Type Description
id int ID of the company
isPublished boolean Whether the company is published
dateAdded datetime Date/time company was created
createdBy int ID of the user that created the company
createdByUser string Name of the user that created the company
dateModified datetime/null Date/time company was last modified
modifiedBy int ID of the user that last modified the company
modifiedByUser string Name of the user that last modified the company
fields array Custom fields for the company

List Contact Companies

<?php

//...
$companies = $companyApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
  "total": 13,
  "companies": {
    "176": {  
      "isPublished":true,
      "dateAdded":"2016-10-25T09:46:36+00:00",
      "createdBy":1,
      "createdByUser":"John Doe",
      "dateModified":null,
      "modifiedBy":null,
      "modifiedByUser":null,
      "id":176,
      "fields":{  
        "core":{  
            "companywebsite":{  
                "id":"91",
                "label":"Website",
                "alias":"companywebsite",
                "type":"url",
                "group":"core",
                "field_order":"8",
                "object":"company",
                "value":null
            },
            [...]
        },
        "professional":{  
            "companyannual_revenue":{  
                "id":"90",
                "label":"Annual Revenue",
                "alias":"companyannual_revenue",
                "type":"number",
                "group":"professional",
                "field_order":"10",
                "object":"company",
                "value":null
            },
            [...]
        },
        "other":[],
        "all":{  
            "companywebsite":null,
            "companycountry":null,
            "companyzipcode":null,
            "companystate":null,
            "companycity":"Raleigh",
            "companyphone":null,
            "companyemail":"test@company.com",
            "companyaddress2":null,
            "companyaddress1":null,
            "companyname":"test",
            "companyannual_revenue":null,
            "companyfax":null,
            "companynumber_of_employees":null,
            "companydescription":null
        }
    }
  },
  [...]
  }
}

Returns a list of contact companies available to the user. This list is not filterable.

HTTP Request

GET /companies

Response

Expected Response Code: 200

See JSON code example.

Company Properties

Name Type Description
id int ID of the company
isPublished boolean Whether the company is published
dateAdded datetime Date/time company was created
createdBy int ID of the user that created the company
createdByUser string Name of the user that created the company
dateModified datetime/null Date/time company was last modified
modifiedBy int ID of the user that last modified the company
modifiedByUser string Name of the user that last modified the company
fields array Custom fields for the company

Create Company

<?php

$data = array(
    'companyname' => 'test',
    'companyemail' => 'test@company.com',
    'companycity' => 'Raleigh',
);

$company = $companyApi->create($data);

Create a new company.

HTTP Request

POST /companies/new

Post Parameters

Name Description
companyname Company name is the only required field. Other company fields can be sent with a value
isPublished A value of 0 or 1

Response

Expected Response Code: 201

Properties

Same as Get Company.

Edit Company

<?php

$id   = 1;
$data = array(
    'companyname' => 'test',
    'companyemail' => 'test@company.com',
    'companycity' => 'Raleigh',
);

// Create new a company of ID 1 is not found?
$createIfNotFound = true;

$company = $companyApi->edit($id, $data, $createIfNotFound);

Edit a new company. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a company if the given ID does not exist and clears all the company information, adds the information from the request. PATCH fails if the company with the given ID does not exist and updates the company field values with the values form the request.

HTTP Request

To edit a company and return a 404 if the company is not found:

PATCH /companies/ID/edit

To edit a company and create a new one if the company is not found:

PUT /companies/ID/edit

Post Parameters

Name Description
companyname Company name is the only required field. Other company fields can be sent with a value
isPublished A value of 0 or 1

Response

If PUT, the expected response code is 200 if the company was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Company.

Delete Company

<?php

$company = $companyApi->delete($id);

Delete a company.

HTTP Request

DELETE /companies/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Company.

Add Contact to a Company

<?php

//...
$response = $companyApi->addContact($companyId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually add a contact to a specific company.

HTTP Request

POST /companies/COMPANY_ID/contact/CONTACT_ID/add

Response

Expected Response Code: 200

See JSON code example.

Remove Contact from a Company

<?php

//...
$response = $companyApi->removeContact($contactId, $companyId);
if (empty($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually remove a contact to a specific company.

HTTP Request

POST /companies/COMPANY_ID/contact/CONTACT_ID/remove

Response

Expected Response Code: 200

See JSON code example.

Contacts

Use this endpoint to manipulate and obtain details on Caymland’s contacts.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth   = new ApiAuth();
$auth       = $initAuth->newAuth($settings);
$apiUrl     = "https://your-caymland.com";
$api        = new CaymlandApi();
$contactApi = $api->newApi("contacts", $auth, $apiUrl);

Get Contact

<?php

//...
$contact = $contactApi->get($id);
    "contact": {
        "id": 47,
        "dateAdded": "2015-07-21T12:27:12-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-21T14:12:03-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "owner": {
            "id": 1,
            "username": "joesmith",
            "firstName": "Joe",
            "lastName": "Smith"
        },
        "points": 10,
        "lastActive": "2015-07-21T14:19:37-05:00",
        "dateIdentified": "2015-07-21T12:27:12-05:00",
        "color": "ab5959",
        "ipAddresses": {
            "111.111.111.111": {
                "ipAddress": "111.111.111.111",
                "ipDetails": {
                    "city": "",
                    "region": "",
                    "country": "",
                    "latitude": "",
                    "longitude": "",
                    "isp": "",
                    "organization": "",
                    "timezone": ""
                }
            }
        },
        "fields": {
            "core": {
                "title": {
                    "id": "1",
                    "label": "Title",
                    "alias": "title",
                    "type": "lookup",
                    "group": "core",
                    "value": "Mr"
                },
                "firstname": {
                    "id": "2",
                    "label": "First Name",
                    "alias": "firstname",
                    "type": "text",
                    "group": "core",
                    "value": "Jim"
                },

                "...": {
                    "..." : "..."
                }

            },
            "social": {
                "twitter": {
                    "id": "17",
                    "label": "Twitter",
                    "alias": "twitter",
                    "type": "text",
                    "group": "social",
                    "value": "jimcontact"
                },

                "...": {
                    "..." : "..."
                }

            },
            "personal": [],
            "professional": [],
            "all": {
                "title": "Mr",
                "firstname": "Jim",
                "twitter": "jimcontact",

                "...": "..."
            }
        }
    }

Get an individual contact by ID.

HTTP Request

GET /contacts/ID

Response

Expected Response Code: 200

See JSON code example.

** Contact Properties **

Name Type Description
id int ID of the contact
isPublished Boolean True if the contact is published
dateAdded datetime Date/time contact was created
createdBy int ID of the user that created the contact
createdByUser string Name of the user that created the contact
dateModified datetime/null Date/time contact was last modified
modifiedBy int ID of the user that last modified the contact
modifiedByUser string Name of the user that last modified the contact
owner object User object that owns the contact.
points int Contact’s current number of points
lastActive datetime/null Date/time for when the contact was last recorded as active
dateIdentified datetime/null Date/time when the contact identified themselves
color string Hex value given to contact from Point Trigger definitions based on the number of points the contact has been awarded
ipAddresses array Array of IPs currently associated with this contact
fields array Array of all contact fields with data grouped by field group. See JSON code example for format. This array includes an “all” key that includes an single level array of fieldAlias => contactValue pairs.
tags array Array of tags associated with this contact. See JSON code example for format.
utmtags array Array of UTM Tags associated with this contact. See JSON code example for format.

List Contacts

<?php

//...
$contacts = $contactApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": "1",
    "contacts": {
        "47": {
            "id": 47,
            "isPublished": true,
            "dateAdded": "2015-07-21T12:27:12-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-07-21T14:12:03-05:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "owner": {
                "id": 1,
                "username": "joesmith",
                "firstName": "Joe",
                "lastName": "Smith"
            },
            "points": 10,
            "lastActive": "2015-07-21T14:19:37-05:00",
            "dateIdentified": "2015-07-21T12:27:12-05:00",
            "color": "ab5959",
            "ipAddresses": {
                "111.111.111.111": {
                    "ipAddress": "111.111.111.111",
                    "ipDetails": {
                        "city": "",
                        "region": "",
                        "country": "",
                        "latitude": "",
                        "longitude": "",
                        "isp": "",
                        "organization": "",
                        "timezone": ""
                    }
                }
            },
            "fields": {
                "core": {
                    "title": {
                        "id": "1",
                        "label": "Title",
                        "alias": "title",
                        "type": "lookup",
                        "group": "core",
                        "value": "Mr"
                    },
                    "firstname": {
                        "id": "2",
                        "label": "First Name",
                        "alias": "firstname",
                        "type": "text",
                        "group": "core",
                        "value": "Jim"
                    },

                    "...": {
                        "..." : "..."
                    }
                },
                "social": {
                    "twitter": {
                        "id": "17",
                        "label": "Twitter",
                        "alias": "twitter",
                        "type": "text",
                        "group": "social",
                        "value": "jimcontact"
                    },

                    "...": {
                        "..." : "..."
                    }
                },
                "personal": [],
                "professional": [],
                "all": {
                    "title": "Mr",
                    "firstname": "Jim",
                    "twitter": "jimcontact",

                    "...": "..."
                }
            },
            "tags": [{
              "tag": "aTag"
            },
            {
              "tag": "bTag"
            }],
            "utmtags" : [{
              "id": 1,
              "query": {
                "page": "asd",
                "cid": "fb1"
              },
              "referer": "https://example.com/",
              "remoteHost": "example.com",
              "userAgent": "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0",
              "utmCampaign": "abcampaign",
              "utmContent": "page",
              "utmMedium": "social",
              "utmSource": "fb",
              "utmTerm": "test1"
            }]
        }
    }
}

Get a list of contacts.

HTTP Request

GET /contacts

** Query Parameters **

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response. However, all properties in the response that are written in camelCase need to be changed a bit. Before every capital add an underscore _ and then change the capital letters to non-capital letters. So dateIdentified becomes date_identified, modifiedByUser becomes modified_by_user etc.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

** Properties **

Same as Get Contact.

Create Contact

<?php

$data = array(
    'firstname' => 'Jim',
    'lastname'  => 'Contact',
    'email'     => 'jim@his-site.com',
    'ipAddress' => $_SERVER['REMOTE_ADDR']
);

$contact = $contactApi->create($data);

Create a new contact.

HTTP Request

POST /contacts/new

** Post Parameters **

Name Description
* Any contact field alias can be posted as a parameter. For example, firstname, lastname, email, etc.
ipAddress IP address to associate with the contact
lastActive Date/time in UTC; preferablly in the format of Y-m-d H:m:i but if that format fails, the string will be sent through PHP’s strtotime then formatted
owner ID of a Caymland user to assign this contact to

Response

Expected Response Code: 201

** Properties **

Same as Get Contact.

Edit Contact

<?php

$id   = 1;
$data = array(
    'email'     => 'jim-new-address@his-site.com',
    'ipAddress' => $_SERVER['REMOTE_ADDR']
);

// Create new a contact of ID 1 is not found?
$createIfNotFound = true;

$contact = $contactApi->edit($id, $data, $createIfNotFound);

Edit a new contact. Note that this supports PUT or PATCH depending on the desired behavior.

** PUT ** creates a contact if the given ID does not exist and clears all the contact information, adds the information from the request. PATCH fails if the contact with the given ID does not exist and updates the contact field values with the values form the request.

HTTP Request

To edit a contact and return a 404 if the contact is not found:

PATCH /contacts/ID/edit

To edit a contact and create a new one if the contact is not found:

PUT /contacts/ID/edit

** Post Parameters **

Name Description
* Any contact field alias can be posted as a parameter. For example, firstname, lastname, email, etc.
ipAddress IP address to associate with the contact
lastActive Date/time in UTC; preferably in the format of Y-m-d H:m:i but if that format fails, the string will be sent through PHP’s strtotime then formatted
owner ID of a Caymland user to assign this contact to

Response

If PUT, the expected response code is 200 if the contact was edited or 201 if created.

If PATCH, the expected response code is 200.

** Properties **

Same as Get Contact.

Note: In order to remove tag from contact add minus - before it. For example: tags: ['one', '-two'] - sending this in request body will add tag one and remove tag two from contact.

Delete Contact

<?php

$contact = $contactApi->delete($id);

Delete a contact.

HTTP Request

DELETE /contacts/ID/delete

Response

Expected Response Code: 200

** Properties **

Same as Get Contact.

Add Do Not Contact

<?php

$contactApi->addDnc($contactId, $channel, $reason, $channelId, $comments);
{
  "channelId": "26",
  "reason": "Integration issued DNC",
  "comments": "Unsubscribed via API"
}

Add a contact to DNC list

HTTP Request

To add Do Not Contact entry to a contact:

POST /contacts/ID/dnc/CHANNEL/add

Data Parameters (optional)

Name Description
channel Channel of DNC. For example ‘email’, 'sms’… Default is email.
reason Int value of the reason. Use Contacts constants: Contacts::UNSUBSCRIBED (1), Contacts::BOUNCED (2), Contacts::MANUAL (3). Default is Manual
channelId ID of the entity which was the reason for unsubscription
comments A text describing details of DNC entry

Response

Same as Get Contact.

Remove from Do Not Contact

<?php
$contactApi->removeDnc($contactId, $channel);

Remove a contact from DNC list

HTTP Request

To remove Do Not Contact entry from a contact:

POST /contacts/ID/dnc/CHANNEL/remove

Data Parameters (optional)

Name Description
channel Channel of DNC. For example 'email’, 'sms’… Default is email.

Response

Same as Get Contact.

Add UTM Tags

<?php

$data = array(
    'utm_campaign' => 'apicampaign',
    'utm_source'   => 'fb',
    'utm_medium'   => 'social',
    'utm_content'  => 'fbad',
    'utm_term'     => 'caymland api',
    'useragent'    => 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0',
    'url'          => '/product/fbad01/',
    'referer'      => 'https://google.com/q=caymland+api',
    'query'        => ['cid'=>'abc','cond'=>'new'], // or as string with "cid=abc&cond=new"
    'remotehost'   => 'example.com',
    'lastActive'   => '2017-01-17T00:30:08+00:00'
 );
$contactApi->addUtm($contactId, $data);

Add UTM tags to a contact

HTTP Request

To add UTM tag entry to a contact:

POST /contacts/ID/utm/add

UTM Parameters (required)

While the parameter array is required, each utm tag entry is optional.

Name Description
utm_campaign The UTM Campaign parameter
utm_source The UTM Source parameter
utm_medium The UTM Medium parameter
utm_content The UTM Content parameter
utm_term The UTM Term parameter
useragent The browsers UserAgent. If provided a new Device entry will be created if necessary.
url The page url
referer The URL of the referer,
query Any extra query parameters you wish to include. Array or http query string
remotehost The Host name
lastActive The date that the action occured. Contacts lastActive date will be updated if included. Date format required 2017-01-17T00:30:08+00:00.

Response

Same as Get Contact with the added UTM Tags.

Remove UTM Tags from a contact

<?php
$contactApi->removeUtm($contactId, $utmId);

Remove a set of UTM Tags from a contact

HTTP Request

To remove UTM Tags from a contact:

POST /contacts/ID/utm/UTMID/remove

Data Parameters

None required.

Response

Same as Get Contact without the removed UTM Tags.

Add Points

<?php

$data = array(
     'eventName' => 'Score via api',
     'actionName' => 'Adding',
 );
$contactApi->addPoints($contactId, $pointDelta, $data);

Add contact points

HTTP Request

To add points to a contact and return a 404 if the lead is not found:

POST /contacts/ID/points/plus/POINTS

Data Parameters (optional)

Name Description
eventName Name of the event
actionName Name of the action

Response

Expected Response Code: 200 json { "success": true }

Subtract Points

<?php

$data = array(
     'eventname' => 'Score via api',
     'actionname' => 'Subtracting',
 );
$contactApi->subtractPoints($contactId, $pointDelta, $data);

Subtract contact points

HTTP Request

To subtract points from a contact and return a 404 if the contact is not found:

POST /contacts/ID/points/minus/POINTS

Data Parameters (optional)

Name Description
eventname Name of the event
actionname Name of the action

Response

Expected Response Code: 200 json { "success": true }

List Available Owners

<?php

$owners = $contactApi->getOwners();
[
  {
    "id": 1,
    "firstName": "Joe",
    "lastName": "Smith"
  },
  {
    "id": 2,
    "firstName": "Jane",
    "lastName": "Smith"
  }
]

Get a list of owners that can be used to assign contacts to when creating/editing.

HTTP Request

GET /contacts/list/owners

Response

Expected Response Code: 200

** Owner Properties **

Name Type Description
id int ID of the Caymland user
firstName string First name of the Caymland user
lastName string Last name of the Caymland user

List Available Fields

<?php

$fields = $contactApi->getFieldList();
{
    "1": {
        "id": 1,
        "label": "Title",
        "alias": "title",
        "type": "lookup",
        "group": "core",
        "order": 1
    },
    "2": {
        "id": 2,
        "label": "First Name",
        "alias": "firstname",
        "type": "text",
        "group": "core",
        "order": 2
    },
    "3": {
        "id": 3,
        "label": "Last Name",
        "alias": "lastname",
        "type": "text",
        "group": "core",
        "order": 3
    },

    "...": {
        "..." : "..."
    }
}

Get a list of available contact fields including custom ones.

HTTP Request

GET /contacts/list/fields

Response

Expected Response Code: 200

** Field Properties **

Name Type Description
id int ID of the field
label string Field label
alias string Field alias used as the column name in the database
type string Type of field. I.e. text, lookup, etc
group string Group the field belongs to
order int Field order

List Contact Notes

<?php

$notes = $contactApi->getContactNotes($id, $searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "notes": [
        {
              "id": 1,
              "text": "<p>Jim is super cool!</p>",
              "type": "general",
              "dateTime": "2015-07-23T13:14:00-05:00"
        }
    ]
}

Get a list of notes for a specific contact.

HTTP Request

GET /contacts/ID/notes

** Query Parameters **

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.

Response

Expected response code: 200

** Note Properties **

Name Type Description
id int ID of the note
text string Body of the note
type string Type of note. Options are “general”, “email”, “call”, “meeting”
dateTime datetime Date/time string of when the note was created.

Get Segment Memberships

<?php

$segments = $contactApi->getContactSegments($id);
{
    "total": 1,
    "segments": {
        "3": {
            "id": 3,
            "name": "New Contacts",
            "alias": "newcontacts"
        }
    }
}

Get a list of contact segments the contact is a member of.

HTTP Request

GET /contacts/ID/segments

Response

Expected response code: 200

** List Properties **

Name Type Description
id int ID of the list
name string Name of the list
alias string Alias of the list used with search commands.
dateAdded datetime Date/time string for when the contact was added to the list
manuallyAdded bool True if the contact was manually added to the list versus being added by a filter
manuallyRemoved bool True if the contact was manually removed from the list even though the list’s filter is a match

Change List Memberships

See Segements.

Get Campaign Memberships

<?php

$campaigns = $contactApi->getContactCampaigns($id);
{
    "total": 1,
    "campaigns": {
        "1": {
            "id": 1,
            "name": "Welcome Campaign",
            "dateAdded": "2015-07-21T14:11:47-05:00",
            "manuallyRemoved": false,
            "manuallyAdded": false,
            "list_membership": [
                3
            ]
        }
    }
}

Get a list of campaigns the contact is a member of.

HTTP Request

GET /contacts/ID/campaigns

Response

Expected response code: 200

** List Properties **

Name Type Description
id int ID of the campaign
name string Name of the campaign
dateAdded datetime Date/time string for when the contact was added to the campaign
manuallyAdded bool True if the contact was manually added to the campaign versus being added by a contact list
manuallyRemoved bool True if the contact was manually removed from the campaign when the contact’s list is assigned to the campaign
listMembership array Array of contact list IDs this contact belongs to that is also associated with this campaign

Change Campaign Memberships

See Campaigns.

Get Categories Memberships

<?php
$email = 'example@example.com'; 

$categories = $contactApi->getCategoryByEmail($email);

List all categories by contact

HTTP Request

List all categories and return a 404 if the lead is not found:

GET contacts/EMAIL/category

Add Contact Categories

<?php
$email = 'example@example.com'; 
$categories = array('Category 1', 'Category 2', 1);

$add = $contactApi->addCategoriesByEmail($email, $categories);

Add contact to categories

HTTP Request

To add contact to categories and return a 404 if the lead is not found:

POST contacts/EMAIL/category

** Query Parameters **

Name Description
email string
categories Mixed Category Alias or IDs.

Remove Contact Categories

<?php
$email = 'example@example.com'; 
$categories = array('Category 1', 'Category 2', 1);

$remove = $contactApi->removeCategoriesByEmail($email, $categories);

Remove contact from categories

HTTP Request

To remove contact from categories and return a 404 if the lead is not found:

POST contacts/EMAIL/category/remove

** Query Parameters **

Name Description
email string
categories Mixed Category Alias or IDs.

Get Contact’s Events

<?php

$events = $contactApi->getEvents($id, $search, $includeEvents, $excludeEvents, $orderBy, $orderByDir, $page);

Warining: Deprecated. Use getActivityForContact instead.

** Query Parameters **

Name Description
id Contact ID
filters[search] String or search command to filter events by.
filters[includeEvents][] Array of event types to include.
filters[excludeEvents][] Array of event types to exclude.
order Array of Column and Direction [COLUMN, DIRECTION].
page What page number to load
{
  "events":[
    {
      "event":"lead.identified",
      "icon":"fa-user",
      "eventType":"Contact identified",
      "eventPriority":-4,
      "timestamp":"2016-06-09T21:39:08+00:00",
      "featured":true
    }
  ],
  "filters":{
    "search":"",
    "includeEvents":[
      "lead.identified"
    ],
    "excludeEvents":[]
  },
  "order":[
    "",
    "ASC"
  ],
  "types":{
    "lead.ipadded":"Accessed from IP",
    "asset.download":"Asset downloaded",
    "campaign.event":"Campaign action triggered",
    "lead.create":"Contact created",
    "lead.identified":"Contact identified",
    "lead.donotcontact":"Do not contact",
    "email.read":"Email read",
    "email.sent":"Email sent",
    "email.failed":"Failed",
    "form.submitted":"Form submitted",
    "page.hit":"Page hit",
    "point.gained":"Point gained",
    "stage.changed":"Stage changed",
    "lead.utmtagsadded":"UTM tags recorded",
    "page.videohit":"Video View Event"
  },
  "total":1,
  "page":1,
  "limit":25,
  "maxPages":1
}

Get a list of contact events the contact created.

HTTP Request

GET /contacts/ID/events

Warining: Deprecated. Use GET /contacts/ID/activity instead.

Response

Expected response code: 200

** List Properties **

Name Type Description
events array List of events
event string ID of the event type
icon string Icon class from FontAwesome
eventType string Human name of the event
eventPriority string Priority of the event
timestamp timestamp Date and time when the event was created
featured bool Flag whether the event is featured
filters array Filters used in the query
order array Ordering used in the query
types array Array of available event types
total int Total number of events in the request
page int Current page number
limit int Limit of events per page
maxPages int How many pages of events are there

Get activity events for specific contact

<?php

$events = $contactApi->getActivityForContact($id, $search, $includeEvents, $excludeEvents, $orderBy, $orderByDir, $page, $dateFrom, $dateTo);

** Query Parameters **

Name Description
id Contact ID
filters[search] String or search command to filter events by.
filters[includeEvents][] Array of event types to include.
filters[excludeEvents][] Array of event types to exclude.
filters[dateFrom] Date from filter. Must be type of \DateTime for the PHP API libary and in format Y-m-d H:i:s for HTTP param
filters[dateTo] Date to filter. Must be type of \DateTime for the PHP API libary and in format Y-m-d H:i:s for HTTP param
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
page What page number to load
{
  "events":[
    {
      "event":"lead.identified",
      "icon":"fa-user",
      "eventType":"Contact identified",
      "eventPriority":-4,
      "timestamp":"2016-06-09T21:39:08+00:00",
      "featured":true
    }
  ],
  "filters":{
    "search":"",
    "includeEvents":[
      "lead.identified"
    ],
    "excludeEvents":[]
  },
  "order":[
    "",
    "ASC"
  ],
  "types":{
    "asset.download": "Asset downloaded",
    "campaign.event": "Campaign action triggered",
    "campaign.event.scheduled": "Campaign event scheduled",
    "lead.donotcontact": "Do not contact",
    "email.failed": "Email failed",
    "email.read": "Email read",
    "email.sent": "Email sent",
    "form.submitted": "Form submitted",
    "lead.imported": "Imported",
    "page.hit": "Page hit",
    "point.gained": "Point gained",
    "stage.changed": "Stage changed",
    "lead.utmtagsadded": "UTM tags recorded",
    "page.videohit": "Video view event"
  },
  "total":1,
  "page":1,
  "limit":25,
  "maxPages":1
}

Get a list of contact events the contact had created.

HTTP Request

GET /contacts/ID/activity

Response

Expected response code: 200

** List Properties **

Name Type Description
events array List of events
event string ID of the event type
icon string Icon class from FontAwesome
eventType string Human name of the event
eventPriority string Priority of the event
timestamp timestamp Date and time when the event was created
featured bool Flag whether the event is featured
filters array Filters used in the query
order array Ordering used in the query
types array Array of available event types
total int Total number of events in the request
page int Current page number
limit int Limit of events per page
maxPages int How many pages of events are there

Get Activity events for all contacts

<?php

$events = $contactApi->getActivity($search, $includeEvents, $excludeEvents, $orderBy, $orderByDir, $page, $dateFrom, $dateTo);

** Query Parameters **

Name Description
filters[search] String or search command to filter events by.
filters[includeEvents][] Array of event types to include.
filters[excludeEvents][] Array of event types to exclude.
filters[dateFrom] Date from filter. Must be type of \DateTime for the PHP API libary and in format Y-m-d H:i:s for HTTP param
filters[dateTo] Date to filter. Must be type of \DateTime for the PHP API libary and in format Y-m-d H:i:s for HTTP param
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
page What page number to load
 {
  "events": [
    {
      "event": "meeting.attended",
      "eventId": "meeting.attended65",
      "eventLabel": "Attended meeting - Caymland instance",
      "eventType": "Meeting attendance",
      "timestamp": "2017-08-03T21:03:04+00:00",
      "contactId": "12180",
      "details": {
        "eventName": "caymland-instance",
        "eventId": "371343405",
        "eventDesc": "Caymland instance",
        "joinUrl": ""
      }
    },
    {
      "event": "webinar.attended",
      "eventId": "webinar.attended67",
      "eventLabel": "Attended webinar - Caymland",
      "eventType": "Webinar attendance",
      "timestamp": "2017-08-03T21:03:04+00:00",
      "contactId": "12180",
      "details": {
        "eventName": "caymland",
        "eventId": "530287395",
        "eventDesc": "Caymland",
        "joinUrl": ""
      }
    },
    {
      "event": "webinar.registered",
      "eventId": "webinar.registered66",
      "eventLabel": "Registered for webinar - Caymland",
      "eventType": "Webinar registered for",
      "timestamp": "2017-08-03T21:03:04+00:00",
      "contactId": "12180",
      "details": {
        "eventName": "caymland",
        "eventId": "530287395",
        "eventDesc": "Caymland",
        "joinUrl": "https://global.gotowebinar.com/join/xxx/xxx"
      }
    },
    {
      "event": "campaign.event",
      "eventId": "campaign.event892",
      "eventLabel": {
        "label": "Contact field value \/ Campaign Date",
        "href": "\/s\/campaigns\/view\/498"
      },
      "eventType": "Campaign action triggered",
      "timestamp": "2017-08-03T00:58:25+00:00",
      "contactId": "12281",
      "details": {
        "log": {
          "dateTriggered": "2017-08-03T00:58:25+00:00",
          "metadata": [],
          "type": "lead.field_value",
          "isScheduled": "0",
          "logId": "892",
          "eventId": "1457",
          "campaignId": "498",
          "eventName": "Contact field value",
          "campaignName": "Campaign Date"
        }
      }
    },
    {
      "event": "email.sent",
      "eventId": "email.sent796",
      "eventLabel": {
        "label": "2017-05-23 - Email - Leads - Nurture Flow (Monica) 1",
        "href": "http:\/\/caymland.dev\/email\/view\/597a116ae69ca",
        "isExternal": true
      },
      "eventType": "Email sent",
      "timestamp": "2017-07-27T16:14:34+00:00",
      "contactId": "16419",
      "details": {
        "stat": {
          "id": "796",
          "dateSent": "2017-07-27T16:14:34+00:00",
          "subject": "How to make the case for digital",
          "isRead": "0",
          "isFailed": "0",
          "viewedInBrowser": "0",
          "retryCount": "0",
          "idHash": "597a116ae69ca",
          "openDetails": [],
          "storedSubject": "How to make the case for digital",
          "timeToRead": false,
          "emailId": "78",
          "emailName": "2017-05-23 - Email - Leads - Nurture Flow (Monica) 1"
        },
        "type": "sent"
      }
    },
    {
      "event": "email.read",
      "eventId": "email.read769",
      "eventLabel": {
        "label": "Custom Email: device test",
        "href": "http:\/\/caymland.dev\/email\/view\/5966b0cd571f4",
        "isExternal": true
      },
      "eventType": "Email read",
      "timestamp": "2017-07-12T23:30:56+00:00",
      "contactId": "13930",
      "details": {
        "stat": {
          "id": "769",
          "dateRead": "2017-07-12T23:30:56+00:00",
          "dateSent": "2017-07-12T23:29:17+00:00",
          "isRead": "1",
          "isFailed": "0",
          "viewedInBrowser": "0",
          "retryCount": "0",
          "idHash": "5966b0cd571f4",
          "openDetails": [
            {
              "datetime": "2017-07-12 23:30:56",
              "useragent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/59.0.3071.115 Safari\/537.36",
              "inBrowser": false
            },
            {
              "datetime": "2017-07-13 02:18:51",
              "useragent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/59.0.3071.115 Safari\/537.36",
              "inBrowser": false
            }
          ],
          "storedSubject": "device test",
          "timeToRead": "PT1M39S"
        },
        "type": "read"
      }
    },
    {
      "event": "lead.ipadded",
      "eventId": "lead.ipadded3263",
      "eventLabel": "127.0.0.1",
      "eventType": "Accessed from IP",
      "timestamp": "2017-07-27T03:09:09+00:00",
      "contactId": "3263",
      "details": []
    },
    {
      "event": "form.submitted",
      "eventId": "form.submitted503",
      "eventLabel": {
        "label": "3586 Test",
        "href": "\/s\/forms\/view\/143"
      },
      "eventType": "Form submitted",
      "timestamp": "2017-07-27T03:09:07+00:00",
      "contactId": "16417",
      "details": {
        "submission": {
          "id": 503,
          "ipAddress": {
            "ip": "127.0.0.1"
          },
          "form": {
            "id": 143,
            "name": "3586 Test",
            "alias": "3586_test"
          },
          "dateSubmitted": "2017-07-27T03:09:07+00:00",
          "referer": "http:\/\/caymland.dev\/form\/143",
          "results": {
            "form_id": "143",
            "email": "formtest7@test.com",
            "f_name": ""
          }
        },
        "form": {
          "id": 143,
          "name": "3586 Test",
          "alias": "3586_test"
        },
        "page": {}
      }
    },
    {
      "event": "page.hit",
      "eventLabel": {
        "label": "Test",
        "href": "\/s\/pages\/view\/8"
      },
      "eventType": "Page hit",
      "timestamp": "2017-07-21T20:36:49+00:00",
      "contactId": "16380",
      "details": {
        "hit": {
          "userAgent": "Mozilla\/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit\/537.36 (KHTML, like Gecko) Chrome\/59.0.3071.115 Safari\/537.36",
          "dateHit": "2017-07-21T20:36:49+00:00",
          "url": "http:\/\/caymland.dev\/uncategorized\/translation-test1",
          "query": {
            "pageUrl": "http:\/\/caymland.dev\/uncategorized\/translation-test1"
          },
          "clientInfo": "a:6:{s:4:\"type\";s:7:\"browser\";s:4:\"name\";s:6:\"Chrome\";s:10:\"short_name\";s:2:\"CH\";s:7:\"version\";s:4:\"59.0\";s:6:\"engine\";s:5:\"Blink\";s:14:\"engine_version\";s:0:\"\";}",
          "device": "desktop",
          "deviceOsName": "Mac",
          "deviceBrand": "",
          "deviceModel": "",
          "pageId": "8"
        }
      }
    },
    {
      "event": "point.gained",
      "eventLabel": "2: Page Hit Test \/ 20",
      "eventType": "Point gained",
      "timestamp": "2017-07-20T22:38:28+00:00",
      "contactId": "16379",
      "details": {
        "log": {
          "eventName": "2: Page Hit Test",
          "actionName": "hit",
          "dateAdded": "2017-07-20T22:38:28+00:00",
          "type": "url",
          "delta": "20",
          "id": "2"
        }
      }
    },
    {
      "event": "lead.imported",
      "eventId": "lead.imported6324",
      "eventType": "Imported",
      "eventLabel": {
        "label": "Contact import failed from FakeNameGenerator.com_20d05d9c.csv",
        "href": "\/s\/contacts\/import\/view\/4"
      },
      "timestamp": "2017-07-17T21:42:35+00:00",
      "details": {
        "id": "6324",
        "bundle": "lead",
        "object": "import",
        "action": "failed",
        "properties": {
          "line": 2001,
          "file": "FakeNameGenerator.com_20d05d9c.csv",
          "error": "No data found"
        },
        "userId": "2",
        "userName": "Bob Smith",
        "objectId": "4",
        "dateAdded": "2017-07-17T21:42:35+00:00"
      }
    },
    {
      "event": "asset.download",
      "eventId": "asset.download11",
      "eventLabel": {
        "label": "Download Caymland",
        "href": "\/s\/assets\/view\/1"
      },
      "eventType": "Asset downloaded",
      "timestamp": "2017-04-04T01:49:13+00:00",
      "details": {
        "asset": {
          "id": 1,
          "title": "Download Caymland",
          "alias": "download-caymland",
          "description": "test"
        },
        "assetDownloadUrl": "http:\/\/caymland.dev\/asset\/1:download-caymland"
      }
    },
  ],
  "filters": {
    "search": "",
    "includeEvents": [],
    "excludeEvents": []
  },
  "order": [
    "timestamp",
    "DESC"
  ],
  "types": {
    "lead.ipadded": "Accessed from IP",
    "asset.download": "Asset downloaded",
    "meeting.attended": "Attended meeting",
    "webinar.attended": "Attended webinar",
    "campaign.event": "Campaign action triggered",
    "campaign.event.scheduled": "Campaign event scheduled",
    "lead.donotcontact": "Do not contact",
    "email.failed": "Email failed",
    "email.read": "Email read",
    "email.sent": "Email sent",
    "form.submitted": "Form submitted",
    "lead.imported": "Imported",
    "page.hit": "Page hit",
    "point.gained": "Point gained",
    "meeting.registered": "Registered for meeting",
    "webinar.registered": "Registration to Webinar",
    "stage.changed": "Stage changed",
    "lead.utmtagsadded": "UTM tags recorded",
    "page.videohit": "Video view event"
  },
  "total": 12,
  "page": 1,
  "limit": 25,
  "maxPages": 1
}

HTTP Request

GET /contacts/activity

Response

Expected response code: 200

** List Properties **

Name Type Description
events array List of events
event string ID of the event type
icon string Icon class from FontAwesome
eventType string Human name of the event
eventPriority string Priority of the event
contactId ID of the contact who created the event
timestamp timestamp Date and time when the event was created
featured bool Flag whether the event is featured
filters array Filters used in the query
order array Ordering used in the query
types array Array of available event types
total int Total number of events in the request
page int Current page number
limit int Limit of events per page
maxPages int How many pages of events are there

Get Contact’s Companies

<?php

$companies = $contactApi->getContactCompanies($contactId);

```json
{
  "total":1,
  "companies":[
    {
      "company_id":"420",
      "date_associated":"2016-12-27 15:03:43",
      "is_primary":"0",
      "companyname":"test",
      "companyemail":"test@company.com",
      "companycity":"Raleigh",
      "score":"0",
      "date_added":"2016-12-27 15:03:42"
    }
  ]
}

Get a list of contact’s companies the contact belongs to.

HTTP Request

GET /contacts/ID/companies

Response

Expected response code: 200

List Properties

Name Type Description
company_id int Company ID
date_associated datetime Date and time when the contact was associated to the company
date_added datetime Date and time when the company was created
is_primary bool Flag whether the company association is primary (current)
companyname string Name of the company
companyemail string Email of the company
companycity string City of the company
score int Score of the company

Get Contact’s Devices

<?php

$devices = $contactApi->getContactDevices($contactId);

```json
{
  "total":1,
  "devices":[
    {
      "id":60,
      "lead":[],
      "clientInfo":[],
      "device":"desktop",
      "deviceOsName":"Ubuntu",
      "deviceOsShortName":"UBT",
      "deviceOsPlatform":"x64"
    }
  ]
}

Get a list of contact’s devices the contact has used.

HTTP Request

GET /contacts/ID/devices

Response

Expected response code: 200

List Properties

Name Type Description
id int Device ID
clientInfo array Array with various information about the client (browser)
device string Device type; desktop, mobile..
deviceOsName string Full device OS name
deviceOsShortName string Short device OS name
deviceOsPlatform string OS platform

Dashboard widget data

Use this endpoint to obtain details on Caymland’s dashboard statistical data.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth   = new ApiAuth();
$auth       = $initAuth->newAuth($settings);
$apiUrl     = "https://your-caymland.com";
$api        = new CaymlandApi();
$contactApi = $api->newApi("data", $auth, $apiUrl);

Get list of available widget types

<?php
$data = $dataApi->getList();

HTTP Request

GET /data

Expected Response Code: 200

{
    "success":1,
    "types":{
        "Core Widgets":{
            "recent.activity":"Recent Activity"
        },
        "Contact Widgets":{
            "created.leads.in.time":"Created contacts in time",
            "anonymous.vs.identified.leads":"Anonymous vs identified contacts",
            "map.of.leads":"Map",
            "top.lists":"Top segments",
            "top.creators":"Top contact creators",
            "top.owners":"Top contact owners",
            "created.leads":"Created contacts"
        },
        "Page Widgets":{
            "page.hits.in.time":"Page visits in time",
            "unique.vs.returning.leads":"Unique vs returning visitors",
            "dwell.times":"Dwell times",
            "popular.pages":"Popular landing pages",
            "created.pages":"Created Landing pages"
        },
        "Point Widgets":{
            "points.in.time":"Points in time"
        },
        "Form Widgets":{
            "submissions.in.time":"Submissions in time",
            "top.submission.referrers":"Top submission referrers",
            "top.submitters":"Top submitters",
            "created.forms":"Created forms"
        },
        "Email Widgets":{
            "emails.in.time":"Emails in time",
            "sent.email.to.contacts":"Sent email to contacts",
            "most.hit.email.redirects":"Most hit email redirects",
            "ignored.vs.read.emails":"Ignored vs read",
            "upcoming.emails":"Upcoming emails",
            "most.sent.emails":"Most sent emails",
            "most.read.emails":"Most read emails",
            "created.emails":"Created emails"
        },
        "Asset Widgets":{
            "asset.downloads.in.time":"Downloads in time",
            "unique.vs.repetitive.downloads":"Unique vs repetitive downloads",
            "popular.assets":"Popular assets",
            "created.assets":"Created assets"
        },
        "Campaign Widgets":{
            "events.in.time":"Events triggered in time",
            "leads.added.in.time":"Leads added in time"
        }
    }
}

Get an individual widget data by type.

<?php
$data = $dataApi->get($type, $options);

HTTP Request

GET /data/{type}?dateFrom={YYYY-mm-dd}&dateTo={YYYY-mm-dd}&timeUnit={m}

Returns response which can be directly visualized byt the chartJS library.

Response

Expected Response Code: 200

{
    "success":1,
    "cached":false,
    "execution_time":0.043900966644287,
    "data":{
        "chartType":"line",
        "chartHeight":220,
        "chartData":{
            "labels":[
                "Jan 2016",
                "Feb 2016",
                "Mar 2016",
                "Apr 2016",
                "May 2016"
            ],
            "datasets":[{
                "label":"Submission Count",
                "data":[
                    12,
                    6,
                    0,
                    0,
                    0
                ],
                "fillColor":"rgba(78,93,157,0.1)",
                "strokeColor":"rgba(78,93,157,0.8)",
                "pointColor":"rgba(78,93,157,0.75)",
                "pointHighlightStroke":"rgba(78,93,157,1)"
            }]
        }
    }
}

HTTP Request

GET /data/{type}?dateFrom={YYYY-mm-dd}&dateTo={YYYY-mm-dd}&timeUnit={m}&dataFormat={raw}

Returns raw format which can be more easily processed.

Response

Expected Response Code: 200

{
    "success":1,
    "cached":false,
    "execution_time":0.039958000183105,
    "data":{
        "Submission Count":{
            "Jan 2016":12,
            "Feb 2016":6,
            "Mar 2016":0,
            "Apr 2016":0,
            "May 2016":0
        }
    }
}

“Emails in time” widget

Filter parameters

filtercompanyId Filter only emails from contacts assigned to provided company.

filter[campaignId (int) Filter only emails from contacts that were sent as part of provided campaign.

filtersegmentId Filter only emails from contacts assigned to provided segment.

Dataset parameter

dataset (array) - sent - opened - unsubscribed - clicked - bounced - failed Provide more datasets in response based on request.

HTTP Request:

GET /api/data/emails.in.time?dateFrom={YYYY-mm-dd}&dateTo={YYYY-mm-dd}&timeUnit={m}&filter[campaignId]={int}&filter[companyId]={int}&filter[segmentId]={int}&withCounts&dataset[]=sent&dataset[]=opened&dataset[]=unsubscribed&dataset[]=clicked

“Sent email to contacts” widget

Filter parameters

filtercompanyId Filter only emails from contacts assigned to provided company.

filter[campaignId (int) Filter only emails from contacts that were sent as part of provided campaign.

filtersegmentId Filter only emails from contacts assigned to provided segment.

HTTP Request:

GET /api/data/sent.email.to.contacts?dateFrom={YYYY-mm-dd}&dateTo={YYYY-mm-dd}&timeUnit={m}&filter[campaignId]={int}&filter[companyId]={int}&filter[segmentId]={int}&limit=10&offset=0

“Most hit email redirects” widgets

Filter parameters

filtercompanyId Filter only emails from contacts assigned to provided company.

filter[campaignId (int) Filter only emails from contacts that were sent as part of provided campaign.

filtersegmentId Filter only emails from contacts assigned to provided segment.

HTTP Request:

GET /api/data/most.hit.email.redirects?dateFrom={YYYY-mm-dd}&dateTo={YYYY-mm-dd}&timeUnit={m}&filter[campaignId]={int}&filter[companyId]={int}&filter[segmentId]={int}&limit=10&offset=0

Available data URL query params

Name|Type|Example|Description —-|—-|———– timezone|string|America/New_York|PHP timezone dateFrom|string|2016-28-03|Date from in the YYYY-mm-dd HH:ii:ss format dateTo|string|2016-28-04|Date to in the YYYY-mm-dd HH:ii:ss format timeUnit|string|m|Date/Time unit. Available options: Y, m, W, d, H limit|int|10|Limit of the table widget items filter|array|[lead_id => 23]|filters which should be applied to the SQL query

Dynamic Content

Use this endpoint to obtain details on Caymland’s web dynamic content.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth         = new ApiAuth();
$auth             = $initAuth->newAuth($settings);
$apiUrl           = "https://your-caymland.com";
$api              = new CaymlandApi();
$dynamicContentApi = $api->newApi("dynamicContents", $auth, $apiUrl);

Get Dynamic Content

<?php

//...
$dynamicContent = $dynamicContentApi->get($id);
{
    "dynamicContent":{
        "isPublished":true,
        "dateAdded":"2016-06-20T11:26:51+00:00",
        "createdBy":1,
        "createdByUser":"John Doe",
        "dateModified":"2016-08-08T16:36:27+00:00",
        "modifiedBy":1,
        "modifiedByUser":"John Doe",
        "id":1,
        "name":"DC13",
        "category":null,
        "publishUp":null,
        "publishDown":null,
        "sentCount":0,
        "variantParent":null,
        "variantChildren":[]
    }
}

Get an individual dynamicContent by ID.

HTTP Request

GET /dynamiccontents/ID

Response

Expected Response Code: 200

See JSON code example.

Dynamic Content Properties

Name Type Description
id int ID of the dynamic content
name string Name of the dynamic content
description string/null Description of the dynamic content
isPublished bool Published state
publishUp datetime/null Date/time when the dynamic content should be published
publishDown datetime/null Date/time the dynamic content should be un published
dateAdded datetime Date/time dynamic content was created
createdBy int ID of the user that created the dynamic content
createdByUser string Name of the user that created the dynamic content
dateModified datetime/null Date/time dynamic content was last modified
modifiedBy int ID of the user that last modified the dynamic content
modifiedByUser string Name of the user that last modified the dynamic content
variantChildren array Array of Dynamic Content entities for variants of this landing dynamic content
variantParent object The parent/main dynamic content if this is a variant (A/B test)
sentCount int Count of how many times the dynamic content was sent

List Dynamic Contents

<?php
// ...

$dynamicContents = $dynamicContentApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total":30,
    "dynamicContents":[
        {
            "isPublished":true,
            "dateAdded":"2016-06-20T11:27:09+00:00",
            "createdBy":1,
            "createdByUser":"John Doe",
            "dateModified":"2016-08-22T17:14:01+00:00",
            "modifiedBy":1,
            "modifiedByUser":"John Doe",
            "id":2,
            "name":"CD2",
            "category":null,
            "publishUp":null,
            "publishDown":null,
            "sentCount":0,
            "variantParent":null,
            "variantChildren":[]
        }
    ]
}

HTTP Request

GET /dynamiccontents

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Dynamic Content.

Create Dynamic Content

<?php

$data = array(
    'name'        => 'Dynamic Content A',
    'isPublished' => 1
);

$dynamicContent = $dynamicContentApi->create($data);

Create a new dynamicContent.

HTTP Request

POST /dynamiccontents/new

Post Parameters

Name Type Description
id int ID of the dynamic content
name string Name of the dynamic content
description string/null Description of the dynamic content
isPublished bool Published state
publishUp datetime/null Date/time when the dynamic content should be published
publishDown datetime/null Date/time the dynamic content should be un published
dateAdded datetime Date/time dynamic content was created
createdBy int ID of the user that created the dynamic content
createdByUser string Name of the user that created the dynamic content
dateModified datetime/null Date/time dynamic content was last modified
modifiedBy int ID of the user that last modified the dynamic content
modifiedByUser string Name of the user that last modified the dynamic content
variantChildren array Array of Dynamic Content entities for variants of this landing dynamic content
variantParent object The parent/main dynamic content if this is a variant (A/B test)
sentCount int Count of how many times the dynamic content was sent

Response

Expected Response Code: 201

Properties

Same as Get Dynamic Content.

Edit Dynamic Content

<?php

$id   = 1;
$data = array(
    'name'        => 'New dynamicContent name',
    'isPublished' => 0
);

// Create new a dynamicContent of ID 1 is not found?
$createIfNotFound = true;

$dynamicContent = $dynamicContentApi->edit($id, $data, $createIfNotFound);

Edit a new dynamicContent. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a dynamicContent if the given ID does not exist and clears all the dynamic content information, adds the information from the request. PATCH fails if the dynamic content with the given ID does not exist and updates the dynamic content field values with the values form the request.

HTTP Request

To edit a dynamicContent and return a 404 if the dynamic content is not found:

PATCH /dynamiccontents/ID/edit

To edit a dynamicContent and create a new one if the dynamic content is not found:

PUT /dynamiccontents/ID/edit

Post Parameters

Name Type Description
id int ID of the dynamic content
name string Name of the dynamic content
description string/null Description of the dynamic content
isPublished bool Published state
publishUp datetime/null Date/time when the dynamic content should be published
publishDown datetime/null Date/time the dynamic content should be un published
dateAdded datetime Date/time dynamic content was created
createdBy int ID of the user that created the dynamic content
createdByUser string Name of the user that created the dynamic content
dateModified datetime/null Date/time dynamic content was last modified
modifiedBy int ID of the user that last modified the dynamic content
modifiedByUser string Name of the user that last modified the dynamic content
variantChildren array Array of Dynamic Content entities for variants of this landing dynamic content
variantParent object The parent/main dynamic content if this is a variant (A/B test)
sentCount int Count of how many times the dynamic content was sent

Response

If PUT, the expected response code is 200 if the dynamic content was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Dynamic Content.

Delete Dynamic Content

<?php

$dynamicContent = $dynamicContentApi->delete($id);

Delete a dynamicContent.

HTTP Request

DELETE /dynamiccontents/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Dynamic Content.

Emails

Use this endpoint to obtain details, create, update or delete Caymland’s emails.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$emailApi = $api->newApi("emails", $auth, $apiUrl);

Get Email

<?php

//...
$email = $emailApi->get($id);
{  
  "email":{  
    "isPublished":true,
    "dateAdded":"2016-10-25T18:51:17+00:00",
    "createdBy":1,
    "createdByUser":"John Doe",
    "dateModified":null,
    "modifiedBy":null,
    "modifiedByUser":null,
    "id":560,
    "name":"test",
    "subject":"API test email",
    "language":"en",
    "category":null,
    "fromAddress":null,
    "fromName":null,
    "replyToAddress":null,
    "bccAddress":null,
    "customHtml":"<h1>Hi there!<\/h1>",
    "plainText":null,
    "template":null,
    "emailType":"list",
    "publishUp":null,
    "publishDown":null,
    "readCount":0,
    "sentCount":0,
    "revision":1,
    "assetAttachments":[],
    "variantStartDate":null,
    "variantSentCount":0,
    "variantReadCount":0,
    "variantParent":null,
    "variantChildren":[],
    "translationParent":null,
    "translationChildren":[],
    "unsubscribeForm":null,
    "dynamicContent":[  
      {  
        "tokenName":null,
        "content":null,
        "filters":[  
          {  
            "content":null,
            "filters":[  
              {  
                "glue":null,
                "field":null,
                "object":null,
                "type":null,
                "operator":null,
                "display":null,
                "filter":null
              }
            ]
          }
        ]
      }
    ],
    "lists":[  
      {  
        "createdByUser":"John Doe",
        "modifiedByUser":null,
        "id":256,
        "name":"test",
        "alias":"test29",
        "description":null
      }
    ]
  }
}

Get an individual email by ID.

HTTP Request

GET /emails/ID

Response

Expected Response Code: 200

See JSON code example.

Email Properties

Name Type Description
id int ID of the email
name string Internal name of the email
subject stringl Subject of the email
fromAddress string The from email address if it’s different than the one in the Caymland configuration
fromName string The from name if it’s different than the one in the Caymland configuration
replyToAddress string The reply to email address if it’s different than the one in the Caymland configuration
bccAddress string The BCC email address if it’s different than the one in the Caymland configuration
isPublished bool Published state
publishUp datetime/null Date/time when the email should be published
publishDown datetime/null Date/time the email should be un published
dateAdded datetime Date/time email was created
createdBy int ID of the user that created the email
createdByUser string Name of the user that created the email
dateModified datetime/null Date/time email was last modified
modifiedBy int ID of the user that last modified the email
modifiedByUser string Name of the user that last modified the email
language string Language locale of the email
readCount int Total email read count
sentCount int Total email sent count
revision int Email revision
customHtml string The HTML content of the email
plainText string The plain text content of the email
template string The name of the template used as the base for the email
emailType string If it is a segment (former list) email or template email. Possible values are ‘list’ and 'template’
translationChildren array Array of Page entities for translations of this landing page
translationParent object The parent/main page if this is a translation
variantSentCount int Sent count since variantStartDate
variantReadCount int Read count since variantStartDate
variantChildren array Array of Email entities for variants of this landing email
variantParent object The parent/main email if this is a variant (A/B test)
variantSettings array The properties of the A/B test
variantStartDate datetime/null The date/time the A/B test began
category object/null Category information
unsubscribeForm int Id of the form displayed in the unsubscribe page
dynamicContent object Dynamic content configuration
lists array Array of segment IDs which should be added to the segment email
assetAttachments array asset IDs Array for email attachment

List Emails

<?php
// ...

$emails = $emailApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "emails": [
        {  
            "isPublished":true,
            "dateAdded":"2016-10-25T18:51:17+00:00",
            "createdBy":1,
            "createdByUser":"John Doe",
            "dateModified":null,
            "modifiedBy":null,
            "modifiedByUser":null,
            "id":560,
            "name":"test",
            "subject":"API test email",
            "language":"en",
            "category":null,
            "fromAddress":null,
            "fromName":null,
            "replyToAddress":null,
            "bccAddress":null,
            "customHtml":"<h1>Hi there!<\/h1>",
            "plainText":null,
            "template":null,
            "emailType":"list",
            "publishUp":null,
            "publishDown":null,
            "readCount":0,
            "sentCount":0,
            "revision":1,
            "assetAttachments":[],
            "variantStartDate":null,
            "variantSentCount":0,
            "variantReadCount":0,
            "variantParent":null,
            "variantChildren":[],
            "translationParent":null,
            "translationChildren":[],
            "unsubscribeForm":null,
            "dynamicContent":[  
              {  
                "tokenName":null,
                "content":null,
                "filters":[  
                  {  
                    "content":null,
                    "filters":[  
                      {  
                        "glue":null,
                        "field":null,
                        "object":null,
                        "type":null,
                        "operator":null,
                        "display":null,
                        "filter":null
                      }
                    ]
                  }
                ]
              }
            ],
            "lists":[  
              {  
                "createdByUser":"John Doe",
                "modifiedByUser":null,
                "id":256,
                "name":"test",
                "alias":"test29",
                "description":null
              }
            ]
          }
    ]
}

HTTP Request

GET /emails

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Email.

Create Email

<?php 

$data = array(
    'title'        => 'Email A',
    'description' => 'This is my first email created via API.',
    'isPublished' => 1
);

$email = $emailApi->create($data);

Create a new email.

HTTP Request

POST /emails/new

Post Parameters

Name Type Description
id int ID of the email
name string Internal name of the email
subject stringl Subject of the email
fromAddress string The from email address if it’s different than the one in the Caymland configuration
fromName string The from name if it’s different than the one in the Caymland configuration
replyToAddress string The reply to email address if it’s different than the one in the Caymland configuration
bccAddress string The BCC email address if it’s different than the one in the Caymland configuration
isPublished bool Published state
publishUp datetime/null Date/time when the email should be published
publishDown datetime/null Date/time the email should be un published
language string Language locale of the email
readCount int Total email read count
sentCount int Total email sent count
revision int Email revision
customHtml string The HTML content of the email
plainText string The plain text content of the email
template string The name of the template used as the base for the email
emailType string If it is a segment (former list) email or template email. Possible values are 'list’ and 'template’
translationChildren array Array of Page entities for translations of this landing page
translationParent object The parent/main page if this is a translation
variantSentCount int Sent count since variantStartDate
variantReadCount int Read count since variantStartDate
variantChildren array Array of Email entities for variants of this landing email
variantParent object The parent/main email if this is a variant (A/B test)
variantSettings array The properties of the A/B test
variantStartDate datetime/null The date/time the A/B test began
category object/null Category information
unsubscribeForm int Id of the form displayed in the unsubscribe page
dynamicContent object Dynamic content configuration
lists array Array of segment IDs which should be added to the segment email

Response

Expected Response Code: 201

Properties

Same as Get Email.

Edit Email

<?php

$id   = 1;
$data = array(
    'title'        => 'New email title',
    'isPublished' => 0
);

// Create new a email of ID 1 is not found?
$createIfNotFound = true;

$email = $emailApi->edit($id, $data, $createIfNotFound);

Edit a new email. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a email if the given ID does not exist and clears all the email information, adds the information from the request. PATCH fails if the email with the given ID does not exist and updates the email field values with the values form the request.

HTTP Request

To edit a email and return a 404 if the email is not found:

PATCH /emails/ID/edit

To edit a email and create a new one if the email is not found:

PUT /emails/ID/edit

Post Parameters

Name Type Description
id int ID of the email
name string Internal name of the email
subject stringl Subject of the email
fromAddress string The from email address if it’s different than the one in the Caymland configuration
fromName string The from name if it’s different than the one in the Caymland configuration
replyToAddress string The reply to email address if it’s different than the one in the Caymland configuration
bccAddress string The BCC email address if it’s different than the one in the Caymland configuration
isPublished bool Published state
publishUp datetime/null Date/time when the email should be published
publishDown datetime/null Date/time the email should be un published
language string Language locale of the email
readCount int Total email read count
sentCount int Total email sent count
revision int Email revision
customHtml string The HTML content of the email
plainText string The plain text content of the email
template string The name of the template used as the base for the email
emailType string If it is a segment (former list) email or template email. Possible values are 'list’ and 'template’
translationChildren array Array of Page entities for translations of this landing page
translationParent object The parent/main page if this is a translation
variantSentCount int Sent count since variantStartDate
variantReadCount int Read count since variantStartDate
variantChildren array Array of Email entities for variants of this landing email
variantParent object The parent/main email if this is a variant (A/B test)
variantSettings array The properties of the A/B test
variantStartDate datetime/null The date/time the A/B test began
category object/null Category information
unsubscribeForm int Id of the form displayed in the unsubscribe page
dynamicContent object Dynamic content configuration
lists array Array of segment IDs which should be added to the segment email

Response

If PUT, the expected response code is 200 if the email was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Email.

Delete Email

<?php

$email = $emailApi->delete($id);

Delete a email.

HTTP Request

DELETE /emails/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Email.

Send Email to Contact

<?php

$email = $emailApi->sendToContact($emailId, $contactId);

Send a predefined email to existing contact.

HTTP Request

POST /emails/ID/contact/CONTACT_ID/send

Post Parameters

Name Type Description
tokens array Array of tokens in email

Response

Expected Response Code: 200

Properties json { "success": 1 }

Send Email to Segment

<?php

$email = $emailApi->send($id);

Send a segment email to linked segment(s).

HTTP Request

POST /emails/ID/send

Response

Expected Response Code: 200

Properties json { "success": 1, "sentCount": 1, "failedCount": 0 }

Fields

Use this endpoint to work with Caymland’s contact/company fields.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$assetApi = $api->newApi("assets", $auth, $apiUrl);

// Get contact field context:
$fieldApi = $api->newApi("contactFields", $auth, $apiUrl);

// Or use 'companyFields' for company fields:
$fieldApi = $api->newApi("companyFields", $auth, $apiUrl);

Get Field

<?php

//...
$field = $fieldApi->get($id);
{  
  "field":{  
    "isPublished":true,
    "dateAdded":"2016-11-10T13:02:52+00:00",
    "createdBy":1,
    "createdByUser":"John Doe",
    "dateModified":null,
    "modifiedBy":null,
    "modifiedByUser":null,
    "id":165,
    "label":"API test field",
    "alias":"api_test_field11",
    "type":"text",
    "group":null,
    "order":36,
    "object":"lead",
    "defaultValue":null,
    "isRequired":false,
    "isPubliclyUpdatable":false,
    "isUniqueIdentifier":0,
    "properties":[]
  }
}

Get an individual field by ID.

HTTP Request

GET /fields/contact/ID or GET /fields/company/ID

Response

Expected Response Code: 200

See JSON code example.

Field Properties

Name Type Description
id int ID of the field
isPublished bool Published state
publishUp datetime/null Date/time when the field should be published
publishDown datetime/null Date/time the field should be un published
dateAdded datetime Date/time field was created
createdBy int ID of the user that created the field
createdByUser string Name of the user that created the field
dateModified datetime/null Date/time field was last modified
modifiedBy int ID of the user that last modified the field
modifiedByUser string Name of the user that last modified the field
label string Name of the field
alias string Unique alias of the field used in the form field name attributes
description string/null Description of the field
type string Field type
group string Groupd of the fields where the field belongs
order int Order number of the field
object string Which object use the field. Contact (lead) or Company.
defaultValue string Default value of the field.
isRequired boolean True if the field is required.
isPubliclyUpdatable boolean True if the field value can be changed from public requests. The tracking pixel query for example.
isUniqueIdentifier boolean True if the field is unique identifier and so the contacts should merge if the value of this field is the same.
properties array Field options if the field type needs some.

List Contact Fields

<?php

//...
$fields = $fieldApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
  "total":71,
  "fields":[  
    {  
      "isPublished":true,
      "dateAdded":"2016-10-12T11:31:13+00:00",
      "createdBy":1,
      "createdByUser":"John Doe",
      "dateModified":"2016-10-12T11:31:30+00:00",
      "modifiedBy":1,
      "modifiedByUser":"John Doe",
      "id":100,
      "label":"Multiselect test",
      "alias":"multiselect_test",
      "type":"multiselect",
      "group":"core",
      "order":3,
      "object":"lead",
      "defaultValue":null,
      "isRequired":false,
      "isPubliclyUpdatable":false,
      "isUniqueIdentifier":false,
      "properties":{  
        "list":[  
          {  
            "label":"PHP",
            "value":"php"
          },
          {  
            "label":"JS",
            "value":"js"
          },
          {  
            "label":"English",
            "value":"en"
          }
        ]
      }
    },
    [...]
  ]
}

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

HTTP Request

GET /fields/contact or GET /fields/company

Response

Expected Response Code: 200

See JSON code example.

Field Properties

Name Type Description
id int ID of the field
isPublished bool Published state
publishUp datetime/null Date/time when the field should be published
publishDown datetime/null Date/time the field should be un published
dateAdded datetime Date/time field was created
createdBy int ID of the user that created the field
createdByUser string Name of the user that created the field
dateModified datetime/null Date/time field was last modified
modifiedBy int ID of the user that last modified the field
modifiedByUser string Name of the user that last modified the field
label string Name of the field
alias string Unique alias of the field used in the form field name attributes
description string/null Description of the field
type string Field type
group string Groupd of the fields where the field belongs
order int Order number of the field
object string Which object use the field. Contact (lead) or Company.
defaultValue string Default value of the field.
isRequired boolean True if the field is required.
isPubliclyUpdatable boolean True if the field value can be changed from public requests. The tracking pixel query for example.
isUniqueIdentifier boolean True if the field is unique identifier and so the contacts should merge if the value of this field is the same.
properties array Field options if the field type needs some.

Create Field

<?php 

$data = array(
    'label' => 'API test field',
    'type' => 'text',
);

$field = $fieldApi->create($data);

Multiselect Field “`php <?php

$data = array( ‘label’ => 'API test field’, 'type’ => 'multiselect’, 'isPubliclyUpdatable’ => true, 'properties’ => array( 'list’ => array( array( 'label’ => 'label 1’, 'value’ => 'value 1’ ), array( 'label’ => 'label 2’, 'value’ => 'value 2’ ) ) ) );

$field = $fieldApi->create($data);

Create a new field.

HTTP Request

POST /fields/contact/new or POST /fields/company/new

Post Parameters

Name Description
label string
alias string
description string/null
type string
group string
order int
object string
defaultValue string
isRequired boolean
isPubliclyUpdatable boolean
isUniqueIdentifier boolean
properties array

Response

Expected Response Code: 201

Properties

Same as Get Field.

Edit Field

<?php

$id   = 1;
$data = array(
    'label' => 'API test field',
    'type' => 'text',
);

// Create new a field of ID 1 is not found?
$createIfNotFound = true;

$field = $fieldApi->edit($id, $data, $createIfNotFound);

Edit a new field. Field that this supports PUT or PATCH depending on the desired behavior.

PUT creates a field if the given ID does not exist and clears all the field infieldation, adds the infieldation from the request. PATCH fails if the field with the given ID does not exist and updates the field field values with the values field the request.

HTTP Request

To edit a field and return a 404 if the field is not found:

PATCH /fields/contact/ID/edit or PATCH /fields/company/ID/edit

To edit a field and create a new one if the field is not found:

PUT /fields/contact/ID/edit or PUT /fields/company/ID/edit

Post Parameters

Name Description
label string
alias string
description string/null
type string
group string
order int
object string
defaultValue string
isRequired boolean
isPubliclyUpdatable boolean
isUniqueIdentifier boolean
properties array

Response

If PUT, the expected response code is 200 if the field was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Field.

Delete Field

<?php

$field = $fieldApi->delete($id);

Delete a field.

HTTP Request

DELETE /fields/contact/ID/delete or DELETE /fields/company/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Field.

Files

This endpoint is useful for working with files of images and assets.

Note: Assets doesn’t have nor support subdirectories.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$filesApi = $api->newApi("files", $auth, $apiUrl);

Get List of files

<?php

// Get list of root media/images directory:
$files = $filesApi->getList();

// Get list of some sub-directory (flags in this case) of media/images:
$filesApi->setFolder('images/flags');
$files = $filesApi->getList();

// Get list of root media/files directory where the asset files are stored:
$files = $filesApi->setFolder('assets');
$files = $filesApi->getList();
{  
  "files":{  
    "3":"0b0f20185251d1c0cd5ff17950213fc9.png",
    "4":"0f530efdf837d3005bd2ab81cc30e878.jpeg",
    "5":"162a694f4101cb06c27c0a0699bd87c4.png",
    "6":"16ada2e2ecfa3f1d8cbb5d633f0bd8c6.png",
    ...
  }
}

HTTP Request

GET /files/images to get root images directory GET /files/images?subdir=flags to get images/flags directory GET /files/assets to get root assets directory

Response

Expected Response Code: 200

See JSON code example.

Response Properties

Name Type Description
files array List of requested files and directories

Create File

<?php
$data = array(
    'file' => dirname(__DIR__).'/'.'caymlandlogo.png' // Must be a path to an existing file
);

// Create a file in root media/images directory:
$response = $fileApi->create($data);

// Create a file in some sub-directory (flags in this case) of media/images:
$filesApi->setFolder('images/flags');
$response = $fileApi->create($data);

// Create a file in media/files directory where the asset files are stored:
$files = $filesApi->setFolder('assets');
$response = $fileApi->create($data);

Creates a file. The file is sent via regular POST files array like a browser sends it during file upload.

HTTP Request

POST /files/DIR/new

Response

Expected Response Code: 200 json { "file":{ "link":"http:\/\/yourcaymland\/media\/images\/2b912b934dd2a4da49a226d0bf68bfea.png", "name":"2b912b934dd2a4da49a226d0bf68bfea.png" } }

Response Properties

Name Type Description
link string Appears only for files in image directory, not for assets
name string File name of newly created file

Delete File

<?php
// Delete a file from root media/images directory:
$response = $fileApi->delete($fileName);

// Delete a file from some sub-directory (flags in this case) of media/images:
$filesApi->setFolder('images/flags');
$response = $fileApi->delete($fileName);

// Delete a file from media/files directory where the asset files are stored:
$files = $filesApi->setFolder('assets');
$response = $fileApi->delete($fileName);

Delete a file.

HTTP Request

DELETE /files/DIR/FILE/delete

Response

Expected Response Code: 200 json { "success": true }

Forms

Use this endpoint to obtain details on Caymland’s forms.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$formApi  = $api->newApi("forms", $auth, $apiUrl);

Get Form

<?php

//...
$form = $formApi->get($id);
{
    "form": {
        "id": 3,
        "name": "Newlsetter",
        "alias": "newsletter",
        "description": null,
        "isPublished": true,
        "publishUp": null,
        "publishDown": null,
        "dateAdded": "2015-07-15T15:06:02-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-20T13:11:56-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "category": null,
        "cachedHtml": "\n\n<script...",
        "template": null,
        "fields": {
            "26": {
                "id": 26,
                "label": "Email",
                "showLabel": false,
                "alias": "email",
                "type": "text",
                "defaultValue": null,
                "isRequired": true,
                "validationMessage": "Email is required",
                "helpMessage": null,
                "order": 1,
                "properties": {
                    "placeholder": "Email address"
                },
                "labelAttributes": null,
                "inputAttributes": null,
                "containerAttributes": null
            },
            "27": {
                "id": 27,
                "label": "Submit",
                "showLabel": true,
                "alias": "submit",
                "type": "button",
                "defaultValue": null,
                "isRequired": false,
                "validationMessage": null,
                "helpMessage": null,
                "order": 4,
                "properties": [],
                "labelAttributes": null,
                "inputAttributes": null,
                "containerAttributes": null
            }
        },
        "actions": {
            "4": {
                "id": 4,
                "type": "email.send.lead",
                "name": "Send thank you email",
                "description": null,
                "order": 1,
                "properties": {
                    "email": 21
                }
            }
        }
    }
}

Get an individual form by ID.

HTTP Request

GET /forms/ID

Response

Expected Response Code: 200

See JSON code example.

Form Properties

Name Type Description
id int ID of the form
name string Name of the form
description string/null Description of the form
alias string Used to generate the URL for the form
isPublished bool Published state
publishUp datetime/null Date/time when the form should be published
publishDown datetime/null Date/time the form should be un published
dateAdded datetime Date/time form was created
createdBy int ID of the user that created the form
createdByUser string Name of the user that created the form
dateModified datetime/null Date/time form was last modified
modifiedBy int ID of the user that last modified the form
modifiedByUser string Name of the user that last modified the form
cachedHtml string Cached HTML for the form
template string/null Name of the template used to generate the HTML
fields array Array of Field entities for the form. See below.
actions array Array of Action entities for the form. See below.

Field Properties

Name Type Description
id int ID of the field
label string Label of the field
showLabel bool Display the label of the field
alias string Alias of the field (used as the database column)
type string Field type
defaultValue string Default value
isRequired bool Field is required
validationMessage string Validation message if required field is left empty
helpMessage string Help message for the field
order int Order of the field
properties array Configured properties for the field
labelAttributes string/null Custom HTML attributes for the label
inputAttributes Custom HTML attributes for the input
containerAttributes Custom HTML attributes for the container

Action Properties

Name Type Description
id int ID of the action
type string Action type
name string Name of the action
description string/null Description of the action
order int Action order
properties array Configured properties for the action

List Forms

<?php
// ...

$forms = $formApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "forms": [
        {
            "id": 3,
            "name": "Newlsetter",
            "alias": "newsletter",
            "description": null,
            "isPublished": true,
            "publishUp": null,
            "publishDown": null,
            "dateAdded": "2015-07-15T15:06:02-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-07-20T13:11:56-05:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "category": null,
            "cachedHtml": "\n\n<script...",
            "template": null,
            "fields": {
                "26": {
                    "id": 26,
                    "label": "Email",
                    "showLabel": false,
                    "alias": "email",
                    "type": "text",
                    "defaultValue": null,
                    "isRequired": true,
                    "validationMessage": "Email is required",
                    "helpMessage": null,
                    "order": 1,
                    "properties": {
                        "placeholder": "Email address"
                    },
                    "labelAttributes": null,
                    "inputAttributes": null,
                    "containerAttributes": null
                },
                "27": {
                    "id": 27,
                    "label": "Submit",
                    "showLabel": true,
                    "alias": "submit",
                    "type": "button",
                    "defaultValue": null,
                    "isRequired": false,
                    "validationMessage": null,
                    "helpMessage": null,
                    "order": 4,
                    "properties": [],
                    "labelAttributes": null,
                    "inputAttributes": null,
                    "containerAttributes": null
                }
            },
            "actions": {
                "4": {
                    "id": 4,
                    "type": "email.send.lead",
                    "name": "Send thank you email",
                    "description": null,
                    "order": 1,
                    "properties": {
                        "email": 21
                    }
                }
            }
        }
    ]
}

HTTP Request

GET /forms

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Form.

Create Form

<?php

$data = array(
    'name' => 'test',
    'formType' => 'standalone',
    'description' => 'API test',
    'fields' => array(
        array(
            'label' => 'field name',
            'type' => 'text'
        )
    ),
    'actions' => array(
        array(
            'name' => 'action name',
            'description' => 'action desc',
            'type' => 'lead.pointschange',
            'properties' => array(
                'operator' => 'plus',
                'points' => 2
            )
        )
    )
);

$form = $formApi->create($data);

Create a new form.

HTTP Request

POST /forms/new

Post Parameters

Same as Get Form. Form fields and actions can be created/edited via the forms/actions arrays in the form array.

Response

Expected Response Code: 201

Properties

Same as Get Form.

Edit Form

<?php

$id   = 1;
$data = array(
    'name' => 'test',
    'formType' => 'standalone',
    'description' => 'API test',
    'fields' => array(
        array(
            'label' => 'A field that will be added',
            'type' => 'text'
        ),
        array(
            'id' => 1,
            'label' => 'A field that will be edited',
            'type' => 'text'
        )
    ),
    'actions' => array(
        array(
            'name' => 'action name',
            'description' => 'action desc',
            'type' => 'lead.pointschange',
            'properties' => array(
                'operator' => 'plus',
                'points' => 2
            )
        )
    )
);

// Create new a form of ID 1 is not found?
$createIfNotFound = true;

$form = $formApi->edit($id, $data, $createIfNotFound);

Edit a new form. Note that this supports PUT or PATCH depending on the desired behavior.

Make sure that whenever you want to edit a form field that you include the form field id in the request. Fields without an id are assumed to be new fields.

PUT creates a form if the given ID does not exist and clears all the form information, adds the information from the request. Form fields and actions will be also deleted if not present in the request. PATCH fails if the form with the given ID does not exist and updates the form field values with the values form the request.

HTTP Request

To edit a form and return a 404 if the form is not found:

PATCH /forms/ID/edit

To edit a form and create a new one if the form is not found:

PUT /forms/ID/edit

Post Parameters

Same as Get Form. Form fields and actions can be created/edited via the forms/actions arrays in the form array.

Response

If PUT, the expected response code is 200 if the form was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Form.

Delete Form

<?php

$form = $formApi->delete($id);

Delete a form.

HTTP Request

DELETE /forms/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Form.

Delete Form Fields

The following examples will show how to delete fields with ID 56 and 59.

<?php

$form = $formApi->deleteFields($formId, array(56, 59));

Delete a form fields.

HTTP Request

DELETE /forms/ID/fields/delete?fields[]=56&fields[]=59

Response

Expected Response Code: 200

Properties

Same as Get Form.

Delete Form Actions

The following examples will show how to delete actions with ID 56 and 59.

<?php

$form = $formApi->deleteActions($formId, array(56, 59));

Delete a form actions.

HTTP Request

DELETE /forms/ID/actions/delete?actions[]=56&actions[]=59

Response

Expected Response Code: 200

Properties

Same as Get Form.

List Form Submissions

<?php

$submissions = $formApi->getSubmissions($formId, $searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
  "total": "1",
  "submissions": [
    {
      "id": 1,
      "ipAddress": {
        "ip": "127.0.0.1"
      },
      "form": {
        "id": 25,
        "name": "test",
        "alias": "test",
        "category": null
      },
      "lead": {
        "id": 2183,
        "points": 0,
        "color": null,
        "title": null,
        "firstname": null,
        "lastname": null,
        "company": null,
        "position": null,
        "email": "test@test.test",
        "phone": null,
        "mobile": null,
        "address1": null,
        "address2": null,
        "city": null,
        "state": null,
        "zipcode": null,
        "timezone": null,
        "country": null
      },
      "trackingId": null,
      "dateSubmitted": "2017-07-17T09:52:29+00:00",
      "referer": "http:\/\/caymland.dev\/s\/forms\/preview\/25",
      "page": null,
      "results": {
        "email": "test@test.test"
      }
    }
  ]
}

HTTP Request

GET /forms/FORM_ID/submissions

Query Parameters

Name Description
formId ID of the form you want to get submissions for
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Name Type Description
id int ID of the submission
ipAddress array Associative array containing IP address of the client who made the submission
form array Simplified associative array of the form containing id, name, alias and category
lead array Associative array of the lead containing the core values as well as custom fields
dateSubmitted string Date time string holding the UTC date and time when the submission was made
referer string HTTP referer info
results array Associative array of the form fields as the keys and submission values

List Form Submissions for a contact

<?php

$submissions = $formApi->getSubmissionsForContact($formId, $contactId, $searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);

HTTP Request

GET /forms/FORM_ID/submissions/contact/CONTACT_ID

Response and properties same as Get Form Submissions. Parameters too except the ContactId was added.

Get Form Submission

<?php

//...
$form = $formApi->getSubmission($formId, $submissionId);
{
  "submission": {
    "id": 1,
    "ipAddress": {
      "ip": "127.0.0.1"
    },
    "form": {
      "id": 25,
      "name": "test",
      "alias": "test",
      "category": null
    },
    "lead": {
      "id": 2183,
      "points": 0,
      "color": null,
      "title": null,
      "firstname": null,
      "lastname": null,
      "company": null,
      "position": null,
      "email": "test@test.test",
      "phone": null,
      "mobile": null,
      "address1": null,
      "address2": null,
      "city": null,
      "state": null,
      "zipcode": null,
      "timezone": null,
      "country": null
    },
    "trackingId": null,
    "dateSubmitted": "2017-07-17T09:52:29+00:00",
    "referer": "http:\/\/caymland.dev\/s\/forms\/preview\/25",
    "page": null,
    "results": {
      "form_id": "25",
      "email": "test@test.test"
    }
  }
}

Get an individual form submission by ID.

HTTP Request

GET /forms/FORM_ID/submissions/SUBMISSION_ID

Response

Expected Response Code: 200

See JSON code example.

Form Properties

Same as Get Form Submissions.

Marketing Messages

Use this endpoint to obtain details, create, update or delete Caymland’s messages.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$messageApi = $api->newApi("messages", $auth, $apiUrl);

Get Marketing Message

<?php

//...
$message = $messageApi->get($id);
{
    "message": {
        "isPublished": true,
        "dateAdded": "2017-02-08T15:00:34+01:00",
        "dateModified": "2017-02-08T15:00:35+01:00",
        "createdBy": 1,
        "createdByUser": "John Doe",
        "modifiedBy": 1,
        "modifiedByUser": "John Doe",
        "id": 26,
        "name": "Thanks for the feedback!",
        "description": "",
        "publishUp": null,
        "publishDown": null,
        "channels": [
            {
                "id": 55,
                "channel": "email",
                "channelId": 1197,
                "channelName": "Email A",
                "isEnabled": true
            },
            {
                "id": 57,
                "channel": "notification",
                "channelId": null,
                "channelName": null,
                "isEnabled": false
            },
            {
                "id": 56,
                "channel": "sms",
                "channelId": 103,
                "channelName": "SMS A",
                "isEnabled": false
            },
            {
                "id": 91,
                "channel": "tweet",
                "channelId": null,
                "channelName": null,
                "isEnabled": false
            }
        ]
    }
}

Get an individual marketing message by ID.

HTTP Request

GET /messages/ID

Response

Expected Response Code: 200

See JSON code example.

Marketing Message Properties

Name Type Description
id int ID of the message
name string Internal name of the message
isPublished bool Published state
publishUp datetime/null Date/time when the message should be published
publishDown datetime/null Date/time the message should be un published
dateAdded datetime Date/time message was created
createdBy int ID of the user that created the message
createdByUser string Name of the user that created the message
dateModified datetime/null Date/time message was last modified
modifiedBy int ID of the user that last modified the message
modifiedByUser string Name of the user that last modified the message
channels array Array of channels configured for the marketing message

List Marketing Messages

<?php
// ...

$messages = $messageApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "messages": {
        "1": {
            "isPublished": true,
            "dateAdded": "2017-02-03T16:51:58+00:00",
            "dateModified": "2017-02-03T19:11:41+00:00",
            "createdBy": 1,
            "createdByUser": "John Doe",
            "modifiedBy": 1,
            "modifiedByUser": "John Doe",
            "id": 1,
            "name": "Live long and prosper",
            "description": null,
            "publishUp": null,
            "publishDown": null,
            "channels": [
                {
                    "id": 1,
                    "channel": "email",
                    "channelId": 44,
                    "channelName": "Email A",
                    "isEnabled": true
                },
                {
                    "id": 2,
                    "channel": "sms",
                    "channelId": 1,
                    "channelName": "SMS A",
                    "isEnabled": true
                },
                {
                    "id": 3,
                    "channel": "notification",
                    "channelId": 75,
                    "channelName": null,
                    "isEnabled": false
                }
            ]
        }
    }
}

HTTP Request

GET /messages

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Marketing Message.

Create Marketing Message

<?php 

$data = array(
    'name'        => 'Marketing Message A',
    'description' => 'This is my first message created via API.',
    'isPublished' => 1,
    'channels' => array(
        'email' => array(
            'channel' => 'email',
            'channelId' => 44,
            'isEnabled' => true,
        ),
        'sms' => array(
            'channel' => 'sms',
            'channelId' => 1,
            'isEnabled' => true,
        ),
        'notification' => array(
            'channel' => 'notification',
            'channelId' => 75,
            'isEnabled' => false,
        )
    )
);

$message = $messageApi->create($data);

Create a new message.

HTTP Request

POST /messages/new

Post Parameters

Name Type Description
id int ID of the message
name string Internal name of the message
isPublished bool Published state
publishUp datetime/null Date/time when the message should be published
publishDown datetime/null Date/time the message should be un published
channels array Array of channels

Response

Expected Response Code: 201

Properties

Same as Get Marketing Message.

Edit Marketing Message

<?php

$id   = 1;
$data = array(
    'name'        => 'New message title',
    'isPublished' => 0
);

// Create new a message of ID 1 is not found?
$createIfNotFound = true;

$message = $messageApi->edit($id, $data, $createIfNotFound);

Edit a new message. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a message if the given ID does not exist and clears all the message information, adds the information from the request. PATCH fails if the message with the given ID does not exist and updates the message field values with the values form the request.

HTTP Request

To edit a message and return a 404 if the message is not found:

PATCH /messages/ID/edit

To edit a message and create a new one if the message is not found:

PUT /messages/ID/edit

Post Parameters

Name Type Description
id int ID of the message
name string Internal name of the message
isPublished bool Published state
publishUp datetime/null Date/time when the message should be published
publishDown datetime/null Date/time the message should be un published
channels array Array of channels

Response

If PUT, the expected response code is 200 if the message was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Marketing Message.

Delete Marketing Message

<?php

$message = $messageApi->delete($id);

Delete a message.

HTTP Request

DELETE /messages/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Marketing Message.

Notes

Use this endpoint to obtain details on Caymland’s contact notes.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$noteApi  = $api->newApi("notes", $auth, $apiUrl);

Get Note

<?php

//...
$note = $noteApi->get($id);
{  
  "note":{  
    "id":39,
    "text":"Contact note created via API request",
    "type":"general",
    "dateTime":null,
    "lead":{  
      "id":1405,
      "points":0,
      "color":null,
      "fields":{  
        "core":{  
          "firstname":{  
            "id":"2",
            "label":"First Name",
            "alias":"firstname",
            "type":"text",
            "group":"core",
            "field_order":"42",
            "object":"lead",
            "value":"Note API test"
          },
          "lastname":{  
            "id":"3",
            "label":"Last Name",
            "alias":"lastname",
            "type":"text",
            "group":"core",
            "field_order":"44",
            "object":"lead",
            "value":null
          },
          [...]
        },
      }
    }
  }
}

Get an individual note by ID.

HTTP Request

GET /notes/ID

Response

Expected Response Code: 200

See JSON code example.

Note Properties

Name Type Description
id int ID of the note
lead array data of the contact
text string Note text
type string Note type
datetime datetime Date and time related to the note.

List Contact Notes

<?php

//...
$notes = $noteApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
  "total":24,
  "notes":[  
    {  
      "id":1,
      "text":"A test note",
      "type":"general",
      "dateTime":"2016-06-14T18:07:00+00:00",
      "lead":{  
        "id":1,
        "points":0,
        "color":null,
        "fields":[]
      }
    },
    [...]
  ]
}

HTTP Request

GET /notes

Response

Expected Response Code: 200

See JSON code example.

Note Properties

Name Type Description
id int ID of the note
lead array data of the contact
text string Note text
type string Note type
datetime datetime Date and time related to the note.

Create Note

<?php 

$contactID = 1;

$data = array(
    'lead' => $contactID,
    'text' => 'Note A',
    'type' => 'general',
);

$note = $noteApi->create($data);

Create a new note.

HTTP Request

POST /notes/new

Post Parameters

Name Description
text string
type string
datetime datetime

Response

Expected Response Code: 201

Properties

Same as Get Note.

Edit Note

<?php

$id   = 1;
$data = array(
    'text' => 'Note B',
    'type' => 'general',
);

// Create new a note of ID 1 is not found?
$createIfNotFound = true;

$note = $noteApi->edit($id, $data, $createIfNotFound);

Edit a new note. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a note if the given ID does not exist and clears all the note information, adds the information from the request. PATCH fails if the note with the given ID does not exist and updates the note field values with the values form the request.

HTTP Request

To edit a note and return a 404 if the note is not found:

PATCH /notes/ID/edit

To edit a note and create a new one if the note is not found:

PUT /notes/ID/edit

Post Parameters

Name Description
text string
type string
datetime datetime

Response

If PUT, the expected response code is 200 if the note was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Note.

Delete Note

<?php

$note = $noteApi->delete($id);

Delete a note.

HTTP Request

DELETE /notes/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Note.

Notifications

Use this endpoint to obtain details on Caymland’s notifications.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth        = new ApiAuth();
$auth            = $initAuth->newAuth($settings);
$apiUrl          = "https://your-caymland.com";
$api             = new CaymlandApi();
$notificationApi = $api->newApi("notifications", $auth, $apiUrl);

Get Notification

<?php

//...
$notification = $notificationApi->get($id);
{  
    "notification":{  
        "isPublished":true,
        "dateAdded":"2016-09-14T14:03:05+00:00",
        "createdBy":1,
        "createdByUser":"John Doe",
        "dateModified":"2016-09-15T08:40:46+00:00",
        "modifiedBy":1,
        "modifiedByUser":"John Doe",
        "id":1,
        "name":"The first notification",
        "heading":"The first notification Heading",
        "message":"The first notification Message",
        "url":"http:\/\/caymland.org",
        "language":"en",
        "category":null,
        "publishUp":null,
        "publishDown":null,
        "readCount":0,
        "sentCount":0
    }
}

Get an individual notification by ID.

HTTP Request

GET /notifications/ID

Response

Expected Response Code: 200

See JSON code example.

Notification Properties

Name Type Description
id int ID of the notification
name string Title of the notification
heading string Heading of the notification
message string Message of the notification
url string URL to go to when the notification is clicked
isPublished bool Published state
publishUp datetime/null Date/time when the notification should be published
publishDown datetime/null Date/time the notification should be un published
dateAdded datetime Date/time notification was created
createdBy int ID of the user that created the notification
createdByUser string Name of the user that created the notification
dateModified datetime/null Date/time notification was last modified
modifiedBy int ID of the user that last modified the notification
modifiedByUser string Name of the user that last modified the notification
language string Language locale of the notification
readCount int Total notification read count
sentCount int Unique notification sent count
category null/object Category

List Notifications

<?php
// ...

$notifications = $notificationApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
    "total":1,
    "notifications":[  
        {  
            "isPublished":true,
            "dateAdded":"2016-09-14T14:03:05+00:00",
            "createdBy":1,
            "createdByUser":"John Doe",
            "dateModified":"2016-09-15T08:40:46+00:00",
            "modifiedBy":1,
            "modifiedByUser":"John Doe",
            "id":1,
            "name":"The first notification",
            "heading":"The first notification Heading",
            "message":"The first notification Message",
            "url":"http:\/\/caymland.org",
            "language":"en",
            "category":null,
            "publishUp":null,
            "publishDown":null,
            "readCount":0,
            "sentCount":0
        }
    ]
}

HTTP Request

GET /notifications

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Notification.

Create Notification

<?php 

$data = array(
    'name'    => 'Notification A',
    'heading' => 'Hello World!'
    'message' => 'This is my first notification created via API.',
);

$notification = $notificationApi->create($data);

Create a new notification.

HTTP Request

POST /notifications/new

Post Parameters

Name Type Description
id int ID of the notification
name string Title of the notification
heading string Heading of the notification
message string Message of the notification
url string URL to go to when the notification is clicked
isPublished bool Published state
publishUp datetime/null Date/time when the notification should be published
publishDown datetime/null Date/time the notification should be un published
language string Language locale of the notification

Response

Expected Response Code: 201

Properties

Same as Get Notification.

Edit Notification

<?php

$id   = 1;
$data = array(
    'name'    => 'Notification A',
    'heading' => 'Hello World!'
    'message' => 'This is my first notification created via API.',
);

// Create new a notification of ID 1 is not found?
$createIfNotFound = true;

$notification = $notificationApi->edit($id, $data, $createIfNotFound);

Edit a new notification. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a notification if the given ID does not exist and clears all the notification information, adds the information from the request. PATCH fails if the notification with the given ID does not exist and updates the notification field values with the values form the request.

HTTP Request

To edit a notification and return a 404 if the notification is not found:

PATCH /notifications/ID/edit

To edit a notification and create a new one if the notification is not found:

PUT /notifications/ID/edit

Post Parameters

Name Type Description
id int ID of the notification
name string Title of the notification
heading string Heading of the notification
message string Message of the notification
url string URL to go to when the notification is clicked
isPublished bool Published state
publishUp datetime/null Date/time when the notification should be published
publishDown datetime/null Date/time the notification should be un published
language string Language locale of the notification

Response

If PUT, the expected response code is 200 if the notification was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Notification.

Delete Notification

<?php

$notification = $notificationApi->delete($id);

Delete a notification.

HTTP Request

DELETE /notifications/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Notification.

Pages

Use this endpoint to obtain details on Caymland’s landing pages.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$pageApi  = $api->newApi("pages", $auth, $apiUrl);

Get Page

<?php

//...
$page = $pageApi->get($id);
{
    "page": {
        "id": 3,
        "title": "Webinar Landing Page",
        "description": null,
        "isPublished": true,
        "publishUp": null,
        "publishDown": null,
        "dateAdded": "2015-07-15T15:06:02-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-20T13:11:56-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "category": "Events",
        "language": "en",
        "template": "blank",
        "customHtml": "<!DOCTYPE ...",
        "hits": 0,
        "uniqueHits": 0,
        "variantHits": 0,
        "revision": 1,
        "metaDescription": null,
        "redirectType": null,
        "redirectUrl": null,
        "translationChildren": [],
        "translationParent": null,
        "variantChildren": [],
        "variantParent": null,
        "variantSettings": [],
        "variantStartDate": null
    }
}

Get an individual page by ID.

HTTP Request

GET /pages/ID

Response

Expected Response Code: 200

See JSON code example.

Page Properties

Name Type Description
id int ID of the page
title string Title of the page
description string/null Description of the page
alias string Used to generate the URL for the page
isPublished bool Published state
publishUp datetime/null Date/time when the page should be published
publishDown datetime/null Date/time the page should be un published
dateAdded datetime Date/time page was created
createdBy int ID of the user that created the page
createdByUser string Name of the user that created the page
dateModified datetime/null Date/time page was last modified
modifiedBy int ID of the user that last modified the page
modifiedByUser string Name of the user that last modified the page
language string Language locale of the page
template string Template of the page
customHtml string Static HTML of the page
hits int Total page hit count
uniqueHits int Unique page hit count
revision int Page revision
metaDescription Meta description for the page’s
redirectType int If unpublished, redirect with 301 or 302
redirectUrl string If unpublished, the URL to redirect to if redirectType is set
translationChildren array Array of Page entities for translations of this landing page
translationParent object The parent/main page if this is a translation
variantHits Hit count since variantStartDate
variantChildren array Array of Page entities for variants of this landing page
variantParent object The parent/main page if this is a variant (A/B test)
variantSettings array The properties of the A/B test
variantStartDate datetime/null The date/time the A/B test began

List Pages

<?php
// ...

$pages = $pageApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "pages": [
        {
            "id": 3,
            "title": "Webinar Landing Page",
            "description": null,
            "isPublished": true,
            "publishUp": null,
            "publishDown": null,
            "dateAdded": "2015-07-15T15:06:02-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-07-20T13:11:56-05:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "category": "Events",
            "language": "en",
            "template": "blank",
            "hits": 0,
            "uniqueHits": 0,
            "variantHits": 0,
            "revision": 1,
            "metaDescription": null,
            "redirectType": null,
            "redirectUrl": null,
            "translationChildren": [],
            "translationParent": null,
            "variantChildren": [],
            "variantParent": null,
            "variantSettings": [],
            "variantStartDate": null
        }
    ]
}

HTTP Request

GET /pages

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Page.

Create Page

<?php

$data = array(
    'title'        => 'Page A',
    'description' => 'This is my first page created via API.',
    'isPublished' => 1
);

$page = $pageApi->create($data);

Create a new page.

HTTP Request

POST /pages/new

Post Parameters

Name Description
title Page title is the only required field
alias string
description A description of the page.
isPublished A value of 0 or 1
language string
metaDescription Meta description for the page’s
redirectType int
redirectUrl string

Response

Expected Response Code: 201

Properties

Same as Get Page.

Edit Page

<?php

$id   = 1;
$data = array(
    'title'        => 'New page title',
    'isPublished' => 0
);

// Create new a page of ID 1 is not found?
$createIfNotFound = true;

$page = $pageApi->edit($id, $data, $createIfNotFound);

Edit a new page. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a page if the given ID does not exist and clears all the page information, adds the information from the request. PATCH fails if the page with the given ID does not exist and updates the page field values with the values form the request.

HTTP Request

To edit a page and return a 404 if the page is not found:

PATCH /pages/ID/edit

To edit a page and create a new one if the page is not found:

PUT /pages/ID/edit

Post Parameters

Name Description
title Page title is the only required field
alias Name alias generated automatically if not set
description A description of the page.
isPublished A value of 0 or 1
language string
metaDescription Meta description for the page’s
redirectType int
redirectUrl string

Response

If PUT, the expected response code is 200 if the page was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Page.

Delete Page

<?php

$page = $pageApi->delete($id);

Delete a page.

HTTP Request

DELETE /pages/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Page.

Point Actions

Use this endpoint to obtain details on Caymland’s point actions.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$pointApi = $api->newApi("points", $auth, $apiUrl);

Get Point Action

<?php

//...
$point = $pointApi->get($id);
{
    "point": {
        "id": 1,
        "name": "Opens Email",
        "description": null,
        "type": "email.send",
        "isPublished": true,
        "publishUp": null,
        "publishDown": null,
        "dateAdded": "2015-07-19T00:34:11-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-19T00:41:44-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "delta": 10,
        "properties": {
            "emails": [
                35
            ]
        },
        "category": null
    }
}

Get an individual point action by ID.

HTTP Request

GET /points/ID

Response

Expected Response Code: 200

See JSON code example.

Point Action Properties

Name Type Description
id int ID of the point
name string Name of the point
description string/null Description of the point
category string Category name
type string Point action type
isPublished bool Published state
publishUp datetime/null Date/time when the point should be published
publishDown datetime/null Date/time the point should be un published
dateAdded datetime Date/time point was created
createdBy int ID of the user that created the point
createdByUser string Name of the user that created the point
dateModified datetime/null Date/time point was last modified
modifiedBy int ID of the user that last modified the point
modifiedByUser string Name of the user that last modified the point
delta int The number of points to give the lead when executing this action
properties array Configured properties for this point action

List Point Actions

<?php
// ...

$points = $pointApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "points": [
        {
            "id": 1,
            "name": "Opens Email",
            "description": null,
            "category": null
            "type": "email.send",
            "isPublished": true,
            "publishUp": null,
            "publishDown": null,
            "dateAdded": "2015-07-19T00:34:11-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": "2015-07-19T00:41:44-05:00",
            "modifiedBy": 1,
            "modifiedByUser": "Joe Smith",
            "delta": 10,
            "properties": {
                "emails": [
                    35
                ]
            }
        }
    ]
}

HTTP Request

GET /points

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Point Action.

Create Point Action

<?php 

$data = array(
    'name' => 'test',
    'delta' => 5,
    'type' => 'page.hit',
    'description' => 'created as a API test'
);

$point = $pointApi->create($data);

Create a new point action.

HTTP Request

POST /points/new

Post Parameters

Same as Get Point Action. Point Action fields and actions can be created/edited via the point actions/actions arrays in the point action array.

Response

Expected Response Code: 201

Properties

Same as Get Point Action.

Edit Point Action

<?php

$id   = 1;
$data = array(
    'name' => 'test',
    'delta' => 5,
    'type' => 'page.hit',
    'description' => 'created as a API test'
);

// Create new a point action of ID 1 is not found?
$createIfNotFound = true;

$point = $pointApi->edit($id, $data, $createIfNotFound);

Edit a new point action. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a point action if the given ID does not exist and clears all the point action inpoint actionation, adds the inpoint actionation from the request. Point Action fields and actions will be also deleted if not present in the request. PATCH fails if the point action with the given ID does not exist and updates the point action field values with the values point action the request.

HTTP Request

To edit a point action and return a 404 if the point action is not found:

PATCH /points/ID/edit

To edit a point action and create a new one if the point action is not found:

PUT /points/ID/edit

Post Parameters

Same as Get Point Action. Point Action fields and actions can be created/edited via the point actions/actions arrays in the point action array.

Response

If PUT, the expected response code is 200 if the point action was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Point Action.

Delete Point Action

<?php

$point = $pointApi->delete($id);

Delete a point action.

HTTP Request

DELETE /points/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Point Action.

Get Point Action Types

<?php

$point = $pointApi->getPointActionTypes();

Get array of available Point Action Types

HTTP Request

GET /points/actions/types

Response

Expected Response Code: 200

{  
    "pointActionTypes":{  
        "asset.download":"Downloads an asset",
        "email.send":"Is sent an email",
        "email.open":"Opens an email",
        "form.submit":"Submits a form",
        "page.hit":"Visits a landing page",
        "url.hit":"Visits specific URL"
    }
}

See JSON code example.

Point Triggers

Use this endpoint to obtain details on Caymland’s point triggers.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth   = new ApiAuth();
$auth       = $initAuth->newAuth($settings);
$apiUrl     = "https://your-caymland.com";
$api        = new CaymlandApi();
$triggerApi = $api->newApi("pointTriggers", $auth, $apiUrl);

Get Point Trigger

<?php

//...
$trigger = $triggerApi->get($id);
{
    "trigger": {
         "id": 1,
         "name": "Trigger test",
         "description": null,
         "category": null,      
         "isPublished": true,      
         "publishUp": null,
         "publishDown": null,
         "dateAdded": "2015-07-23T03:20:42-05:00",
         "createdBy": 1,
         "createdByUser": "Joe Smith",
         "dateModified": null,
         "modifiedBy": null,
         "modifiedByUser": null,l,
         "points": 10,
         "color": "ab5959",
         "events": {
             "1": {
                 "id": 1,
                 "type": "email.send",
                 "name": "Send email",
                 "description": null,
                 "order": 1,
                 "properties": {
                    "email": 21
                 }
             }
         }
     }
}

Get an individual point trigger by ID.

HTTP Request

GET /points/triggers/ID

Response

Expected Response Code: 200

See JSON code example.

Point Trigger Properties

Name Type Description
id int ID of the point
name string Name of the point
description string/null Description of the point
category string Category name
isPublished bool Published state
publishUp datetime/null Date/time when the point should be published
publishDown datetime/null Date/time the point should be un published
dateAdded datetime Date/time point was created
createdBy int ID of the user that created the point
createdByUser string Name of the user that created the point
dateModified datetime/null Date/time point was last modified
modifiedBy int ID of the user that last modified the point
modifiedByUser string Name of the user that last modified the point
points int The minimum number of points before the trigger events are executed
color string Color hex to highlight the lead with. This value does NOT include the pound sign (#)
events array Array of TriggerEvent entities for this trigger. See below.

Trigger Event Properties

Name Type Description
id int ID of the event
type string Event type
name string Name of the event
description string Description of the event
order int Event order
properties array Configured properties for the event

List Point Triggers

<?php
// ...

$triggers = $triggerApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
    "total": 1,
    "triggers": [
        {
            "id": 1,
            "name": "Trigger test",
            "description": null,
            "category": null,      
            "isPublished": true,      
            "publishUp": null,
            "publishDown": null,
            "dateAdded": "2015-07-23T03:20:42-05:00",
            "createdBy": 1,
            "createdByUser": "Joe Smith",
            "dateModified": null,
            "modifiedBy": null,
            "modifiedByUser": null,l,
            "points": 10,
            "color": "ab5959",
            "events": {
                "1": {
                    "id": 1,
                    "type": "email.send",
                    "name": "Send email",
                    "description": null,
                    "order": 1,
                    "properties": {
                        "email": 21
                    }
                }
            }
        }
    ]
}

HTTP Request

GET /points/triggers

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Point Trigger.

Create Point Trigger

<?php 

$data = array(
    'name' => 'test',
    'description' => 'created as a API test',
    'points' => 5,
    'color' => '4e5d9d',
    'trigger_existing_leads' => false,
    'events' => array(
        array(
            'name' => 'tag test event',
            'description' => 'created as a API test',
            'type' => 'lead.changetags',
            'order' => 1,
            'properties' => array(
                'add_tags' => array('tag-a'),
                'remove_tags' => array()
            )
        ),
        array(
            'name' => 'send email test event',
            'description' => 'created as a API test',
            'type' => 'email.send',
            'order' => 2,
            'properties' => array(
                'email' => 1
            )
        )
    )
);

$trigger = $triggerApi->create($data);

Create a new point trigger.

HTTP Request

POST /points/triggers/new

Post Parameters

Same as Get Point Trigger. Point Trigger events can be created/edited via the point trigger event arrays placed in the point trigger array.

Response

Expected Response Code: 201

Properties

Same as Get Point Trigger.

Edit Point Trigger

<?php

$id   = 1;
$data = array(
    'name' => 'test',
    'description' => 'created as a API test',
    'points' => 5,
    'color' => '4e5d9d',
    'trigger_existing_leads' => false,
    'events' => array(
        array(
            'name' => 'tag test event',
            'description' => 'created as a API test',
            'type' => 'lead.changetags',
            'order' => 1,
            'properties' => array(
                'add_tags' => array('tag-a'),
                'remove_tags' => array()
            )
        ),
        array(
            'name' => 'send email test event',
            'description' => 'created as a API test',
            'type' => 'email.send',
            'order' => 2,
            'properties' => array(
                'email' => 1
            )
        )
    )
);

// Create new a point trigger of ID 1 is not found?
$createIfNotFound = true;

$trigger = $triggerApi->edit($id, $data, $createIfNotFound);

Edit a new point trigger. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a point trigger if the given ID does not exist and clears all the point trigger information, adds the information from the request. Point Trigger events will be also deleted if not present in the request. PATCH fails if the point trigger with the given ID does not exist and updates the point trigger field values with the values point trigger the request.

HTTP Request

To edit a point trigger and return a 404 if the point trigger is not found:

PATCH /points/triggers/ID/edit

To edit a point trigger and create a new one if the point trigger is not found:

PUT /points/triggers/ID/edit

Post Parameters

Same as Get Point Trigger. Point Trigger events can be created/edited via the point triggers event arrays placed in the point trigger array.

Response

If PUT, the expected response code is 200 if the point trigger was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Point Trigger.

Delete Point Trigger

<?php

$trigger = $triggerApi->delete($id);

Delete a point trigger.

HTTP Request

DELETE /points/triggers/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Point Trigger.

Delete Point Trigger Events

The following examples will show how to delete events with ID 56 and 59.

<?php

$trigger = $triggerApi->deleteFields($triggerId, array(56, 59));

Delete a point trigger events.

HTTP Request

DELETE /points/triggers/ID/events/delete?events[]=56&events[]=59

Response

Expected Response Code: 200

Properties

Same as Get Point Trigger.

Get Point Trigger Event Types

<?php

$point = $pointApi->getEventTypes();

Get array of available Point Trigger Event Types

HTTP Request

GET /points/triggers/events/types

Response

Expected Response Code: 200

{  
    "eventTypes":{  
        "campaign.changecampaign":"Modify contact's campaigns",
        "lead.changelists":"Modify contact's segments",
        "lead.changetags":"Modify contact's tags",
        "plugin.leadpush":"Push contact to integration",
        "email.send":"Send an email"
    }
}

Reports

Use this endpoint to obtain details on Caymland’s reports.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth  = new ApiAuth();
$auth      = $initAuth->newAuth($settings);
$apiUrl    = "https://your-caymland.com";
$api       = new CaymlandApi();
$reportApi = $api->newApi("reports", $auth, $apiUrl);

Get Report

<?php

//...
// Simple get all with default options:
$report = $reportApi->get($id);

// Or define exactly what rows you want:
$limit    = 100;
$page     = 2;
$dateFrom = \DateTime('1 week ago');
$dateTo   = \DateTime('now');
$report   = $reportApi->get($id, $limit, $page, $dateFrom, $dateTo);
{
  "totalResults": 3990,
  "data": [
    {
      "id2": "12",
      "email1": "john@doe.email",
      "firstname1": "",
      "lastname1": ""
    },
    {
      "id2": "23",
      "email1": "johnatan@doe.email",
      "firstname1": "",
      "lastname1": ""
    },
    {
      "id2": "24",
      "email1": "johny@doe.email",
      "firstname1": "",
      "lastname1": ""
    },
    {
      "id2": "25",
      "email1": "johan@doe.email",
      "firstname1": "",
      "lastname1": ""
    },
    {
      "id2": "26",
      "email1": "jane@doe.email",
      "firstname1": "",
      "lastname1": ""
    }
  ],
  "dataColumns": {
    "address11": "l.address1",
    "address21": "l.address2",
    "attribution1": "l.attribution",
    "attribution_date1": "l.attribution_date",
    "city1": "l.city",
    "company1": "l.company",
    "companyaddress11": "comp.companyaddress1",
    "companyaddress21": "comp.companyaddress2",
    "companycity1": "comp.companycity",
    "companyemail1": "comp.companyemail",
    "companyname1": "comp.companyname",
    "companycountry1": "comp.companycountry",
    "companydescription1": "comp.companydescription",
    "companyfax1": "comp.companyfax",
    "id1": "comp.id",
    "companyphone1": "comp.companyphone",
    "companystate1": "comp.companystate",
    "companywebsite1": "comp.companywebsite",
    "companyzipcode1": "comp.companyzipcode",
    "id2": "l.id",
    "country1": "l.country",
    "custom_select1": "l.custom_select",
    "date_identified1": "l.date_identified",
    "email1": "l.email",
    "facebook1": "l.facebook",
    "fax1": "l.fax",
    "firstname1": "l.firstname",
    "foursquare1": "l.foursquare",
    "gender1": "l.gender",
    "googleplus1": "l.googleplus",
    "ip_address1": "i.ip_address",
    "instagram1": "l.instagram",
    "is_primary1": "companies_lead.is_primary",
    "lastname1": "l.lastname",
    "linkedin1": "l.linkedin",
    "mobile1": "l.mobile",
    "multiline1": "l.multiline",
    "multiselect1": "l.multiselect",
    "owner_id1": "l.owner_id",
    "first_name1": "u.first_name",
    "last_name1": "u.last_name",
    "phone1": "l.phone",
    "points1": "l.points",
    "position1": "l.position",
    "preferred_locale1": "l.preferred_locale",
    "timezone1": "l.timezone",
    "skype1": "l.skype",
    "state1": "l.state",
    "title1": "l.title",
    "twitter1": "l.twitter",
    "website1": "l.website",
    "zipcode1": "l.zipcode",
  },
  "limit": 5,
  "page": 3,
  "dateFrom": "2017-01-01T00:00:00+00:00",
  "dateTo": "2018-10-24T11:55:29+00:00",
}

Get an individual report by ID.

HTTP Request

GET /reports/ID

Or define query params like this:

GET /reports/3?dateFrom=2017-01-01&dateTo=2018-01-01&limit=5&page=3

Response

Expected Response Code: 200

See JSON code example.

Report Properties

Name Type Description
totalResults int Amount of results in the defined date range. Default date range is from 30 days ago to now
data array Holds rows of the report specific to each report data type and selected columns
dataColumns array Array of supported column names for the report data type
limit int Currently applied limit
page int Currently applied page
dateFrom datetime Currently applied date from filter
dateTo datetime Currently applied date to filter

List Reports

<?php

//...
$reports = $reportApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
  "total":8,
  "reports":[  
    {  
      "id":1,
      "name":"Contacts",
      "descriptionn":"lists all contacts",
      "system": false,
      "isScheduled": false,
      "source": "leads",
      "columns": [
        "l.id",
        "l.email",
        "l.firstname",
        "l.lastname"
      ],
      "filters": [],
      "tableOrder": [],
      "graphs": [],
      "groupBy": [],
      "settings": {
        "showGraphsAboveTable": 0,
        "showDynamicFilters": 0,
        "hideDateRangeFilter": 0
      },
      "aggregators": [],
      "scheduleUnit": null,
      "toAddress": null,
      "scheduleDay": null,
      "scheduleMonthFrequency": null
    },
    [...]
  ]
}

Returns a list of contact reports available to the user. This list is not filterable.

HTTP Request

GET /reports

Response

Expected Response Code: 200

See JSON code example.

Report Properties

Name Type Description
id int ID of the report
name string The report name
description string The report description
system boolean If true then the report is visible to all users. If false then only creator can see this report
isScheduled boolean Scheduled reports send report emails as the user defines
source string Report data source type
columns array List of selected columns for this particular report
filters array Filters applied on this report
tableOrder array Ordering applied on this report
graphs array Graphs defined for this report. API won’t return graphs
groupBy array Group by rules applied for this report
settings array Additional settings for the UI layout
aggregators array Aggregation rules applied on this report
scheduleUnit string or null Unit for the scheduler
toAddress string or null Email address for the scheduler
scheduleDay string or null Day for the scheduler
scheduleMonthFrequency string or null Frequency for the scheduler

Roles

Use this endpoint to obtain details on Caymland’s roles (administrators).

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$roleApi  = $api->newApi("roles", $auth, $apiUrl);

Get Role

<?php

//...
$role = $roleApi->get($id);
{  
  "role":{  
    "isPublished":true,
    "dateAdded":"2016-11-09T15:24:32+00:00",
    "createdBy":1,
    "createdByUser":"John Doe",
    "dateModified":null,
    "modifiedBy":null,
    "modifiedByUser":null,
    "id":13,
    "name":"API test role",
    "description":"created via AIP",
    "isAdmin":false,
    "rawPermissions":{  
      "email:emails":[  
        "viewown",
        "viewother"
      ]
    }
  }
}

Get an individual role by ID.

HTTP Request

GET /roles/ID

Response

Expected Response Code: 200

See JSON code example.

Role Properties

Name Type Description
id int ID of the contact
dateAdded datetime Date/time contact was created
createdBy int ID of the role that created the contact
createdByRole string Name of the role that created the contact
dateModified datetime/null Date/time contact was last modified
modifiedBy int ID of the role that last modified the contact
modifiedByRole string Name of the role that last modified the contact
name string Name of the role
description string Description of the role
isAdmin boolean Whether the role has full access or only some
rawPermissions array List of roles

List Contact Roles

<?php

//...
$roles = $roleApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
  "total":9,
  "roles":[  
    {  
      "isPublished":true,
      "dateAdded":"2016-08-01T11:51:32+00:00",
      "createdBy":1,
      "createdByUser":"John Doe",
      "dateModified":null,
      "modifiedBy":null,
      "modifiedByUser":null,
      "id":2,
      "name":"view email",
      "description":null,
      "isAdmin":false,
      "rawPermissions":{  
        "email:emails":[  
          "viewown",
          "viewother"
        ]
      }
    },
    [...]
  ]
}

HTTP Request

GET /roles

Response

Expected Response Code: 200

See JSON code example.

Role Properties

Name Type Description
id int ID of the contact
dateAdded datetime Date/time contact was created
createdBy int ID of the role that created the contact
createdByRole string Name of the role that created the contact
dateModified datetime/null Date/time contact was last modified
modifiedBy int ID of the role that last modified the contact
modifiedByRole string Name of the role that last modified the contact
name string Name of the role
description string Description of the role
isAdmin boolean Whether the role has full access or only some
rawPermissions array List of roles

Create Role

<?php 

$data = array(
    'name' => 'API test role',
    'description' => 'created via AIP',
    'rawPermissions' => array (
        'email:emails' => 
        array (
            'viewown',
            'viewother',
        ),
    )
);

$role = $roleApi->create($data);

Create a new role.

HTTP Request

POST /roles/new

Post Parameters

Name Description
name string
description string
isAdmin boolean
rawPermissions array

Response

Expected Response Code: 201

Properties

Same as Get Role.

Edit Role

<?php

$id   = 1;
$data = array(
    'name' => 'API test role',
    'description' => 'created via AIP',
    'rawPermissions' => array (
        'email:emails' => 
        array (
            'editown',
            'editother',
        ),
    )
);

// Create new a role of ID 1 is not found?
$createIfNotFound = true;

$role = $roleApi->edit($id, $data, $createIfNotFound);

Edit a new role. Role that this supports PUT or PATCH depending on the desired behavior.

PUT creates a role if the given ID does not exist and clears all the role information, adds the information from the request. PATCH fails if the role with the given ID does not exist and updates the role field values with the values form the request.

HTTP Request

To edit a role and return a 404 if the role is not found:

PATCH /roles/ID/edit

To edit a role and create a new one if the role is not found:

PUT /roles/ID/edit

Post Parameters

Name Description
name string
description string
isAdmin boolean
rawPermissions array

Response

If PUT, the expected response code is 200 if the role was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Role.

Delete Role

<?php

$role = $roleApi->delete($id);

Delete a role.

HTTP Request

DELETE /roles/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Role.

Segments

Use this endpoint to obtain details on Caymland’s contact segments or to manipulate contact memberships.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth   = new ApiAuth();
$auth       = $initAuth->newAuth($settings);
$apiUrl     = "https://your-caymland.com";
$api        = new CaymlandApi();
$segmentApi = $api->newApi("segments", $auth, $apiUrl);

Get Segment

<?php

//...
$segment = $segmentApi->get($id);
    "list": {
        "id": 47,
        "isPublished": 1,
        "dateAdded": "2015-07-21T12:27:12-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-21T14:12:03-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "name": "Segment A",
        "alias": "segment-a",
        "description": "This is my first segment created via API.",
        "filters": [
          {
            "glue": "and",
            "field": "city",
            "type": "text",
            "filter": "Prague",
            "display": null,
            "operator": "=",
          }
        ],
        "isGlobal": true
    }

Get an individual segment by ID.

HTTP Request

GET /segments/ID

Response

Expected Response Code: 200

See JSON code example.

Segment Properties

Name Type Description
id int ID of the segment
isPublished boolean Whether the segment is published
dateAdded datetime Date/time segment was created
createdBy int ID of the user that created the segment
createdByUser string Name of the user that created the segment
dateModified datetime/null Date/time segment was last modified
modifiedBy int ID of the user that last modified the segment
modifiedByUser string Name of the user that last modified the segment
name string Segment name
alias string Segment alias
description string Segment description
filters array Smart filters for the segment. See filter properties bellow
isGlobal boolean Whether the segment is global. 0 means only the author will see it.

Segment Filter Properties

Name Type Description
glue string How to glue the filters to others. Possible values: and, or
field string Alias of the contact or company field to based the filter on
object string Object which have the field. Possible values: ‘lead’ (for contacts), company
type string Type of the field. Possible values: 'boolean’, date (format Y-m-d), datetime (format Y-m-d H:i:s), email, country, locale, lookup, number, tel, region, select, multiselect, text, textarea, time, timezone, url
operator string Operator used for matching the values. Possible values: ’=’, !=, empty, !empty, like, !like, regexp, !regexp, startsWith, endsWith, contains

List Contact Segments

<?php

//...
$segments = $segmentApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
  "total": 13,
  "lists": [
    {
        "id": 47,
        "isPublished": 1,
        "dateAdded": "2015-07-21T12:27:12-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-21T14:12:03-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "name": "Segment A",
        "alias": "segment-a",
        "description": "This is my first segment created via API.",
        "filters": [
          {
            "glue": "and",
            "field": "city",
            "type": "text",
            "filter": "Prague",
            "display": null,
            "operator": "=",
          }
        ],
        "isGlobal": true
    },
    ...
  ]
}

Returns a list of contact segments available to the user. This list is not filterable.

HTTP Request

GET /segments

Response

Expected Response Code: 200

See JSON code example.

Segment Properties

Name Type Description
total int Count of all segments
id int ID of the segment
isPublished boolean Whether the segment is published
dateAdded datetime Date/time segment was created
createdBy int ID of the user that created the segment
createdByUser string Name of the user that created the segment
dateModified datetime/null Date/time segment was last modified
modifiedBy int ID of the user that last modified the segment
modifiedByUser string Name of the user that last modified the segment
name string Segment name
alias string Segment alias
description string Segment description
filters array Smart filters for the segment. See filter properties bellow
isGlobal boolean Whether the segment is global. 0 means only the author will see it.

Segment Filter Properties

Name Type Description
glue string How to glue the filters to others. Possible values: and, or
field string Alias of the contact or company field to based the filter on
object string Object which have the field. Possible values: 'lead’ (for contacts), company
type string Type of the field. Possible values: 'boolean’, date (format Y-m-d), datetime (format Y-m-d H:i:s), email, country, locale, lookup, number, tel, region, select, multiselect, text, textarea, time, timezone, url
operator string Operator used for matching the values. Possible values: ’=’, !=, empty, !empty, like, !like, regexp, !regexp, startsWith, endsWith, contains

Create Segment

<?php

$data = array(
    'name'        => 'Segment A',
    'alias'       => 'segment-a',
    'description' => 'This is my first segment created via API.',
    'isPublished' => 1,
    'filters' => array(
        array(
            'glue' => 'and',
            'field' => 'email',
            'object' => 'lead',
            'type' => 'email',
            'filter' => '*@gmail.com',
            'operator' => 'like',
        ),
    ),
);

$segment = $segmentApi->create($data);

Create a new segment.

HTTP Request

POST /segments/new

Post Parameters

Name Description
name Segment name is the only required field
alias Name alias generated automatically if not set
description A description of the segment.
isPublished A value of 0 or 1
isGlobal boolean
filters array

Segment Filter Properties

Name Type Description
glue string How to glue the filters to others. Possible values: and, or
field string Alias of the contact or company field to based the filter on
object string Object which have the field. Possible values: 'lead’ (for contacts), company
type string Type of the field. Possible values: 'boolean’, date (format Y-m-d), datetime (format Y-m-d H:i:s), email, country, locale, lookup, number, tel, region, select, multiselect, text, textarea, time, timezone, url
operator string Operator used for matching the values. Possible values: ’=’, !=, empty, !empty, like, !like, regexp, !regexp, startsWith, endsWith, contains

Response

Expected Response Code: 201

Properties

Same as Get Segment.

Edit Segment

<?php

$id   = 1;
$data = array(
    'name'        => 'New segment name',
    'isPublished' => 0
);

// Create new a segment of ID 1 is not found?
$createIfNotFound = true;

$segment = $segmentApi->edit($id, $data, $createIfNotFound);

Edit a new segment. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a segment if the given ID does not exist and clears all the segment information, adds the information from the request. PATCH fails if the segment with the given ID does not exist and updates the segment field values with the values form the request.

HTTP Request

To edit a segment and return a 404 if the segment is not found:

PATCH /segments/ID/edit

To edit a segment and create a new one if the segment is not found:

PUT /segments/ID/edit

Post Parameters

Name Description
name Segment name is the only required field
alias Name alias generated automatically if not set
description A description of the segment.
isPublished A value of 0 or 1
isGlobal boolean
filters array

Segment Filter Properties

Name Type Description
glue string How to glue the filters to others. Possible values: and, or
field string Alias of the contact or company field to based the filter on
object string Object which have the field. Possible values: 'lead’ (for contacts), company
type string Type of the field. Possible values: 'boolean’, date (format Y-m-d), datetime (format Y-m-d H:i:s), email, country, locale, lookup, number, tel, region, select, multiselect, text, textarea, time, timezone, url
operator string Operator used for matching the values. Possible values: ’=’, !=, empty, !empty, like, !like, regexp, !regexp, startsWith, endsWith, contains

Response

If PUT, the expected response code is 200 if the segment was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Segment.

Delete Segment

<?php

$segment = $segmentApi->delete($id);

Delete a segment.

HTTP Request

DELETE /segments/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Segment.

Add Contact to a Segment

<?php

//...
$response = $segmentApi->addContact($segmentId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually add a contact to a specific segment.

HTTP Request

POST /segments/SEGMENT_ID/contact/CONTACT_ID/add

Response

Expected Response Code: 200

See JSON code example.

Add Contacts to a Segment

<?php

//...
$contactIds = ['ids'=>[ 1, 45, 39]];
$response = $segmentApi->addContact($segmentId, $contactIds);
if (!isset($response['success'])) {
    // handle error
}
{
     "success":true,
     "details":{
        "1" :{"success":true},
        "45":{"success":true},
        "39":{"success":false}
     }
}

Manually add contacts to a specific segment.

HTTP Request

POST /segments/SEGMENT_ID/contacts/add

Response

Expected Response Code: 200

See JSON code example.

Remove Contact from a Segment

<?php

//...
$response = $segmentApi->removeContact($segmentId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually remove a contact to a specific segment.

HTTP Request

POST /segments/SEGMENT_ID/contact/CONTACT_ID/remove

Response

Expected Response Code: 200

See JSON code example.

Text messages

Use this endpoint to obtain details on Caymland’s Text Messages (SMSes).

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$smsApi   = $api->newApi("smses", $auth, $apiUrl);

Get Text message

<?php

//...
$sms = $smsApi->get($id);
{  
    "sms":{  
        "isPublished":true,
        "dateAdded":"2016-09-14T12:14:45+00:00",
        "createdBy":1,
        "createdByUser":"John Doe",
        "dateModified":null,
        "modifiedBy":null,
        "modifiedByUser":null,
        "id":1,
        "name":"Message A",
        "message":"Hello",
        "language":"en",
        "category":null,
        "publishUp":null,
        "publishDown":null,
        "sentCount":0
    }
}

Get an individual sms by ID.

HTTP Request

GET /smses/ID

Response

Expected Response Code: 200

See JSON code example.

Text message Properties

Name Type Description
id int ID of the sms
name string Title of the sms
message string Message of the sms
isPublished bool Published state
publishUp datetime/null Date/time when the sms should be published
publishDown datetime/null Date/time the sms should be un published
dateAdded datetime Date/time sms was created
createdBy int ID of the user that created the sms
createdByUser string Name of the user that created the sms
dateModified datetime/null Date/time sms was last modified
modifiedBy int ID of the user that last modified the sms
modifiedByUser string Name of the user that last modified the sms
language string Language locale of the sms
sentCount int How many times the SMS was sent

List Text messages

<?php
// ...

$smses = $smsApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
    "total":1,
    "smses":[  
        {  
            "isPublished":true,
            "dateAdded":"2016-09-14T12:14:45+00:00",
            "createdBy":1,
            "createdByUser":"John Doe",
            "dateModified":null,
            "modifiedBy":null,
            "modifiedByUser":null,
            "id":1,
            "name":"Message A",
            "message":"Hello",
            "language":"en",
            "category":null,
            "publishUp":null,
            "publishDown":null,
            "sentCount":0
        }
    ]
}

HTTP Request

GET /smses

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Text message.

Create Text message

<?php 

$data = array(
    'name'        => 'Text message A',
    'message' => 'This is my first sms created via API.',
    'isPublished' => 1
);

$sms = $smsApi->create($data);

Create a new sms.

HTTP Request

POST /smses/new

Post Parameters

Name Type Description
id int ID of the sms
name string Title of the sms
message string Message of the sms
isPublished bool Published state
publishUp datetime/null Date/time when the sms should be published
publishDown datetime/null Date/time the sms should be un published
dateAdded datetime Date/time sms was created
createdBy int ID of the user that created the sms
createdByUser string Name of the user that created the sms
dateModified datetime/null Date/time sms was last modified
modifiedBy int ID of the user that last modified the sms
modifiedByUser string Name of the user that last modified the sms
language string Language locale of the sms
sentCount int How many times the SMS was sent

Response

Expected Response Code: 201

Properties

Same as Get Text message.

Edit Text message

<?php

$id   = 1;
$data = array(
    'name'        => 'New sms name',
    'isPublished' => 0
);

// Create new a sms of ID 1 is not found?
$createIfNotFound = true;

$sms = $smsApi->edit($id, $data, $createIfNotFound);

Edit a new sms. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a sms if the given ID does not exist and clears all the sms information, adds the information from the request. PATCH fails if the sms with the given ID does not exist and updates the sms field values with the values form the request.

HTTP Request

To edit a sms and return a 404 if the sms is not found:

PATCH /smses/ID/edit

To edit a sms and create a new one if the sms is not found:

PUT /smses/ID/edit

Post Parameters

Name Type Description
id int ID of the sms
name string Title of the sms
message string Message of the sms
isPublished bool Published state
publishUp datetime/null Date/time when the sms should be published
publishDown datetime/null Date/time the sms should be un published
language string Language locale of the sms

Response

If PUT, the expected response code is 200 if the sms was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Text message.

Delete Text message

<?php

$sms = $smsApi->delete($id);

Delete a sms.

HTTP Request

DELETE /smses/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Text message.

Send SMS to Contact

<?php

$sms = $smsApi->sendToContact($smsId, $contactId);

Send a predefined sms to existing contact.

HTTP Request

GET /smses/ID/contact/CONTACT_ID/send

Response

Expected Response Code: 200

Properties json { "success": 1, "status": "Delivered" }

Stages

Use this endpoint to obtain details on Caymland’s contact stages.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$stageApi = $api->newApi("stages", $auth, $apiUrl);

Get Stage

<?php

//...
$stage = $stageApi->get($id);
    "stage": {
        "id": 47,
        "isPublished": 1,
        "dateAdded": "2015-07-21T12:27:12-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-21T14:12:03-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "name": "Stage A",
        "category": null,
        "description": "This is my first stage created via API.",
        "weight": 0,
        "publishUp": "2015-07-21T14:12:03-05:00",
        "publishDown": "2015-07-21T14:12:03-05:00"
    }

Get an individual stage by ID.

HTTP Request

GET /stages/ID

Response

Expected Response Code: 200

See JSON code example.

Stage Properties

Name Type Description
id int ID of the stage
isPublished boolean Whether the stage is published
dateAdded datetime Date/time stage was created
createdBy int ID of the user that created the stage
createdByUser string Name of the user that created the stage
dateModified datetime/null Date/time stage was last modified
modifiedBy int ID of the user that last modified the stage
modifiedByUser string Name of the user that last modified the stage
name string Stage name
category int Stage category ID
description string Stage description
weight int Stage’s weight
publishUp datetime Date/time stage should be published
publishDown datetime Date/time stage should be unpublished

List Contact Stages

<?php

//...
$stages = $stageApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
  "total": 4,
  "stages": [
    {
        "id": 47,
        "isPublished": 1,
        "dateAdded": "2015-07-21T12:27:12-05:00",
        "createdBy": 1,
        "createdByUser": "Joe Smith",
        "dateModified": "2015-07-21T14:12:03-05:00",
        "modifiedBy": 1,
        "modifiedByUser": "Joe Smith",
        "name": "Stage A",
        "category": null,
        "description": "This is my first stage created via API.",
        "weight": 0,
        "publishUp": "2015-07-21T14:12:03-05:00",
        "publishDown": "2015-07-21T14:12:03-05:00"
    },
    ...
  ]
}

HTTP Request

GET /stages

Response

Expected Response Code: 200

See JSON code example.

Stage Properties

Name Type Description
total int Count of all stages
id int ID of the stage
isPublished boolean Whether the stage is published
dateAdded datetime Date/time stage was created
createdBy int ID of the user that created the stage
createdByUser string Name of the user that created the stage
dateModified datetime/null Date/time stage was last modified
modifiedBy int ID of the user that last modified the stage
modifiedByUser string Name of the user that last modified the stage
name string Stage name
category int Stage category ID
description string Stage description
weight int Stage’s weight
publishUp datetime Date/time stage should be published
publishDown datetime Date/time stage should be unpublished

Create Stage

<?php 

$data = array(
    'name'        => 'Stage A',
    'weight'      => 5,
    'description' => 'This is my first stage created via API.',
    'isPublished' => 1
);

$stage = $stageApi->create($data);

Create a new stage.

HTTP Request

POST /stages/new

Post Parameters

Name Description
name Stage name is the only required field
weight int
description A description of the stage.
isPublished A value of 0 or 1

Response

Expected Response Code: 201

Properties

Same as Get Stage.

Edit Stage

<?php

$id   = 1;
$data = array(
    'name'        => 'New stage name',
    'isPublished' => 0
);

// Create new a stage of ID 1 is not found?
$createIfNotFound = true;

$stage = $stageApi->edit($id, $data, $createIfNotFound);

Edit a new stage. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a stage if the given ID does not exist and clears all the stage information, adds the information from the request. PATCH fails if the stage with the given ID does not exist and updates the stage field values with the values form the request.

HTTP Request

To edit a stage and return a 404 if the stage is not found:

PATCH /stages/ID/edit

To edit a stage and create a new one if the stage is not found:

PUT /stages/ID/edit

Post Parameters

Name Description
name Stage name is the only required field
alias Name alias generated automatically if not set
description A description of the stage.
isPublished A value of 0 or 1
weight int

Response

If PUT, the expected response code is 200 if the stage was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Stage.

Delete Stage

<?php

$stage = $stageApi->delete($id);

Delete a stage.

HTTP Request

DELETE /stages/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Stage.

Add Contact to a Stage

<?php

//...
$response = $stageApi->addContact($stageId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually add a contact to a specific stage.

HTTP Request

POST /stages/STAGE_ID/contact/CONTACT_ID/add

Response

Expected Response Code: 200

See JSON code example.

Remove Contact from a Stage

<?php

//...
$response = $stageApi->removeContact($stageId, $contactId);
if (!isset($response['success'])) {
    // handle error
}
{
    "success": true
}

Manually remove a contact from a specific stage.

HTTP Request

POST /stages/STAGE_ID/contact/CONTACT_ID/remove

Response

Expected Response Code: 200

See JSON code example.

Stats

This endpoint is useful for downloading a full statistical table.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$statsApi = $api->newApi("stats", $auth, $apiUrl);

Get Available Stat Tables

<?php

//...
$tables = $statsApi->get();
{
    "availableTables": [
        "asset_downloads",
        "audit_log",
        "campaign_lead_event_log",
        "campaign_leads",
        "channel_url_trackables",
        "companies_leads",
        "dynamic_content_lead_data",
        "dynamic_content_stats",
        "email_stats",
        "email_stats_devices",
        "focus_stats",
        "form_submissions",
        "ip_addresses",
        "lead_categories",
        "lead_companies_change_log",
        "lead_devices",
        "lead_donotcontact",
        "lead_event_log",
        "lead_frequencyrules",
        "lead_lists_leads",
        "lead_points_change_log",
        "lead_stages_change_log",
        "lead_utmtags",
        "page_hits",
        "page_redirects",
        "plugin_citrix_events",
        "point_lead_action_log",
        "point_lead_event_log",
        "push_notification_stats",
        "sms_message_stats",
        "stage_lead_action_log",
        "tweet_stats",
        "video_hits",
        "webhook_logs"
    ],
    "tableColumns": {
        "asset_downloads": [
            "asset_id",
            "code",
            "date_download",
            "email_id",
            "id",
            "ip_id",
            "lead_id",
            "referer",
            "source",
            "source_id",
            "tracking_id"
        ],
        "audit_log": [
            "action",
            "bundle",
            "date_added",
            "details",
            "id",
            "ip_address",
            "object",
            "object_id",
            "user_id",
            "user_name"
        ],
        "campaign_lead_event_log": [
            "campaign_id",
            "channel",
            "channel_id",
            "date_triggered",
            "event_id",
            "id",
            "ip_id",
            "is_scheduled",
            "lead_id",
            "metadata",
            "non_action_path_taken",
            "rotation",
            "system_triggered",
            "trigger_date"
        ],
        "campaign_leads": [
            "campaign_id",
            "date_added",
            "date_last_exited",
            "lead_id",
            "manually_added",
            "manually_removed",
            "rotation"
        ],
        "channel_url_trackables": [
            "channel",
            "channel_id",
            "hits",
            "redirect_id",
            "unique_hits"
        ],
        "companies_leads": [
            "company_id",
            "date_added",
            "is_primary",
            "lead_id",
            "manually_added",
            "manually_removed"
        ],
        "dynamic_content_lead_data": [
            "date_added",
            "dynamic_content_id",
            "id",
            "lead_id",
            "slot"
        ],
        "dynamic_content_stats": [
            "date_sent",
            "dynamic_content_id",
            "id",
            "last_sent",
            "lead_id",
            "sent_count",
            "sent_details",
            "source",
            "source_id",
            "tokens"
        ],
        "email_stats": [
            "copy_id",
            "date_read",
            "date_sent",
            "email_address",
            "email_id",
            "id",
            "ip_id",
            "is_failed",
            "is_read",
            "last_opened",
            "lead_id",
            "list_id",
            "open_count",
            "open_details",
            "retry_count",
            "source",
            "source_id",
            "tokens",
            "tracking_hash",
            "viewed_in_browser"
        ],
        "email_stats_devices": [
            "date_opened",
            "device_id",
            "id",
            "ip_id",
            "stat_id"
        ],
        "focus_stats": [
            "date_added",
            "focus_id",
            "id",
            "lead_id",
            "type",
            "type_id"
        ],
        "form_submissions": [
            "date_submitted",
            "form_id",
            "id",
            "ip_id",
            "lead_id",
            "page_id",
            "referer",
            "tracking_id"
        ],
        "ip_addresses": [
            "id",
            "ip_address",
            "ip_details"
        ],
        "lead_categories": [
            "category_id",
            "date_added",
            "id",
            "lead_id",
            "manually_added",
            "manually_removed"
        ],
        "lead_companies_change_log": [
            "action_name",
            "company_id",
            "date_added",
            "event_name",
            "id",
            "lead_id",
            "type"
        ],
        "lead_devices": [
            "client_info",
            "date_added",
            "device",
            "device_brand",
            "device_fingerprint",
            "device_model",
            "device_os_name",
            "device_os_platform",
            "device_os_shortname",
            "device_os_version",
            "id",
            "lead_id"
        ],
        "lead_donotcontact": [
            "channel",
            "channel_id",
            "comments",
            "date_added",
            "id",
            "lead_id",
            "reason"
        ],
        "lead_event_log": [
            "action",
            "bundle",
            "date_added",
            "id",
            "lead_id",
            "object",
            "object_id",
            "properties",
            "user_id",
            "user_name"
        ],
        "lead_frequencyrules": [
            "channel",
            "date_added",
            "frequency_number",
            "frequency_time",
            "id",
            "lead_id",
            "pause_from_date",
            "pause_to_date",
            "preferred_channel"
        ],
        "lead_lists_leads": [
            "date_added",
            "leadlist_id",
            "lead_id",
            "manually_added",
            "manually_removed"
        ],
        "lead_points_change_log": [
            "action_name",
            "date_added",
            "delta",
            "event_name",
            "id",
            "ip_id",
            "lead_id",
            "type"
        ],
        "lead_stages_change_log": [
            "action_name",
            "date_added",
            "event_name",
            "id",
            "lead_id",
            "stage_id"
        ],
        "lead_utmtags": [
            "date_added",
            "id",
            "lead_id",
            "query",
            "referer",
            "remote_host",
            "url",
            "user_agent",
            "utm_campaign",
            "utm_content",
            "utm_medium",
            "utm_source",
            "utm_term"
        ],
        "page_hits": [
            "browser_languages",
            "city",
            "code",
            "country",
            "date_hit",
            "date_left",
            "device_id",
            "email_id",
            "id",
            "ip_id",
            "isp",
            "lead_id",
            "organization",
            "page_id",
            "page_language",
            "query",
            "redirect_id",
            "referer",
            "region",
            "remote_host",
            "source",
            "source_id",
            "tracking_id",
            "url",
            "url_title",
            "user_agent"
        ],
        "page_redirects": [
            "checked_out",
            "checked_out_by",
            "checked_out_by_user",
            "created_by",
            "created_by_user",
            "date_added",
            "date_modified",
            "hits",
            "id",
            "is_published",
            "modified_by",
            "modified_by_user",
            "redirect_id",
            "unique_hits",
            "url"
        ],
        "plugin_citrix_events": [
            "email",
            "event_date",
            "event_desc",
            "event_name",
            "event_type",
            "id",
            "lead_id",
            "product"
        ],
        "point_lead_action_log": [
            "date_fired",
            "ip_id",
            "lead_id",
            "point_id"
        ],
        "point_lead_event_log": [
            "date_fired",
            "event_id",
            "ip_id",
            "lead_id"
        ],
        "push_notification_stats": [
            "click_count",
            "click_details",
            "date_clicked",
            "date_read",
            "date_sent",
            "id",
            "ip_id",
            "is_clicked",
            "last_clicked",
            "lead_id",
            "list_id",
            "notification_id",
            "retry_count",
            "source",
            "source_id",
            "tokens",
            "tracking_hash"
        ],
        "sms_message_stats": [
            "date_sent",
            "id",
            "ip_id",
            "lead_id",
            "list_id",
            "sms_id",
            "source",
            "source_id",
            "tokens",
            "tracking_hash"
        ],
        "stage_lead_action_log": [
            "date_fired",
            "ip_id",
            "lead_id",
            "stage_id"
        ],
        "tweet_stats": [
            "date_sent",
            "favorite_count",
            "handle",
            "id",
            "is_failed",
            "lead_id",
            "response_details",
            "retry_count",
            "retweet_count",
            "source",
            "source_id",
            "tweet_id",
            "twitter_tweet_id"
        ],
        "video_hits": [
            "browser_languages",
            "channel",
            "channel_id",
            "city",
            "code",
            "country",
            "date_hit",
            "date_left",
            "duration",
            "guid",
            "id",
            "ip_id",
            "isp",
            "lead_id",
            "organization",
            "page_language",
            "query",
            "referer",
            "region",
            "remote_host",
            "time_watched",
            "url",
            "user_agent"
        ],
        "webhook_logs": [
            "date_added",
            "id",
            "note",
            "runtime",
            "status_code",
            "webhook_id"
        ]
    }
}

HTTP Request

GET /stats

Response

Expected Response Code: 200

See JSON code example.

Stats Properties

Name Type Description
availableTables array List of available tables which can be used in this endpoint
stats array An empty array of stats, because no table was defined

Get Stats from a table

<?php
// Example setup variables:
$table = 'asset_downloads';
$start = 0;
$limit = 50;
$order = array(
    array(
      'col' => 'id',
      'dir' => 'asc'
    )
);
$where = array(
    array(
      'col' => 'id',
      'expr' => 'gt',
      'val' => 3,
    )
);

$stats = $statsApi->get($table, $start, $limit, $order, $where);
{
  "stats":[
    {
      "id":"1",
      "asset_id":"1",
      "ip_id":"1",
      "lead_id":"31",
      "date_download":"2016-06-30 08:51:22",
      "code":"200",
      "tracking_id":"b3259e7709f35b7428b7bffcbb3d1d713ac1526c"
    },
    [...]
  ]
}

HTTP Request

GET /stats/TABLE

Request Properties

Name Type Description
start int Which row to start on
limit int How many rows to return
order array An array of arrays which contain ordering (example above)
where array An array of arrays which contain where conditions (example above). As the expr param can be used most of the methods from DBAL Doctrine where methods.

If using cURL, a query parameter may look something like where%5B0%5D%5Bcol%5D=id&where%5B0%5D%5Bexpr%5D=eq&where%5B0%5D%5Bval%5D=3 which is the equivalent to the following:

array(
    array(
        'col'  => 'id',
        'expr' => 'eq',
        'val'  => 3,
    )
);

Response

Expected Response Code: 200

See JSON code example.

Stats Properties

Different for every table. It simply returns rows or requested table.

Tags

Use this endpoint to obtain details on Caymland’s tags. Implemented in Caymland 2.12.0.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth        = new ApiAuth();
$auth            = $initAuth->newAuth($settings);
$apiUrl          = "https://your-caymland.com";
$api             = new CaymlandApi();
$tagApi = $api->newApi("tags", $auth, $apiUrl);

Get Tag

<?php

//...
$tag = $tagApi->get($id);
{  
    "tag": {
        "id": 34,
        "tag": "tagA",
    }
}

Get an individual tag by ID.

HTTP Request

GET /tags/ID

Response

Expected Response Code: 200

See JSON code example.

Tag Properties

Name Type Description
id int ID of the tag
tag string Title of the tag

List Tags

<?php
// ...

$tags = $tagApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
    "total":1,
    "tags":[  
        {
            "id": 34,
            "tag": "tagA",
        }
    ]
}

HTTP Request

GET /tags

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Tag.

Create Tag

<?php

$data = array(
    'tag' => 'Tag A',
);

$tag = $tagApi->create($data);

Create a new tag.

HTTP Request

POST /tags/new

Post Parameters

Name Type Description
id int ID of the tag
tag string Title of the tag

Response

Expected Response Code: 201

Properties

Same as Get Tag.

Edit Tag

<?php

$id   = 1;
$data = array(
    'tag' => 'Tag B',
);

// Create new a tag of ID 1 is not found?
$createIfNotFound = true;

$tag = $tagApi->edit($id, $data, $createIfNotFound);

Edit a new tag. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a tag if the given ID does not exist and clears all the tag information, adds the information from the request. PATCH fails if the tag with the given ID does not exist and updates the tag field values with the values form the request.

HTTP Request

To edit a tag and return a 404 if the tag is not found:

PATCH /tags/ID/edit

To edit a tag and create a new one if the tag is not found:

PUT /tags/ID/edit

Post Parameters

Name Type Description
id int ID of the tag
tag string Title of the tag

Response

If PUT, the expected response code is 200 if the tag was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Tag.

Delete Tag

<?php

$tag = $tagApi->delete($id);

Delete a tag.

HTTP Request

DELETE /tags/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Tag.

Themes

This endpoint is useful for working with Caymland themes.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$themesApi = $api->newApi("themes", $auth, $apiUrl);

Get theme

Returns directly the zip file in the response with the application/zip header on success or a JSON response body with error messages on fail. The PHP API library will save the zip file to the system temporary directory and provides you with the path.

<?php
$response = $themesApi->get($themeName);
{
    "file": "/absolute/path/to/the/system/temp/dir/with/the/theme/zip/file"
}

HTTP Request

GET /themes/THEME_NAME

Response

Expected Response Code: 200

Set Temporary File Path

Changes the default temporary directory where the zip file is created. The directory is created if it does not exist.

<?php
$themesApi->setTemporaryFilePath("/absolute/path/to/a/different/temp/dir");
$response = $themesApi->get($themeName);
{
    "file": "/absolute/path/to/a/different/temp/dir/zipfile"
}

Get List of themes

Lists all installed themes with the detailes stored in their config.json files.

<?php
$response = $themesApi->getList();
{
    "themes": {
        "blank": {
            "name": "Blank",
            "key": "blank",
            "config": {
                "name": "Blank",
                "author": "Caymland team",
                "authorUrl": "https:\/\/caymland.org",
                "features": [
                    "page",
                    "email",
                    "form"
                ]
            }
        },
        ...
    }
}

HTTP Request

GET /themes

Response

Expected Response Code: 200

See JSON code example.

Response Properties

Name Type Description
themes array List of installed themes and their configs

Create Theme

Creates a new theme or updates an existing one (based on the file name) from provided zip file.

<?php
$data = array(
    'file' => dirname(__DIR__).'/'.'mytheme.zip' // Must be a path to an existing file
);

$response = $themeApi->create($data);

The file is sent via regular POST files array like a browser sends it during file upload.

HTTP Request

POST /themes/new

Response

Expected Response Code: 200 json { "success": true }

Delete File

<?php
$response = $themeApi->delete($themeName);

Delete a theme. The stock themes cannot be deleted

HTTP Request

DELETE /themes/THEME_NAME/delete

Response

Expected Response Code: 200 json { "success": true }

Tweets

Use this endpoint to obtain details on Caymland’s tweets. Implemented in Caymland 2.8.0.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth        = new ApiAuth();
$auth            = $initAuth->newAuth($settings);
$apiUrl          = "https://your-caymland.com";
$api             = new CaymlandApi();
$tweetApi = $api->newApi("tweets", $auth, $apiUrl);

Get Tweet

<?php

//...
$tweet = $tweetApi->get($id);
{  
    "tweet": {
        "isPublished": true,
        "dateAdded": "2017-02-03T17:51:58+01:00",
        "dateModified": "2017-03-28T11:03:03+02:00",
        "createdBy": 1,
        "createdByUser": "John Doe",
        "modifiedBy": 1,
        "modifiedByUser": "John Doe",
        "id": 1,
        "name": "Thank you tweet",
        "text": "Hi {twitter_handle}\n\nThanks for ...",
        "language": "en",
        "category": {
            "createdByUser": "John Doe",
            "modifiedByUser": null,
            "id": 185,
            "title": "Thank you tweets",
            "alias": "thank-you-tweets",
            "description": null,
            "color": "244bc9",
            "bundle": "global"
        },
        "tweetId": null,
        "mediaId": null,
        "mediaPath": null,
        "sentCount": 3,
        "favoriteCount": 0,
        "retweetCount": 0,
        "description": "Used in the Product A campaign 1"
    }
}

Get an individual tweet by ID.

HTTP Request

GET /tweets/ID

Response

Expected Response Code: 200

See JSON code example.

Tweet Properties

Name Type Description
id int ID of the tweet
name string Title of the tweet
text string Message of the tweet
isPublished bool Published state
publishUp datetime/null Date/time when the tweet should be published
publishDown datetime/null Date/time the tweet should be un published
dateAdded datetime Date/time tweet was created
createdBy int ID of the user that created the tweet
createdByUser string Name of the user that created the tweet
dateModified datetime/null Date/time tweet was last modified
modifiedBy int ID of the user that last modified the tweet
modifiedByUser string Name of the user that last modified the tweet
language string Language locale of the tweet
category null/object Category

List Tweets

<?php
// ...

$tweets = $tweetApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
    "total":1,
    "tweets":[  
        {
            "isPublished": true,
            "dateAdded": "2017-02-03T17:51:58+01:00",
            "dateModified": "2017-03-28T11:03:03+02:00",
            "createdBy": 1,
            "createdByUser": "John Doe",
            "modifiedBy": 1,
            "modifiedByUser": "John Doe",
            "id": 1,
            "name": "Thank you tweet",
            "text": "Hi {twitter_handle}\n\nThanks for ...",
            "language": "en",
            "category": null,
            "tweetId": null,
            "mediaId": null,
            "mediaPath": null,
            "favoriteCount": 0,
            "retweetCount": 0,
            "description": "Used in the Product A campaign 1"
        }
    ]
}

HTTP Request

GET /tweets

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Tweet.

Create Tweet

<?php 

$data = array(
    'name'    => 'Tweet A',
    'heading' => 'Hello World!'
    'message' => 'This is my first tweet created via API.',
);

$tweet = $tweetApi->create($data);

Create a new tweet.

HTTP Request

POST /tweets/new

Post Parameters

Name Type Description
id int ID of the tweet
name string Title of the tweet
text string Message of the tweet
url string URL to go to when the tweet is clicked
isPublished bool Published state
publishUp datetime/null Date/time when the tweet should be published
publishDown datetime/null Date/time the tweet should be un published
language string Language locale of the tweet

Response

Expected Response Code: 201

Properties

Same as Get Tweet.

Edit Tweet

<?php

$id   = 1;
$data = array(
    'name' => 'Tweet A',
    'text' => 'This is my first tweet created via API.',
);

// Create new a tweet of ID 1 is not found?
$createIfNotFound = true;

$tweet = $tweetApi->edit($id, $data, $createIfNotFound);

Edit a new tweet. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a tweet if the given ID does not exist and clears all the tweet information, adds the information from the request. PATCH fails if the tweet with the given ID does not exist and updates the tweet field values with the values form the request.

HTTP Request

To edit a tweet and return a 404 if the tweet is not found:

PATCH /tweets/ID/edit

To edit a tweet and create a new one if the tweet is not found:

PUT /tweets/ID/edit

Post Parameters

Name Type Description
id int ID of the tweet
name string Title of the tweet
text string Message of the tweet
url string URL to go to when the tweet is clicked
isPublished bool Published state
publishUp datetime/null Date/time when the tweet should be published
publishDown datetime/null Date/time the tweet should be un published
language string Language locale of the tweet

Response

If PUT, the expected response code is 200 if the tweet was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Tweet.

Delete Tweet

<?php

$tweet = $tweetApi->delete($id);

Delete a tweet.

HTTP Request

DELETE /tweets/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get Tweet.

Users

Use this endpoint to obtain details on Caymland’s users (administrators).

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth = new ApiAuth();
$auth     = $initAuth->newAuth($settings);
$apiUrl   = "https://your-caymland.com";
$api      = new CaymlandApi();
$userApi  = $api->newApi("users", $auth, $apiUrl);

Get User

<?php

//...
$user = $userApi->get($id);
{  
  "user":{  
    "isPublished":true,
    "dateAdded":"2016-11-09T14:23:44+00:00",
    "createdBy":1,
    "createdByUser":"John Doe",
    "dateModified":null,
    "modifiedBy":null,
    "modifiedByUser":null,
    "id":6,
    "username":"apitest",
    "firstName":"John",
    "lastName":"Doe",
    "email":"john@doe.com",
    "position":null,
    "role":{  
      "createdByUser":null,
      "modifiedByUser":null,
      "id":1,
      "name":"Administrator",
      "description":"Full system access",
      "isAdmin":true,
      "rawPermissions":null
    },
    "timezone":null,
    "locale":null,
    "lastLogin":null,
    "lastActive":null,
    "onlineStatus":"offline",
    "signature":null
  }
}

Get an individual user by ID.

HTTP Request

GET /users/ID

Response

Expected Response Code: 200

See JSON code example.

User Properties

Name Type Description
id int ID of the contact
dateAdded datetime Date/time contact was created
createdBy int ID of the user that created the contact
createdByUser string Name of the user that created the contact
dateModified datetime/null Date/time contact was last modified
lastActive datetime/null Date/time when the user last active
modifiedBy int ID of the user that last modified the contact
modifiedByUser string Name of the user that last modified the contact
username string Username which can be used for log in to Caymland.
firstName string First Name of the user
lastName string Last Name of the user
email string Email of the user
position string User’s position title
role array List of roles of the user
timezone string Timezone of the user
onlineStatus string Online status of the user
signature string Signature of the user which can be used in the emails

List Contact Users

<?php

//...
$users = $userApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{  
  "total":2,
  "users":[  
    {  
      "isPublished":true,
      "dateAdded":"2016-08-01T11:52:15+00:00",
      "createdBy":null,
      "createdByUser":" ",
      "dateModified":"2016-09-26T15:02:32+00:00",
      "modifiedBy":null,
      "modifiedByUser":" ",
      "id":2,
      "username":"test",
      "firstName":"John",
      "lastName":"Doe",
      "email":"john@doe.com",
      "position":null,
      "role":{  
        "createdByUser":"John Doe",
        "modifiedByUser":null,
        "id":4,
        "name":"edit own contacts",
        "description":null,
        "isAdmin":false,
        "rawPermissions":{  
          "lead:leads":[  
            "viewown",
            "editown",
            "create",
            "deleteown"
          ],
          "lead:lists":[  
            "viewother"
          ]
        }
      },
      "timezone":null,
      "locale":null,
      "lastLogin":"2016-09-26T15:03:25+00:00",
      "lastActive":"2016-09-26T15:19:15+00:00",
      "onlineStatus":"offline",
      "signature":"Best regards,&#10;Yours&#10;|FROM_NAME|"
    },
    [...]
  ]
}

HTTP Request

GET /users

Response

Expected Response Code: 200

See JSON code example.

User Properties

Name Type Description
id int ID of the contact
dateAdded datetime Date/time contact was created
createdBy int ID of the user that created the contact
createdByUser string Name of the user that created the contact
dateModified datetime/null Date/time contact was last modified
lastActive datetime/null Date/time when the user last active
modifiedBy int ID of the user that last modified the contact
modifiedByUser string Name of the user that last modified the contact
username string Username which can be used for log in to Caymland.
firstName string First Name of the user
lastName string Last Name of the user
email string Email of the user
position string User’s position title
role array List of roles of the user
timezone string Timezone of the user
onlineStatus string Online status of the user
signature string Signature of the user which can be used in the emails

Create User

<?php 

$data = array(
    'username' => 'apitest',
    'firstName' => 'John',
    'lastName' => 'Doe',
    'email' => 'john@doe.com',
    'plainPassword' => array(
        'password' => 'topSecret007',
        'confirm' => 'topSecret007',
    ),
    'role' => 1,
);

$user = $userApi->create($data);

Create a new user.

HTTP Request

POST /users/new

Post Parameters

Name Description
username string
firstName string
lastName string
email string
position string
role array
timezone string
onlineStatus string
signature string
plainPassword array

Response

Expected Response Code: 201

Properties

Same as Get User.

Edit User

<?php

$id   = 1;
$data = array(
    'lastName' => 'Doeboe',
);

// Create new a user of ID 1 is not found?
$createIfNotFound = true;

$user = $userApi->edit($id, $data, $createIfNotFound);

Edit a new user. User that this supports PUT or PATCH depending on the desired behavior.

PUT creates a user if the given ID does not exist and clears all the user information, adds the information from the request. PATCH fails if the user with the given ID does not exist and updates the user field values with the values form the request.

HTTP Request

To edit a user and return a 404 if the user is not found:

PATCH /users/ID/edit

To edit a user and create a new one if the user is not found:

PUT /users/ID/edit

Post Parameters

Name Description
username string
firstName string
lastName string
email string
position string
role array
timezone string
signature string

Response

If PUT, the expected response code is 200 if the user was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get User.

Delete User

<?php

$user = $userApi->delete($id);

Delete a user.

HTTP Request

DELETE /users/ID/delete

Response

Expected Response Code: 200

Properties

Same as Get User.

Get Self User

<?php

$user = $userApi->getSelf();

Get a self user.

HTTP Request

GET /users/self

Response

Expected Response Code: 200

Properties

Same as Get User.

Check User Permissions

<?php
$permission = array('user:users:create', 'user:users:edit');
$user = $userApi->checkPermission($id, $permission);

Get a self user.

HTTP Request

GET /users/ID/permissioncheck

Response

Expected Response Code: 200 json { "user:users:create":true, "user:users:edit":true }

Properties

array of requested permissions of string in case of just one

Webhooks

Use this endpoint to obtain details on Caymland’s webhooks. Implemented in Caymland 2.8.0.

<?php
use Caymland\CaymlandApi;
use Caymland\Auth\ApiAuth;

// ...
$initAuth        = new ApiAuth();
$auth            = $initAuth->newAuth($settings);
$apiUrl          = "https://your-caymland.com";
$api             = new CaymlandApi();
$webhookApi      = $api->newApi("webhooks", $auth, $apiUrl);

Get Webhook

<?php

//...
$webhook = $webhookApi->get($id);
{
  "hook": {
    "isPublished": false,
    "dateAdded": "2017-06-07T08:54:46+00:00",
    "dateModified": "2017-06-09T07:16:23+00:00",
    "createdBy": 1,
    "createdByUser": "John Doe",
    "modifiedBy": null,
    "modifiedByUser": " ",
    "id": 31,
    "name": "test",
    "description": "Created via API",
    "webhookUrl": "https:\/\/johndoe.com",
    "eventsOrderbyDir": "DESC",
    "category": {
      "createdByUser": "John Doe",
      "modifiedByUser": "John Doe",
      "id": 1,
      "title": "Important",
      "alias": "important",
      "description": null,
      "color": null,
      "bundle": "Webhook"
    },
    "triggers": [
      "caymland.lead_post_delete",
      "caymland.lead_points_change",
      "caymland.lead_post_save_new",
      "caymland.lead_post_save_update"
    ]
  }
}

Get an individual webhook by ID.

HTTP Request

GET /hooks/ID

Response

Expected Response Code: 200

See JSON code example.

Webhook Properties

Name Type Description
id int ID of the webhook
name string Title of the webhook
description string Description of the webhook
webhookUrl string Url to send the webhook payload to
eventsOrderbyDir Order direction for queued events in one webhook. Can be “DESC” or “ASC”
isPublished bool Published state
publishUp datetime/null Date/time when the webhook should be published
publishDown datetime/null Date/time the webhook should be un published
dateAdded datetime Date/time webhook was created
createdBy int ID of the user that created the webhook
createdByUser string Name of the user that created the webhook
dateModified datetime/null Date/time webhook was last modified
modifiedBy int ID of the user that last modified the webhook
modifiedByUser string Name of the user that last modified the webhook
category null/object Category
triggers array List of triggers available in Caymland

List Webhooks

<?php
// ...

$webhooks = $webhookApi->getList($searchFilter, $start, $limit, $orderBy, $orderByDir, $publishedOnly, $minimal);
{
  "total": 1,
  "hooks": {
    "31": {
      "isPublished": false,
      "dateAdded": "2017-06-07T08:54:46+00:00",
      "dateModified": "2017-06-09T07:16:23+00:00",
      "createdBy": 1,
      "createdByUser": "John Doe",
      "modifiedBy": null,
      "modifiedByUser": " ",
      "id": 31,
      "name": "Deleted contact",
      "description": "Notify me when a contact is deleted",
      "webhookUrl": "https:\/\/johndoe.com",
      "eventsOrderbyDir": "DESC",
      "category": null,
      "triggers": [
        "caymland.lead_post_delete",
      ]
    }
  }
}

HTTP Request

GET /hooks

Query Parameters

Name Description
search String or search command to filter entities by.
start Starting row for the entities returned. Defaults to 0.
limit Limit number of entities to return. Defaults to the system configuration for pagination (30).
orderBy Column to sort by. Can use any column listed in the response.
orderByDir Sort direction: asc or desc.
publishedOnly Only return currently published entities.
minimal Return only array of entities without additional lists in it.

Response

Expected Response Code: 200

See JSON code example.

Properties

Same as Get Webhook.

Create Webhook

<?php

$data = array(
    'name' => 'test',
    'description' => 'Created via API',
    'webhookUrl' => 'http://some.url',
    'eventsOrderbyDir' => "ASC",
    'triggers' => array(
        'caymland.lead_post_save_update',
        'caymland.lead_post_save_new',
    )
);

$webhook = $webhookApi->create($data);

Create a new webhook.

HTTP Request

POST /hooks/new

Post Parameters

Name Type Description
id int ID of the webhook
name string Title of the webhook
description string Description of the webhook
webhookUrl string URL to send the webhook payload to
eventsOrderbyDir Order direction for queued events in one webhook. Can be “DESC” or “ASC”
isPublished bool Published state

Response

Expected Response Code: 201

Properties

Same as Get Webhook.

Edit Webhook

<?php

$id   = 1;
$data = array(
    'name' => 'Rename webhook 1 to this',
);

// Create new a webhook of ID 1 is not found?
$createIfNotFound = true;

$webhook = $webhookApi->edit($id, $data, $createIfNotFound);

Edit a new webhook. Note that this supports PUT or PATCH depending on the desired behavior.

PUT creates a webhook if the given ID does not exist and clears all the webhook information, adds the information from the request. PATCH fails if the webhook with the given ID does not exist and updates the webhook field values with the values form the request.

HTTP Request

To edit a webhook and return a 404 if the webhook is not found:

PATCH /hooks/ID/edit

To edit a webhook and create a new one if the webhook is not found:

PUT /hooks/ID/edit

Post Parameters

Name Type Description
id int ID of the webhook
name string Title of the webhook
description string Description of the webhook
webhookUrl string Url to send the webhook payload to
eventsOrderbyDir Order direction for queued events in one webhook. Can be “DESC” or “ASC”
isPublished bool Published state

Response

If PUT, the expected response code is 200 if the webhook was edited or 201 if created.

If PATCH, the expected response code is 200.

Properties

Same as Get Webhook.

Delete Webhook

<?php

$webhook = $webhookApi->delete($id);

Delete a webhook.

HTTP Request

DELETE /hooks/ID/delete

Response

Expected Response Code: 200

Same as Get Webhook.

List available webhook triggers

<?php

$webhook = $webhookApi->getTriggers();

List webhook triggers

HTTP Request

GET /hooks/triggers

Response

Expected Response Code: 200

{
  "triggers": {
    "caymland.lead_post_delete": {
      "label": "Contact Delete Event",
      "description": "caymland.lead.webhook.event.lead.deleted_desc"
    },
    "caymland.lead_points_change": {
      "label": "Contact Point Change (Increase \/ Decrease) Event",
      "description": "caymland.lead.webhook.event.lead.points_desc"
    },
    "caymland.lead_post_save_update": {
      "label": "Contact Updated Event",
      "description": "caymland.lead.webhook.event.lead.update_desc"
    },
    "caymland.email_on_open": {
      "label": "Email Open Event",
      "description": "caymland.email.webhook.event.open_desc"
    },
    "caymland.form_on_submit": {
      "label": "Form Submit Event",
      "description": "caymland.form.webhook.event.form.submit_desc"
    },
    "caymland.lead_post_save_new": {
      "label": "New Contact Event",
      "description": "caymland.lead.webhook.event.lead.new_desc"
    },
    "caymland.page_on_hit": {
      "label": "Page Hit Event",
      "description": "caymland.page.webhook.event.hit_desc"
    }
  }
}

Webhooks

Webhook is a universal way how to send data about leads, pages, forms and events. The data is sent in real-time when an action occurs so the system which listens form Caymland webhook data can process them without the need for a periodic scanning if Caymland has some new data.

Available webhook actions

Caymland can send webhook payload on these actions:

The webhook workflow

The example workflow below describes a real-life workflow to get an idea how the webhooks can be used. Let’s imagine we have a project management system (PMS) and we want to create a new issue when a lead submits a form.

  1. A lead submits a Caymland form.
  2. Caymland saves the form.
  3. Caymland checks if there is a webhook with the Form submit event. If there is, Caymland sends the data to the URL address defined in the webhook.
  4. PMS receives the data about the form submission and creates a new issue from it.

Create a webhook

It is possible to create multiple different webhooks. That will allow you to send different information to different apps/scripts.

  1. Open the right hand side menu (click the cog icon in the top right corner) and select Webhooks.
  2. Create a new webhook.
  3. Fill in a Name, Webhook POST Url (see the next paragraph if you don’t have one) and select which Webhook Events should trigger this webhook.

Test a webhook

The easiest way how to test a webhook payload is to use a service like RequestBin. RequestBin lets you create a URL which you can set as the Webhook POST Url in Caymland. Then click the Apply button to save it and then click the Send Test Payload button. That will send a test payload data to RequestBin and you will be able to see it at your RequestBin.

When you have created your testing webhook, you can test the real data it sends when a defined action is triggered.

Immediate or queued webhooks

There is an option to queue webhooks for background execution. The reason behind it is that every time an action like contact update happens which has the webhook listener attached to it, the action has to wait for the webhook response untill the webhook response returns or when it times out after 10 senconds. So it is up to the webhook reciever how fast the contact update is.

This lag can be more visible when you do a CSV import. It may be slow when it is waiting a second or two for webhook response for every imported contact.

If you want to avoid this lag, configure the webhook queue in the configuration and add this command to your cron tab: app/console caymland:webhooks:process. This way every time the webhook is triggered, the action is queued as a new row into database, so it is much faster and then the command will make the requests which may take some time. The caveat to this optimisation is that the webhooks are not fired every time the action happens, but every time the command runs.

Queued event order

Caymland will send several events in one webhook if they happen before the queue trigger command runs. Caymland’s default order of those events is chronological. But Zapier integration which use webhooks havily requires reverse chronological order. Thereofore the new option to configure the order was added to webhooks as well as to the global configuration. Webhook configuration overwrites the global configuration, but if not set, the global configuration order value is applied.

Example webhook script

If you need an idea about how to receive Caymland webhook data in your app, this script can be used as a starting point. The script will log the request and return a PHP object of the payload. Place this script on a publicly accessible URL (i.e. `http://yourwebsite.com/webhookTest.php), then fill in the Caymland Webhook POST Url to this script.

 <?php
// webhookTest.php

/**
 * A helper class to log and get the Caymland webhook request
 */
class webhookTest {
    /**
     * Log a message to a file
     *
     * @param  mixed $message
     * @param  string $type [info|error|request]
     */
    public function log($message, $type = 'info')
    {
        $prefix = 'webhookLog_';
        $file = $type . '.log';
        $date = new DateTime();
        error_log($date->format('Y-m-d H:i:s') . ' ' . $message . "\n\n", 3, $prefix . $file);
    }
    /**
     * Get the request JSON object and log the request
     *
     * @return object
     */
    public function getRequest()
    {
        $rawData = file_get_contents("php://input");
        $this->log($rawData, 'request');
        return json_decode($rawData);
    }
}
$webhook = new webhookTest;
$requestData = $webhook->getRequest();
// @todo Process the $requestData as needed

If you’d like to extend the webhook functionality with your plugin, read more in the plugin docs.

CaymlandJS API

Caymland provides a means for plugins to inject custom JavaScript into mtc.js, the PHP generated script that manages Caymland’s tracking pixel, dynamic web content, etc. mtc.js is embedded in 3rd party websites to manage communication between those and Caymland.

mtc.js

<?php
// plugins/HelloWorldPlugin/Event/BuildJsSubscriber.php

namespace CaymlandPlugin\HelloWorldBundle\EventListener;

use Caymland\CoreBundle\CoreEvents;
use Caymland\CoreBundle\Event\BuildJsEvent;

/**
 * Class BuildJsSubscriber
 */
class BuildJsSubscriber extends CommonSubscriber
{
    /**
     * @return array
     */
    public static function getSubscribedEvents()
    {
        return array(
            CoreEvents::BUILD_CAYMLAND_JS => array('onBuildJs', 0)
        );
    }

    /**
     * @param BuildJsEvent $event
     *
     * @return void
     */
    public function onBuildJs(BuildJsEvent $event)
    {
        $js = <<<JS
CaymlandJS.documentReady(function() {
    // Determine what planet this is coming from
});
JS;
        $event->appendJs($js, 'HelloWorld');
    }
}

To inject custom Javascript into mtc.js, use an event listener for the CoreEvents::BUILD_CAYMLAND_JS event. This event receives a Caymland\CoreBundle\Event\BuildJsEvent object where $event->appendJs($js, $sectionName); can be used to inject the script’s code.

JS Form Processing Hooks

if (typeof CaymlandFormCallback == 'undefined') {
    var CaymlandFormCallback = {};
}
CaymlandFormCallback['replaceWithFormName'] = {
    onValidateEnd: function (formValid) {
         // before form submit
    },
    onResponse: function (response) { 
         // after form submit
    }
};

If you wish execute additional code to execute as form is being processed create a CaymlandFormCallback object. In the example code replace replaceWithFormName with the name of your form.

onValidateEnd and onResponse are actions called by Form.customCallbackHandler.

onValidate()

CaymlandFormCallback['replaceWithFormName'] = {
    onValidate: function () {
        // before form validation
        var formIsGood = True;
        var dontUpdate = False;
        if(dontUpdate){
            return null;
        }else if(formIsGood){
            return True;
        }else if(!formIsGood){
            return False;
        }
    },
};

Called before default form validation and can be used to override default form validation.

Return True to skip the default form validation continue with form processing. Return False to skip the default form validation and prevent the form submission. Return null to execute default form validation.

onValidateStart()

CaymlandFormCallback['replaceWithFormName'] = {
    onValidateStart: function () {
         // before default validation
    },
};

Called at the beginning of the default form validation. Receives no values and return value is not required and not processed.

onValidateEnd(formValid)

CaymlandFormCallback['replaceWithFormName'] = {
    onValidateEnd: function (formValid) {
         // before form submit
    },
};

Called after all form validation is complete (default and/or onValidate callback) and before the form is submitted. Receives formValid to determine if form is valid. Return value is not required and not processed.

onErrorMark(callbackData)

var callbackData = {
    containerId: containerId,
    valid: valid,
    validationMessage: callbackValidationMessage
};

CaymlandFormCallback['replaceWithFormName'] = {
    onErrorMark: function (callbackData) {
         // called during error marking
    },
};

Called during error marking. Receives a callbackData object. Return True to skip the default error marking.

onErrorClear(containerId)

CaymlandFormCallback['replaceWithFormName'] = {
    onErrorClear: function (containerId) {
         // called to clear an existing error
    },
};

Called to clear an existing error. Receives containerId with the id of the element containing the error. Return True to skip the default error clearing.

onResponse(response)

CaymlandFormCallback['replaceWithFormName'] = {
    onResponse: function (response) {
         // called to process the response to the form submission
    },
};

Called prior to default form submission response processing. Receives response containing the form submission response. Return True to skip the default form submission response processing.

onResponseStart(response)

CaymlandFormCallback['replaceWithFormName'] = {
    onResponseStart: function (response) {
         // called to process the response to the form submission
    },
};

Called at the beginning default form submission response processing. Receives response containing the form submission response. Return value is not required and not processed.

onResponseEnd(response)

CaymlandFormCallback['replaceWithFormName'] = {
    onResponseEnd: function (response) {
         // called to process the response to the form submission
    },
};

Called at the end default form submission response processing. Receives response containing the form submission response. Return value is not required and not processed.

onMessageSet(messageObject)

var messageObject = {
    message: message,
    type: type
};

CaymlandFormCallback['replaceWithFormName'] = {
    onErrorMark: function (messageObject) {
         // called prior to default message insertion
    },
};

Called prior to default message insertion. Receives a messageObject containing the message and message type. Return True to skip the default message insertion.

onSubmitButtonDisable(messageObject)

CaymlandFormCallback['replaceWithFormName'] = {
    onErrorMark: function (messageObject) {
         // called prior to default message insertion
    },
};

Called prior to default disabling of the submit button. Receives no values. Return True to skip the default disabling of the submit button.

onSubmitButtonEnable()

CaymlandFormCallback['replaceWithFormName'] = {
    onErrorMark: function (messageObject) {
         // called prior to default message insertion
    },
};

Called prior to default enabling of the submit button. Receives no values. Return True to skip the default enabling of the submit button.

onShowNextPage()

CaymlandFormCallback['replaceWithFormName'] = {
    onShowNextPage: function (pageNumber) {
         // called prior to going to the next page
    },
};

Called prior to going to the next page in the form. Useful to adjust the DOM prior to making the page visible.

onShowPreviousPage()

CaymlandFormCallback['replaceWithFormName'] = {
    onShowPreviousPage: function (pageNumber) {
         // called prior to going back to previous page
    },
};

Called prior to going back to a previous page in the form. Useful to adjust the DOM prior to making the page visible.

CaymlandJS API Functions

CaymlandJS.serialize(object)

This method will transform an object properties into a key=value string, concatenating them with an ampersand. It is used when submitting data via CaymlandJS.makeCORSRequest.

var obj = {firstname: "John", lastname: "Doe"};

var serialized = CaymlandJS.serialize(obj);

alert(serialized); // Shows "firstname=John&lastname=Doe"

CaymlandJS.documentReady(functionName|function)

This method will check if the document has finished rendering, then execute the given function. The function argument can be the name of a function or an anonymous function.

function test() {
    alert('test');
}

CaymlandJS.documentReady(test);

CaymlandJS.iterateCollection(collection)(functionName|function)

This method will iterate over the provided collection (array, object, HTMLCollection, etc) using the provided function argument. The function argument can be the name of a function or an anonymous function. The function will receive the collection node and the iteration number as arguments.

var videos = document.getElementsByTagName('video');

// Add a custom data attribute to all videos
CaymlandJS.iterateCollection(videos)(function(node, i) {
    node.dataset.customAttribute = 'test';
});

CaymlandJS.log(arguments)

This method is a lightweight wrapper around console.log. It exists because some browsers do not provide this functionality. It takes any number of arguments, logs them, then passes those same arguments to the console.log method if it exists.

CaymlandJS.log('Something happened');

CaymlandJS.createCORSRequest(method, url)

This method creates an XMLHttpRequest, then checks to see if it supports the withCredentials property. If not, we are probably on windows, so it then checks for the existence of XDomainRequest, then creates it if found. Finally, it opens then returns the xhr. It can be used to send cross domain requests that include the cookies for the domain. It is used internally within the CaymlandJS.makeCORSRequest method.

CaymlandJS.createCORSRequest('GET', 'https://mycaymland.com/dwc/slot1');

CaymlandJS.makeCORSRequest(method, url, data, callbackSuccess, callbackError)

This method uses CaymlandJS.createCORSRequest to open a cross domain request to the specified URL, then sets the callbackSuccess and callbackError values appropriately. You may omit either of the callbacks. If you do, the callbacks are replaced with a basic function that uses CaymlandJS.log(response) to log the response from the request. The callback methods receive the server response and the xhr object as arguments. If the response is determined to be a JSON string, it is automatically parsed to a JSON object. The data argument will be serialized using CaymlandJS.serialize(data), then sent with the request to the server. All requests made this way have the X-Requested-With header set to XMLHttpRequest.

CaymlandJS.makeCORSRequest('GET', 'https://mycaymland.com/dwc/slot1', [], function (response, xhr) {
    if (response.success) {
        document.getElementById('slot1').innerHTML = response.content;
    }
});

CaymlandJS.parseTextToJSON(maybeJSON)

This method will take a text string and check to see if it is a valid JSON string. If so, it parses it into a JSON object and returns. If not, then it will simply return the argument passed to it.

var text = '{"firstname": "John", "lastname": "Doe"}';

var json = CaymlandJS.parseTextToJSON(text);

alert(json); // Will show [object Object]

var text = 'not valid json';

var json = CaymlandJS.parseTextToJSON(text);

alert(json); // Will show 'not valid json'

CaymlandJS.insertScript(scriptUrl)

This method will insert a script tag with the provided URL in the head of your document, before other scripts.

CaymlandJS.insertScript('http://google.com/ga.js');

Mobile App Integration

The essence of monitoring what happens in an App is similar to monitoring what happens on a website. Caymland contains the building blocks needed for native (or pseudo-native) and HTML5-wrapper based Apps, regardless of platform.

In short, use named screen views (e.g. main_screen) in your App as your page_url field in the tracker, and the contact’s email as the unique identifier, see next section for detailed instructions.

Identify visitors by unique field

Note: Unique contact field have to be marked as unique indentifier and publicly updatable in Configuration.

Javascript (JS) tracking

Caymland Tracking Module

Download the package. Extract then include the following code in your project (of course change the file path if needed):

Initializing Caymland module

import caymland from 'caymland-tracking';
caymland.initialize('https://your-subdomain.m-4.ch/mtc.js');

Send page views

caymland.pageView({ custom: 'options' });
API
Value Type Required Notes
mtcPath String Yes The path to your mtc.js file.
Value Type Required Notes
options Object No Object with custom values that you wish to pass to your caymland software on each page view.

Caymland Tracking Script

Copy the code below and change the URL to your Caymland instance.

    (function(w,d,t,u,n,a,m){w['CaymlandTrackingObject']=n;
        w[n]=w[n]||function(){(w[n].q=w[n].q||[]).push(arguments)},a=d.createElement(t),
        m=d.getElementsByTagName(t)[0];a.async=1;a.src=u;m.parentNode.insertBefore(a,m)
    })(window,document,'script','http(s)://subdomain.m-4.ch/mtc.js','mt');

    mt('send', 'pageview');

Tracking of custom parameters

You can attach custom parameters or overwrite the automatically generated parameters to the pageview action as you could to the tracking pixel query. To do that, update the last row of the JS code above like this:

    mt('send', 'pageview', {unique_id: 'KvlQQlZp'});
Value Type Required Notes
Page Title string No is the text written between tags.
Page Language string No is the language defined in the browser.
Page Referrer string No is the URL which the contact came from to the current website.
Page URL string No is the URL which the contact came from to the current website.
Custom Field string No all other field.

Tracking Pixel tracking

This method is secondary.

http://your-subdomain.m-4.ch/mtracking.gif

In your App

A best-in-class approach is to have a class (say ‘caymland’) that handles all your tracking needs. For example, this sample method call would POST to the form with ID 3 - see previous section (note: for conciseness and ubiquity, these sample lines are written in JavaScript / ECMAScript-type language, use similar call in your mobile App language of choice).

Define in your campaigns the screens you want to use as triggers (e.g. 'cart_screen' etc.). Caymland is not looking for a real URL in the form 'http://' for page_url, any typical string would do. Like this:

http://sub.m-4.ch/mtracking.gif?page_url=cart_screen&unique_id=123456

To track individual user activity in the App, this sample call would make an HTTP request to the tracker

caymland.track("cart_screen", "unique_id=123456")

Which is nothing more than an HTTP request to this GET-formatted URL (as also shown in previous section):

http://sub.m-4.ch/mtracking.gif?page_url=cart_screen&unique_id=123456

Tracking Pixel Query

To get the most out of the tracking pixel, it is recommended that you pass information of the web request through the image URL.

Page Information

Caymland currently supports page_url, referrer, language, and page_title (note that the use of url and title are deprecated due to conflicts with contact fields).

Embedding the Pixel

If you are using a CMS, the easiest way is to let one of our plugins do this for you (see below). Note that the plugins may not support all contact fields, utm codes or contact tags.

Here are a couple code snippets that may help as well:
<img src="https://yoursub.m-4.ch/mtracking.gif?page_url=http://yourdomain.com/your-product-page&page_title=Some Cool Product&email=user@domain.com&tags=ProductA,-ProductB" style="display: none;" alt="Caymland M4"/></pre>

Contact Fields

You can also pass information specific to your contact by setting Caymland M4 contact field(s) to be publicly updatable. Note that values appended to the tracking pixel should be url encoded (%20 for spaces, %40 for @, etc).

Tags

The contact’s tags can be changed by using the tags query parameter. Multiple tags can be separated by comma. To remove a tag, prefix it with a dash (minus sign).

For example, mtracking.gif?tags=ProductA,-ProductB would add the ProductA tag to the contact and remove ProductB.