curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/emails/{template_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/emails/{template_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/emails/{template_id}', 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.base44.com/api/apps/{app_id}/emails/{template_id}",
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.base44.com/api/apps/{app_id}/emails/{template_id}"
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.base44.com/api/apps/{app_id}/emails/{template_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/emails/{template_id}")
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{
"id": "68c1f0a2b3d4e5f6a7b8c9d0",
"app_id": "6820f3a4e7b91d003c45a1f2",
"name": "Welcome",
"created_date": "2026-09-14T08:30:12.418000Z",
"updated_date": "2026-09-14T08:30:12.418000Z",
"html": "<!doctype html><html><head><title>Welcome to Acme</title></head><body>Hi {{first_name}}</body></html>"
}Get email template
Returns one of the app’s email templates with its HTML.
An app’s email templates are files in its code, in base44/emails/. The AI creates and edits them through Send chat message.
This is limited to 60 requests per minute per app for each workspace’s personal API keys, so every key in a workspace shares one allowance. Some workspaces have a different limit.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/emails/{template_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/emails/{template_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/emails/{template_id}', 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.base44.com/api/apps/{app_id}/emails/{template_id}",
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.base44.com/api/apps/{app_id}/emails/{template_id}"
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.base44.com/api/apps/{app_id}/emails/{template_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/emails/{template_id}")
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{
"id": "68c1f0a2b3d4e5f6a7b8c9d0",
"app_id": "6820f3a4e7b91d003c45a1f2",
"name": "Welcome",
"created_date": "2026-09-14T08:30:12.418000Z",
"updated_date": "2026-09-14T08:30:12.418000Z",
"html": "<!doctype html><html><head><title>Welcome to Acme</title></head><body>Hi {{first_name}}</body></html>"
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app the emails belong to.
ID of the email template to get. Get it from id in List email templates.
Response
The email template.
An email template with its HTML.
ID of the template.
"68c1f0a2b3d4e5f6a7b8c9d0"
ID of the app the template belongs to.
"6820f3a4e7b91d003c45a1f2"
Name of the template, from its file name: the template in base44/emails/Welcome.html is Welcome. A workflow's send email action or a backend function's SendEmail call picks the template by this name.
"Welcome"
When the template was created, as a UTC timestamp in ISO 8601 format.
"2026-09-14T08:30:12.418000Z"
When the template last changed, as a UTC timestamp in ISO 8601 format.
"2026-09-14T08:30:12.418000Z"
The email as inbox-ready HTML. Its <title> is the default subject line. {{variable}} placeholders, such as {{first_name}}, stay as written. The sender fills them in.
"<!doctype html><html><head><title>Welcome to Acme</title></head><body>Hi {{first_name}}</body></html>"
Was this page helpful?