curl --request POST \
--url https://my.flowsign.app/api/v1/packages/from-template \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"templateId": "K7dQm2xPz9Lw",
"recipients": [
{
"role": "Employee",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz"
}
],
"externalId": "crm-deal-48213",
"status": "sent",
"scheduledAt": "2026-10-01T20:00:00.000Z",
"fields": {
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
},
"workflowAnswers": {
"q_probation": {
"port": "yes"
},
"q_notice_weeks": {
"value": 4
}
},
"documentAnswers": {
"cmg3k5r1c0003s7p4h2m8tb7k": {
"employment_type": "full_time"
}
},
"metadata": {
"cost_centre": "CC-4410",
"region": "Auckland"
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
templateId: 'K7dQm2xPz9Lw',
recipients: [{role: 'Employee', name: 'Jane Ahu', email: 'jane.ahu@example.co.nz'}],
externalId: 'crm-deal-48213',
status: 'sent',
scheduledAt: '2026-10-01T20:00:00.000Z',
fields: {employee_name: 'Jane Ahu', start_date: '2026-10-12', salary: '78000'},
workflowAnswers: {q_probation: {port: 'yes'}, q_notice_weeks: {value: 4}},
documentAnswers: {cmg3k5r1c0003s7p4h2m8tb7k: {employment_type: 'full_time'}},
metadata: {cost_centre: 'CC-4410', region: 'Auckland'}
})
};
fetch('https://my.flowsign.app/api/v1/packages/from-template', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
templateId: 'K7dQm2xPz9Lw',
recipients: [{role: 'Employee', name: 'Jane Ahu', email: 'jane.ahu@example.co.nz'}],
externalId: 'crm-deal-48213',
status: 'sent',
scheduledAt: '2026-10-01T20:00:00.000Z',
fields: {employee_name: 'Jane Ahu', start_date: '2026-10-12', salary: '78000'},
workflowAnswers: {q_probation: {port: 'yes'}, q_notice_weeks: {value: 4}},
documentAnswers: {cmg3k5r1c0003s7p4h2m8tb7k: {employment_type: 'full_time'}},
metadata: {cost_centre: 'CC-4410', region: 'Auckland'}
})
};
fetch('https://my.flowsign.app/api/v1/packages/from-template', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://my.flowsign.app/api/v1/packages/from-template';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
templateId: 'K7dQm2xPz9Lw',
recipients: [{role: 'Employee', name: 'Jane Ahu', email: 'jane.ahu@example.co.nz'}],
externalId: 'crm-deal-48213',
status: 'sent',
scheduledAt: '2026-10-01T20:00:00.000Z',
fields: {employee_name: 'Jane Ahu', start_date: '2026-10-12', salary: '78000'},
workflowAnswers: {q_probation: {port: 'yes'}, q_notice_weeks: {value: 4}},
documentAnswers: {cmg3k5r1c0003s7p4h2m8tb7k: {employment_type: 'full_time'}},
metadata: {cost_centre: 'CC-4410', region: 'Auckland'}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://my.flowsign.app/api/v1/packages/from-template"
payload = {
"templateId": "K7dQm2xPz9Lw",
"recipients": [
{
"role": "Employee",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz"
}
],
"externalId": "crm-deal-48213",
"status": "sent",
"scheduledAt": "2026-10-01T20:00:00.000Z",
"fields": {
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
},
"workflowAnswers": {
"q_probation": { "port": "yes" },
"q_notice_weeks": { "value": 4 }
},
"documentAnswers": { "cmg3k5r1c0003s7p4h2m8tb7k": { "employment_type": "full_time" } },
"metadata": {
"cost_centre": "CC-4410",
"region": "Auckland"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)using RestSharp;
var options = new RestClientOptions("https://my.flowsign.app/api/v1/packages/from-template");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"templateId\": \"K7dQm2xPz9Lw\",\n \"recipients\": [\n {\n \"role\": \"Employee\",\n \"name\": \"Jane Ahu\",\n \"email\": \"jane.ahu@example.co.nz\"\n }\n ],\n \"externalId\": \"crm-deal-48213\",\n \"status\": \"sent\",\n \"scheduledAt\": \"2026-10-01T20:00:00.000Z\",\n \"fields\": {\n \"employee_name\": \"Jane Ahu\",\n \"start_date\": \"2026-10-12\",\n \"salary\": \"78000\"\n },\n \"workflowAnswers\": {\n \"q_probation\": {\n \"port\": \"yes\"\n },\n \"q_notice_weeks\": {\n \"value\": 4\n }\n },\n \"documentAnswers\": {\n \"cmg3k5r1c0003s7p4h2m8tb7k\": {\n \"employment_type\": \"full_time\"\n }\n },\n \"metadata\": {\n \"cost_centre\": \"CC-4410\",\n \"region\": \"Auckland\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
using RestSharp;
var options = new RestClientOptions("https://my.flowsign.app/api/v1/packages/from-template");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"templateId\": \"K7dQm2xPz9Lw\",\n \"recipients\": [\n {\n \"role\": \"Employee\",\n \"name\": \"Jane Ahu\",\n \"email\": \"jane.ahu@example.co.nz\"\n }\n ],\n \"externalId\": \"crm-deal-48213\",\n \"status\": \"sent\",\n \"scheduledAt\": \"2026-10-01T20:00:00.000Z\",\n \"fields\": {\n \"employee_name\": \"Jane Ahu\",\n \"start_date\": \"2026-10-12\",\n \"salary\": \"78000\"\n },\n \"workflowAnswers\": {\n \"q_probation\": {\n \"port\": \"yes\"\n },\n \"q_notice_weeks\": {\n \"value\": 4\n }\n },\n \"documentAnswers\": {\n \"cmg3k5r1c0003s7p4h2m8tb7k\": {\n \"employment_type\": \"full_time\"\n }\n },\n \"metadata\": {\n \"cost_centre\": \"CC-4410\",\n \"region\": \"Auckland\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://my.flowsign.app/api/v1/packages/from-template' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"templateId": "K7dQm2xPz9Lw",
"recipients": [
{
"role": "Employee",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz"
}
],
"externalId": "crm-deal-48213",
"status": "sent",
"scheduledAt": "2026-10-01T20:00:00.000Z",
"fields": {
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
},
"workflowAnswers": {
"q_probation": {
"port": "yes"
},
"q_notice_weeks": {
"value": 4
}
},
"documentAnswers": {
"cmg3k5r1c0003s7p4h2m8tb7k": {
"employment_type": "full_time"
}
},
"metadata": {
"cost_centre": "CC-4410",
"region": "Auckland"
}
}'{
"data": {
"id": "cmg4v8q2k0001s7xh3b9d2f6a",
"externalId": "crm-deal-48213",
"status": "IN_PROGRESS",
"recipients": [
{
"id": "cmg4v8q2k0002s7xh6k4m1p9c",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz",
"role": "Employee"
}
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}Launch a package from a template
Creates a package from an ACTIVE template, mapping each recipient onto the role of that name. Requires canSendPackages.
curl --request POST \
--url https://my.flowsign.app/api/v1/packages/from-template \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"templateId": "K7dQm2xPz9Lw",
"recipients": [
{
"role": "Employee",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz"
}
],
"externalId": "crm-deal-48213",
"status": "sent",
"scheduledAt": "2026-10-01T20:00:00.000Z",
"fields": {
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
},
"workflowAnswers": {
"q_probation": {
"port": "yes"
},
"q_notice_weeks": {
"value": 4
}
},
"documentAnswers": {
"cmg3k5r1c0003s7p4h2m8tb7k": {
"employment_type": "full_time"
}
},
"metadata": {
"cost_centre": "CC-4410",
"region": "Auckland"
}
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
templateId: 'K7dQm2xPz9Lw',
recipients: [{role: 'Employee', name: 'Jane Ahu', email: 'jane.ahu@example.co.nz'}],
externalId: 'crm-deal-48213',
status: 'sent',
scheduledAt: '2026-10-01T20:00:00.000Z',
fields: {employee_name: 'Jane Ahu', start_date: '2026-10-12', salary: '78000'},
workflowAnswers: {q_probation: {port: 'yes'}, q_notice_weeks: {value: 4}},
documentAnswers: {cmg3k5r1c0003s7p4h2m8tb7k: {employment_type: 'full_time'}},
metadata: {cost_centre: 'CC-4410', region: 'Auckland'}
})
};
fetch('https://my.flowsign.app/api/v1/packages/from-template', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
templateId: 'K7dQm2xPz9Lw',
recipients: [{role: 'Employee', name: 'Jane Ahu', email: 'jane.ahu@example.co.nz'}],
externalId: 'crm-deal-48213',
status: 'sent',
scheduledAt: '2026-10-01T20:00:00.000Z',
fields: {employee_name: 'Jane Ahu', start_date: '2026-10-12', salary: '78000'},
workflowAnswers: {q_probation: {port: 'yes'}, q_notice_weeks: {value: 4}},
documentAnswers: {cmg3k5r1c0003s7p4h2m8tb7k: {employment_type: 'full_time'}},
metadata: {cost_centre: 'CC-4410', region: 'Auckland'}
})
};
fetch('https://my.flowsign.app/api/v1/packages/from-template', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));const url = 'https://my.flowsign.app/api/v1/packages/from-template';
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
templateId: 'K7dQm2xPz9Lw',
recipients: [{role: 'Employee', name: 'Jane Ahu', email: 'jane.ahu@example.co.nz'}],
externalId: 'crm-deal-48213',
status: 'sent',
scheduledAt: '2026-10-01T20:00:00.000Z',
fields: {employee_name: 'Jane Ahu', start_date: '2026-10-12', salary: '78000'},
workflowAnswers: {q_probation: {port: 'yes'}, q_notice_weeks: {value: 4}},
documentAnswers: {cmg3k5r1c0003s7p4h2m8tb7k: {employment_type: 'full_time'}},
metadata: {cost_centre: 'CC-4410', region: 'Auckland'}
})
};
fetch(url, options)
.then(res => res.json())
.then(json => console.log(json))
.catch(err => console.error(err));import requests
url = "https://my.flowsign.app/api/v1/packages/from-template"
payload = {
"templateId": "K7dQm2xPz9Lw",
"recipients": [
{
"role": "Employee",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz"
}
],
"externalId": "crm-deal-48213",
"status": "sent",
"scheduledAt": "2026-10-01T20:00:00.000Z",
"fields": {
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
},
"workflowAnswers": {
"q_probation": { "port": "yes" },
"q_notice_weeks": { "value": 4 }
},
"documentAnswers": { "cmg3k5r1c0003s7p4h2m8tb7k": { "employment_type": "full_time" } },
"metadata": {
"cost_centre": "CC-4410",
"region": "Auckland"
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)using RestSharp;
var options = new RestClientOptions("https://my.flowsign.app/api/v1/packages/from-template");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"templateId\": \"K7dQm2xPz9Lw\",\n \"recipients\": [\n {\n \"role\": \"Employee\",\n \"name\": \"Jane Ahu\",\n \"email\": \"jane.ahu@example.co.nz\"\n }\n ],\n \"externalId\": \"crm-deal-48213\",\n \"status\": \"sent\",\n \"scheduledAt\": \"2026-10-01T20:00:00.000Z\",\n \"fields\": {\n \"employee_name\": \"Jane Ahu\",\n \"start_date\": \"2026-10-12\",\n \"salary\": \"78000\"\n },\n \"workflowAnswers\": {\n \"q_probation\": {\n \"port\": \"yes\"\n },\n \"q_notice_weeks\": {\n \"value\": 4\n }\n },\n \"documentAnswers\": {\n \"cmg3k5r1c0003s7p4h2m8tb7k\": {\n \"employment_type\": \"full_time\"\n }\n },\n \"metadata\": {\n \"cost_centre\": \"CC-4410\",\n \"region\": \"Auckland\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
using RestSharp;
var options = new RestClientOptions("https://my.flowsign.app/api/v1/packages/from-template");
var client = new RestClient(options);
var request = new RestRequest("");
request.AddHeader("Authorization", "Bearer <token>");
request.AddJsonBody("{\n \"templateId\": \"K7dQm2xPz9Lw\",\n \"recipients\": [\n {\n \"role\": \"Employee\",\n \"name\": \"Jane Ahu\",\n \"email\": \"jane.ahu@example.co.nz\"\n }\n ],\n \"externalId\": \"crm-deal-48213\",\n \"status\": \"sent\",\n \"scheduledAt\": \"2026-10-01T20:00:00.000Z\",\n \"fields\": {\n \"employee_name\": \"Jane Ahu\",\n \"start_date\": \"2026-10-12\",\n \"salary\": \"78000\"\n },\n \"workflowAnswers\": {\n \"q_probation\": {\n \"port\": \"yes\"\n },\n \"q_notice_weeks\": {\n \"value\": 4\n }\n },\n \"documentAnswers\": {\n \"cmg3k5r1c0003s7p4h2m8tb7k\": {\n \"employment_type\": \"full_time\"\n }\n },\n \"metadata\": {\n \"cost_centre\": \"CC-4410\",\n \"region\": \"Auckland\"\n }\n}", false);
var response = await client.PostAsync(request);
Console.WriteLine("{0}", response.Content);
$headers=@{}
$headers.Add("Authorization", "Bearer <token>")
$headers.Add("Content-Type", "application/json")
$response = Invoke-WebRequest -Uri 'https://my.flowsign.app/api/v1/packages/from-template' -Method POST -Headers $headers -ContentType 'application/json' -Body '{
"templateId": "K7dQm2xPz9Lw",
"recipients": [
{
"role": "Employee",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz"
}
],
"externalId": "crm-deal-48213",
"status": "sent",
"scheduledAt": "2026-10-01T20:00:00.000Z",
"fields": {
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
},
"workflowAnswers": {
"q_probation": {
"port": "yes"
},
"q_notice_weeks": {
"value": 4
}
},
"documentAnswers": {
"cmg3k5r1c0003s7p4h2m8tb7k": {
"employment_type": "full_time"
}
},
"metadata": {
"cost_centre": "CC-4410",
"region": "Auckland"
}
}'{
"data": {
"id": "cmg4v8q2k0001s7xh3b9d2f6a",
"externalId": "crm-deal-48213",
"status": "IN_PROGRESS",
"recipients": [
{
"id": "cmg4v8q2k0002s7xh6k4m1p9c",
"name": "Jane Ahu",
"email": "jane.ahu@example.co.nz",
"role": "Employee"
}
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}{
"error": "Missing permission: canSendPackages",
"details": {
"recipients.0.email": [
"Invalid email"
]
}
}Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Headers
The workspace the key was issued for, as returned by GET /api/v1/workspaces. Optional: omitting it acts in the key's workspace, and any other id is rejected with 401.
Body
The id of the template to launch.
1"K7dQm2xPz9Lw"
One recipient per template role. At least one and at most 100.
1 - 100 elementsShow child attributes
Show child attributes
Your own reference for the package, up to 255 characters and unique within the organisation. Repeating it returns the existing package instead of creating another, and sends it when it is still a DRAFT and status is "sent", so a retry after a failed send completes it.
1 - 255"crm-deal-48213"
"draft" leaves the package unsent; "sent" dispatches it to recipients immediately. Defaults to "draft".
draft, sent "sent"
An ISO 8601 time to send the package automatically. Leaves it SCHEDULED, and cannot be combined with status: "sent".
"2026-10-01T20:00:00.000Z"
Merge field values keyed by merge field key. Each is checked against its field's type and list options, and a bad or missing required value is rejected with 422 under fields.<key>. A blank value takes the field's default. Keys the template does not ask the sender for are rejected under unknownFields.
Show child attributes
Show child attributes
{
"employee_name": "Jane Ahu",
"start_date": "2026-10-12",
"salary": "78000"
}
The sender's answers to the template's workflow questions, keyed by question id. port names the picked answer for a choice question; value carries the typed input for an open one. Omit it when nothing branches: only the default documents are included.
Show child attributes
Show child attributes
{
"q_probation": { "port": "yes" },
"q_notice_weeks": { "value": 4 }
}
Answers to the questions the template's documents ask, keyed by document id and then question id, so two documents asking a question with the same id are answered apart. They decide which conditional content each document includes. A document question the workflow also asks is answered once, here or in workflowAnswers; giving it two different answers is refused.
Show child attributes
Show child attributes
{
"cmg3k5r1c0003s7p4h2m8tb7k": { "employment_type": "full_time" }
}
Custom field values keyed by custom field key, set over the template's defaults. Every key must be a live custom field that applies to this package. An empty string clears a value. Unknown keys are rejected with 422, and so are missing required values when the package is sent or scheduled.
Show child attributes
Show child attributes
{
"cost_centre": "CC-4410",
"region": "Auckland"
}
Response
Success
Show child attributes
Show child attributes
Was this page helpful?

