Migrate from Trigger API to Messaging-API

Here is a guide to help you migrate your call from Trigger-API to Messaging-API

General Info

The messaging API is asynchronous processing so the response to the call may be accepted but not sending the email (see detail below)

Design migration

❗️

Your design must have been migrated on SE2025 to get the new design ID → if you are not already on SE2025 request the migration of your design to our team

Simple comparison of both API

Trigger API (legacy)

URL:

https://s3s.fr/api/trigger/nph-10.pl

Authentication

Provide the Splio API key in the payload:

"key": "SplioAPIKey"


Design (legacy template)

Design template uses Splio syntax, and the design ID looks like:

76rx7nZVC



HTTP method

There is either HTTP POST or GET method.

Example: HTTP POST

curl --request POST --url https://s3s.fr/api/trigger/nph-10.pl \
  --header 'accept: application/json' \
  --form 'universe="{{your_universe_id}}"' \
  --form 'key="XXXXXXXXXXXXXXXXX"' \
  --form 'message="7wK9fgq2m"' \
  --form 'rcpts="[{"email":"[email protected]","firstname":"John", "lastname":"Doe", "c24":"vip1"},{"email":"[email protected]","firstname":"John2", "lastname":"Doe2", "c24":"prospect"}]"'










Response

Synchronous Response — The result of sending is received in the response.

200 - Success:

{
  "status": "ok",
  "result": {
    "done": 2,
    "campaign_id": "6VS8HJtyH",
    "todo": 2
  },
  "message": "ok",
  "code": 200
}

400 - Bad request:

{
  "status": "error",
  "message": "incorrect/missing parameters",
  "code": 400
}

Messaging-API (SE 2025)

URL:

https://api.splio.com/messaging/v1/${your_universe_id}/messages

Authentication

Every call requires a JWT in the Authorization header See full docs :

Authorization: Bearer XXX.YYY.ZZZ

Design (Splio Edition 2025)

Design template uses liquid syntax.
Design ID format:

123a123a-123a-123a-123a-123a123a123a

Legacy email templates can be migrated to the new content id by splio team.


HTTP method

Only POST is allowed.

Example: HTTP POST

curl --request POST  --url https://api.splio.com/messaging/v1/${your_universe_id}/messages \
  --header 'accept: application/json' \
  --header 'authorization: Bearer XXXXX.YYYYYY.ZZZZZ' \
  --header 'content-type: application/json' \
  --data '
{
  "channel": "email",x
  "properties": {
    "content_id": "123a123a-123a-123a-123a-123a123a123a"
  },
  "recipients": [
    {
      "email": "[email protected]"
    }
  ]
}'

Response

Asynchronous Response — Indicates message is accepted for treatment.

201 - Created:

{
  "task_id": "019681e0-e9d5-7dc5-939b-9ad431bffa7e",
  "status": "accepted"
}

400 - Bad request:

{
  "error": {
    "code": "invalid_body",
    "message": "Field 'rcpts' is required and must be a non-empty array.",
    "details": []
  }
}


New features of Messaging-API

Send a message to external recipient

External recipients means the contact isn't in Splio database and you push all the data to personalize the email in the payload.

Example for external recipient:

curl --request POST  --url https://api.splio.com/messaging/v1/${your_universe_id}/messages \
	--header 'accept: application/json' \
  --header 'authorization: Bearer XXXXX.YYYYYY.ZZZZZ' \
  --header 'content-type: application/json' \
  --data '
{
  "channel": "email",
  "transactional": true,
  "properties": {
    "content_id": "123a123a-123a-123a-123a-123a123a123a"
  },
  "metadata": {
    "campaign_category": "campaignCategory",
    "campaign_code_operation": "CampaignCodeOperation"
  },
  "recipients": [
    {
      "email": "[email protected]",
      "variables": {
        "firstname": "John",
        "lastname": "Doe",
        "my_variable": "336139999"
      }
    },
    {
      "email": "[email protected]",
      "variables": {
        "firstname": "John2",
        "lastname": "Doe2",
        "my_variable": "336139999"
      }
    }
  ]
}'

Send a message to Contact in MA

You can use contacts that are already existing (or create them before through API) in Splio Marketing Automation without sending all there data in the payload.
To do so switch from email to contact_id in the payload, and as value use the unique contact key of the universe (e.g. email address, phone, custom field) How to choose your contact unique key .

Example for contact:

curl --request POST --url https://api.splio.com/messaging/v1/${your_universe_id}/messages \
  --header 'accept: application/json' \
  --header 'authorization: Bearer XXXXX.YYYYYY.ZZZZZ' \
  --header 'content-type: application/json' \
  --data '
{
  "channel": "email",
  "transactional": false,
  "properties": {
    "content_id": "123a123a-123a-123a-123a-123a123a123a"
  },
  "recipients": [
    {
      "contact_id": "[email protected]"
    }
  ]
}' 

Design change between external recipient and internal contact

For external recipient you will pass all the data in the payload for personalization.

When passing data in the payload in "variables" field of recipient, the syntax can differ from what is used in the designer.
In designer you can use this syntax to render the variable:

{{my_variable}}
{{object.test.my_variable}}

Those variables name don't need to be linked to a field in your contact.

For internal contact you can choose to render data that is in Splio platform, or in the payload "variables"at the same time depending of your use-case.

The syntax in designer for data coming from contact table:

{{contact.id}}
{{contact.custom_fields["my_custom_fields"]}}

Get the deliverability and activity reports of a request to messaging-api

URL:

https://api.splio.com/api/v1/${universeID}/messages/${TASK_ID}

Example response:

{
  "start_at": "2025-04-29T14:08:43Z",
  "metadata": {
    "campaign_name": "my_campaign_name",
    "content_": "",
    "content_version": "2",
    "sending_mode": "test"
  },
  "tags": {},
  "task_id": "019681e0-e9d5-7dc5-939b-9ad431bffa7e",
  "idempotency_key": "019681e0-e9d5-7dc5-939b-9ad431bffa7e",
  "universe": "universeID",
  "content_id": "0196202f-b2a6-783a-9f52-273a88d37d42",
  "communication_type": "transactional",
  "channel": "email",
  "stats": {
    "total": 1,
    "sending": {
      "delivered": 0,
      "failed": 0,
      "queued": 1,
      "soft_bounced": 0,
      "hard_bounced": 0
    },
    "activity": {
      "clicked": 0,
      "opened": 0,
      "unsubscribed": 0,
      "complained": 0
    }
  }
}