List transactional emails
curl --request GET \
--url https://app.loops.so/api/v1/transactional-emails \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.loops.so/api/v1/transactional-emails"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.loops.so/api/v1/transactional-emails', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.loops.so/api/v1/transactional-emails",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.loops.so/api/v1/transactional-emails"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.loops.so/api/v1/transactional-emails")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.loops.so/api/v1/transactional-emails")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"pagination": {
"totalResults": 23,
"returnedResults": 20,
"perPage": 20,
"totalPages": 2,
"nextCursor": "clyo0q4wo01p59fsecyxqsh38",
"nextPage": "https://app.loops.so/api/v1/transactional-emails?cursor=clyo0q4wo01p59fsecyxqsh38&perPage=20"
},
"data": [
{
"id": "cmnx1d95z001llilji4vapgqs",
"name": "Welcome email",
"draftEmailMessageId": "cmn5zia4i0017tzli8ric8giv",
"publishedEmailMessageId": null,
"transactionalGroupId": "clq3b7s9u006yl70p5q6r7s8t",
"createdAt": "2026-03-28T15:00:00.000Z",
"updatedAt": "2026-03-28T15:00:00.000Z",
"dataVariables": [
"firstName",
"lastName"
]
},
...
]
}
{
"message": "Invalid perPage value"
}
Transactional emails
List transactional emails
Retrieve a paginated list of transactional emails in your Loops account, including their status, group, and current draft and published messages.
GET
/
v1
/
transactional-emails
List transactional emails
curl --request GET \
--url https://app.loops.so/api/v1/transactional-emails \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.loops.so/api/v1/transactional-emails"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.loops.so/api/v1/transactional-emails', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.loops.so/api/v1/transactional-emails",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.loops.so/api/v1/transactional-emails"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://app.loops.so/api/v1/transactional-emails")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.loops.so/api/v1/transactional-emails")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"pagination": {
"totalResults": 23,
"returnedResults": 20,
"perPage": 20,
"totalPages": 2,
"nextCursor": "clyo0q4wo01p59fsecyxqsh38",
"nextPage": "https://app.loops.so/api/v1/transactional-emails?cursor=clyo0q4wo01p59fsecyxqsh38&perPage=20"
},
"data": [
{
"id": "cmnx1d95z001llilji4vapgqs",
"name": "Welcome email",
"draftEmailMessageId": "cmn5zia4i0017tzli8ric8giv",
"publishedEmailMessageId": null,
"transactionalGroupId": "clq3b7s9u006yl70p5q6r7s8t",
"createdAt": "2026-03-28T15:00:00.000Z",
"updatedAt": "2026-03-28T15:00:00.000Z",
"dataVariables": [
"firstName",
"lastName"
]
},
...
]
}
{
"message": "Invalid perPage value"
}
Request
Query parameters
How many results to return in each request. Must be between 10 and 50.
A cursor to return a specific page of results. Cursors can be found from the
pagination.nextCursor value in each response.Response
Success
Show metadata
Show metadata
Total results found.
The number of results returned in this response.
The maximum number of results requested.
Total number of pages.
The next cursor (for retrieving the next page of results using the
cursor
parameter), or null if there are no further pages.The URL of the next page of results, or
null if there are no further
pages.Hide transactional
Hide transactional
The transactional email ID.
The transactional email name.
The ID of the draft email message, if one exists.
The ID of the published email message, if one exists.
The ID of the group this transactional email belongs to.
ISO 8601 timestamp for when the transactional email was created.
ISO 8601 timestamp for when the transactional email was last updated.
Data variable names used by the published email. Empty for unpublished
transactional emails.
Error
IfperPage is invalid, a 400 Bad Request is returned.
If the API key is invalid (or content API is not enabled for your team), a
401 Unauthorized is returned.
An error message describing what went wrong.
{
"pagination": {
"totalResults": 23,
"returnedResults": 20,
"perPage": 20,
"totalPages": 2,
"nextCursor": "clyo0q4wo01p59fsecyxqsh38",
"nextPage": "https://app.loops.so/api/v1/transactional-emails?cursor=clyo0q4wo01p59fsecyxqsh38&perPage=20"
},
"data": [
{
"id": "cmnx1d95z001llilji4vapgqs",
"name": "Welcome email",
"draftEmailMessageId": "cmn5zia4i0017tzli8ric8giv",
"publishedEmailMessageId": null,
"transactionalGroupId": "clq3b7s9u006yl70p5q6r7s8t",
"createdAt": "2026-03-28T15:00:00.000Z",
"updatedAt": "2026-03-28T15:00:00.000Z",
"dataVariables": [
"firstName",
"lastName"
]
},
...
]
}
{
"message": "Invalid perPage value"
}
Last modified on June 30, 2026
Was this page helpful?
⌘I

