Save the draft (autosave)
package main
import ( "fmt" "strings" "net/http" "io")
func main() {
url := "https://reputecast.example.com/api/v1/workspaces/acme-newsletter/transactional/templates/password-reset/draft"
payload := strings.NewReader("{ \"baseRevision\": 1, \"editorMode\": \"visual\", \"force\": true, \"html\": \"example\", \"label\": \"example\", \"mjml\": \"example\", \"plainText\": \"example\", \"preheader\": \"example\", \"replyTo\": \"example\", \"senderId\": \"example\", \"source\": \"autosave\", \"subject\": \"example\", \"testData\": [ { \"data\": { \"additionalProperty\": \"example\" }, \"name\": \"New user\" } ], \"trackClicks\": true, \"trackOpens\": true, \"variables\": [ { \"default\": \"example\", \"description\": \"example\", \"name\": \"reset_url\", \"required\": true, \"sample\": \"example\", \"sensitive\": true, \"type\": \"text\" } ] }")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>") req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}const url = 'https://reputecast.example.com/api/v1/workspaces/acme-newsletter/transactional/templates/password-reset/draft';const options = { method: 'PUT', headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'}, body: '{"baseRevision":1,"editorMode":"visual","force":true,"html":"example","label":"example","mjml":"example","plainText":"example","preheader":"example","replyTo":"example","senderId":"example","source":"autosave","subject":"example","testData":[{"data":{"additionalProperty":"example"},"name":"New user"}],"trackClicks":true,"trackOpens":true,"variables":[{"default":"example","description":"example","name":"reset_url","required":true,"sample":"example","sensitive":true,"type":"text"}]}'};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}curl --request PUT \ --url https://reputecast.example.com/api/v1/workspaces/acme-newsletter/transactional/templates/password-reset/draft \ --header 'Authorization: Bearer <token>' \ --header 'Content-Type: application/json' \ --data '{ "baseRevision": 1, "editorMode": "visual", "force": true, "html": "example", "label": "example", "mjml": "example", "plainText": "example", "preheader": "example", "replyTo": "example", "senderId": "example", "source": "autosave", "subject": "example", "testData": [ { "data": { "additionalProperty": "example" }, "name": "New user" } ], "trackClicks": true, "trackOpens": true, "variables": [ { "default": "example", "description": "example", "name": "reset_url", "required": true, "sample": "example", "sensitive": true, "type": "text" } ] }'Permission: transactional:edit
Content, variables, test data, sender, reply-to and tracking. Fails with 409 version_conflict when someone saved a newer revision since baseRevision; the problem’s meta says who, when and what each side changed. Send force: true to keep yours.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”Workspace slug
Workspace slug
The template’s ID, such as password-reset, or its UUID
The template’s ID, such as password-reset, or its UUID
Query Parameters
Section titled “Query Parameters”Saves a language version instead of the draft (internal/languages)
Saves a language version instead of the draft (internal/languages)
Request Bodyrequired
Section titled “Request Bodyrequired”object
The HTML the editor compiled; empty compiles the MJML on the server
A Transactional sender, or empty for the default
object
object
object
Never stored: logs and stored content show ••••••
Responses
Section titled “Responses”OK
object
Example generated
{ "draftChanges": true, "draftHash": "example", "draftRevision": 1, "html": "example", "plainText": "example", "savedAt": "2026-04-15T12:00:00Z", "sizeBytes": 1}default
Section titled “default”Error
object
Stable error code, e.g. permission_denied
A human-readable explanation specific to this occurrence of the problem.
Optional list of individual error details
object
Where the error occurred, e.g. ‘body.items[3].tags’ or ‘path.thing-id’
Error message text
The value at the given location
Members who hold the missing permission
A URI reference that identifies the specific occurrence of the problem.
object
The missing permission key
HTTP status code
A short, human-readable summary of the problem type. This value should not change between occurrences of the error.
A URI reference to human-readable documentation for the error.
Example
{ "detail": "Property foo is required but is missing.", "instance": "https://example.com/error-log/abc123", "status": 400, "title": "Bad Request", "type": "about:blank"}