Create a Signature Package
/document/manyprivate keyprk_This service allows you to generate a package of documents from an Auco template or a PDF file. Once the process is completed, you will receive each document with its own signature certificate.
Before integrating this endpoint, you may need to see how to define signature positions and package-level identity validation settings.
The documents array must contain at least 2 elements. If you only need a single document, use the POST /document/upload endpoint.
Steps to create a document package through an automated template:
- Query available templates or custom documents.
- Obtain the
_idof the base document. - Query required variables of the selected document.
- Construct and send the creation request.
If you want to do it using a PDF, it is not necessary to send the file in the initial request. At the end, a signed URL will be returned for each document in the package.
Below are the required parameters for this service, along with examples and possible system responses.
Authentication
Include your private key in the Authorization header.
Authorization: prk_xxx...
Creation Parameters
| Name | Type | Description |
|---|---|---|
email | String required | Email address of the process creator. |
package | String optional | Identifier of a package previously put into edit. Sending it overwrites that package instead of creating a new one, keeping its identifier. Resend the full payload: whatever you leave out is removed. Read more |
document | String conditional | ID of the custom document or Auco template. Only required if you want to use a template. |
name | String required | Name of the document signing process. Required if the process includes document signing. |
message | String optional | Message that will be sent in the body of the email notifying signers or approvers of the document. |
subject | String optional | Subject with which the notification email will be sent to signers or approvers. |
folder | String conditional | If you want to save this process in a specific folder, specify the path here. The folder must exist and belong to the process creator. |
remember | Number conditional | Enables automatic reminders with the time interval (in hours) between each notification. Must be a multiple of 3. |
expiredDate | Date optional | Expiration date of the document. Must be at least 3 days after the process creation date and is sent in JSON Date format. |
camera | Boolean optional | Indicates if photo validation is required. Default is false. |
otpCode | Boolean optional | Indicates if OTP code validation is required. Default is false. |
options | Object optional | Specifies identity validation settings. See more |
notification | Boolean optional | Defines whether Auco notifies participants once the process is created. Default is true. It is the default for every signer; each one can override it with signProfile[x].notification. Signers Auco does not notify get an id in the response, grouped by email across all documents, so the integrator can take them to sign on their own. |
custom | Object optional | Free-form object to send integrator-defined parameters (for example, internal identifiers or metadata). Auco stores it as-is and forwards it in webhook notifications and in the GET /document response, without interpreting or validating its contents. Applies to the whole package. |
data | Array conditional | Contains all the data required by the template to generate the document. Only required if using a template. |
data[x].key | String required | Name of the parameter registered in the template. |
data[x].value | String required | Value assigned to the parameter. |
documents * | Array required | List of objects, each representing a document in the package. |
documents[0].name | String required | Name of the document. |
documents[0].readers | Array optional | List of objects defining participants who are not part of the signing process but should observe each phase of the signing process. |
documents[0].readers[x].name | String required | Name of the reader. |
documents[0].readers[x].email | String required | Email address of the reader. |
documents[0].signProfile | Array required | List of objects containing information for each signer or approver for notification and signing. |
documents[0].signProfile[x].name | String required | Name of the signer. |
documents[0].signProfile[x].email | String required | Email address of the signer. It is what Auco uses to relate them to each document in the package, so it is required even when you notify them over WhatsApp. Omitting it returns SIGNER_EMAIL_REQUIRED. |
documents[0].signProfile[x].phone | String optional | Phone number of the signer, with country code. Required if the package uses WhatsApp as its channel. |
documents[0].signProfile[x].position | Array conditional | Signature positions for this signer on each page. Signature positions can be preloaded in templates. See more in how to define signature positions. |
documents[0].signProfile[x].type | Array conditional | Name used to identify the signer type if pre-saved in a template, e.g.: 'co-signer'. |
documents[0].signProfile[x].label | Boolean conditional | Indicates if signature positioning will be done using labels in the PDF. |
documents[0].signProfile[x].notification | Boolean optional | Overrides the global notification for this signer, in either direction: false silences them even if the global is true, and true makes Auco notify them even if the global is false. If the same email appears in several documents with different values, false wins. Only applies to PDF documents; for template documents the per-signer flag is defined in the template's signatureProfile. |
In this service, identity validation and the signing channel are configured once for the whole package, using camera, otpCode and options at the root of the request, and they apply equally to every participant.
Package creation does not support per-participant identity validations or channel selection. Sending camera, otpCode or options inside signProfile[x] returns the error SIGNER_VALIDATIONS_NOT_SUPPORTED. If you need different validations per participant, create separate processes with POST /document/upload.
Every participant in a package is notified at the same time: there are no turns and no approval stages. Sending role or order inside signProfile[x] returns the error SIGNER_SEQUENCE_NOT_SUPPORTED.
If you need some participants to sign before others, or someone to approve before signing starts, create separate processes with POST /document/upload, which does support order and role.
🧪 Usage Examples
You can copy any of the examples according to your preferred programming language.
- Email addresses and phone numbers among signers must not repeat.
- Readers will receive notifications for every update in the signature process.
- Date format:
'DD/MM/YYYY' - Phone numbers must include the country code, e.g.:
+57, +1, +52...
Document Package via PDF
- curl
- Python
- Node.js
curl --location 'https://api.auco.ai/v1.5/ext/document/many' \
--header 'Authorization: prk_e1cd6a01ecdb4b4ea72ec118e33b18de' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Prueba paquete 2 documentos",
"email": "example@auco.ai",
"message": "Hola a todos, les comparto el paquete de documentos para la firma",
"options": {
"camera": "identification",
"whatsapp": true
},
"camera": true,
"otpCode": false,
"documents": [
{
"name": "Documento 1",
"signProfile": [
{
"type": "solicitante",
"name": "Firmante 1",
"phone": "+573000000000",
"email": "example1@auco.ai"
}
]
},
{
"name": "Documento 2",
"signProfile": [
{
"type": "solicitante",
"name": "Firmante 1",
"phone": "+573000000000",
"email": "example2@auco.ai"
}
]
}
]
}
import requests
import json
url = "https://api.auco.ai/v1.5/ext/document/many"
payload = json.dumps({
"name": "Contract package",
"email": "example@auco.ai",
"message": "Hola a todos, les comparto el paquete de documentos para la firma",
"options": {
"camera": "identification",
"whatsapp": True
},
"camera": True,
"otpCode": False,
"documents": [
{
"name": "Documento 1",
"signProfile": [
{
"type": "solicitante",
"name": "Firmante 1",
"phone": "+573000000000",
"email": "example1@auco.ai"
}
]
},
{
"name": "Documento 2",
"signProfile": [
{
"type": "solicitante",
"name": "Firmante 1",
"phone": "+573000000000",
"email": "example2@auco.ai"
}
]
}
]
})
headers = {
'Authorization': 'prk_e1cd6a01ecdb4b4ea72ec118e33b18de',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
const axios = require('axios');
let data = JSON.stringify({
name: 'Contract package',
email: 'example@auco.ai',
message: 'Hola a todos, les comparto el paquete de documentos para la firma',
options: {
camera: 'identification',
whatsapp: true,
},
camera: true,
otpCode: false,
documents: [
{
name: 'Documento 1',
signProfile: [
{
type: 'solicitante',
name: 'Firmante 1',
phone: '+573000000000',
email: 'example1@auco.ai',
},
],
},
{
name: 'Documento 2',
signProfile: [
{
type: 'solicitante',
name: 'Firmante 1',
phone: '+573000000000',
email: 'example2@auco.ai',
},
],
},
],
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.auco.ai/v1.5/ext/document/many',
headers: {
Authorization: 'prk_e1cd6a01ecdb4b4ea72ec118e33b18de',
'Content-Type': 'application/json',
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Document Package via Custom Templates
- curl
- Python
- Node.js
curl --location 'https://api.auco.ai/v1.5/ext/document/many' \
--header 'Authorization: prk_e1cd6a01ecdb4b4ea72ec118e33b18de' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Contract package",
"email": "example@auco.ai",
"message": "Hola a todos, les comparto el paquete de documentos para la firma",
"options": {
"camera": "identification",
"whatsapp": true
},
"camera": true,
"otpCode": false,
"documents": [
{
"name": "Documento 1",
"document": "documentId",
"data": [
{"key": "signer_nombre", "value":"firmante 1"},
{"key": "signer_identification", "value":"cc"},
{"key": "signer_phone", "value":"+573000000000"},
{"key": "manager_name", "value":"manager 1"}
]
},
{
"name": "Documento 2",
"document": "documentId",
"data": [
{"key": "signer_nombre", "value":"firmante 1"},
{"key": "signer_identification", "value":"cc"},
{"key": "signer_phone", "value":"+573000000000"},
{"key": "manager_name", "value":"manager 1"}
]
}
]
}'
import requests
import json
url = "https://api.auco.ai/v1.5/ext/document/many"
payload = json.dumps({
"name": "Contract package",
"email": "example@auco.ai",
"message": "Hola a todos, les comparto el paquete de documentos para la firma",
"options": {
"camera": "identification",
"whatsapp": True
},
"camera": True,
"otpCode": False,
"documents": [
{
"name": "Documento 1",
"document": "documentId",
"data": [
{
"key": "signer_nombre",
"value": "firmante 1"
},
{
"key": "signer_identification",
"value": "cc"
},
{
"key": "signer_phone",
"value": "+573000000000"
},
{
"key": "manager_name",
"value": "manager 1"
}
]
},
{
"name": "Documento 2",
"document": "documentId",
"data": [
{
"key": "signer_nombre",
"value": "firmante 1"
},
{
"key": "signer_identification",
"value": "cc"
},
{
"key": "signer_phone",
"value": "+573000000000"
},
{
"key": "manager_name",
"value": "manager 1"
}
]
}
]
})
headers = {
'Authorization': 'prk_e1cd6a01ecdb4b4ea72ec118e33b18de',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
const axios = require('axios');
let data = JSON.stringify({
name: 'Contract package',
email: 'example@auco.ai',
message: 'Hola a todos, les comparto el paquete de documentos para la firma',
options: {
camera: 'identification',
whatsapp: true,
},
camera: true,
otpCode: false,
documents: [
{
name: 'Documento 1',
document: 'documentId',
data: [
{
key: 'signer_nombre',
value: 'firmante 1',
},
{
key: 'signer_identification',
value: 'cc',
},
{
key: 'signer_phone',
value: '+573000000000',
},
{
key: 'manager_name',
value: 'manager 1',
},
],
},
{
name: 'Documento 2',
document: 'documentId',
data: [
{
key: 'signer_nombre',
value: 'firmante 1',
},
{
key: 'signer_identification',
value: 'cc',
},
{
key: 'signer_phone',
value: '+573000000000',
},
{
key: 'manager_name',
value: 'manager 1',
},
],
},
],
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.auco.ai/v1.5/ext/document/many',
headers: {
Authorization: 'prk_e1cd6a01ecdb4b4ea72ec118e33b18de',
'Content-Type': 'application/json',
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
📥 Response Examples
Document Package via PDF
{
"id": "packageId",
"documents": [
{
"url": "https://signed_url_to_upload_PDF",
"name": "Documento 1",
"code": "CODEDOC1",
"signProfile": [{ "name": "Firmante 1", "email": "example1@auco.ai" }]
},
{
"url": "https://signed_url_to_upload_PDF",
"name": "Documento 2",
"code": "CODEDOC2",
"signProfile": [{ "name": "Firmante 1", "email": "example2@auco.ai" }]
}
]
}
The signed URL provided in the response will only be available for 300 seconds (5 minutes). It must be used to upload the PDF document in binary format via an HTTP PUT request.
Via Custom Templates
{
"id": "packageId",
"documents": [
{
"name": "Documento 1",
"code": "CODEDOC1",
"signProfile": [{ "name": "Firmante 1", "email": "example1@auco.ai" }]
},
{
"name": "Documento 2",
"code": "CODEDOC2",
"signProfile": [{ "name": "Firmante 1", "email": "example2@auco.ai" }]
}
]
}
🔹 Signers Auco does not notify
A signer is silenced when their effective notification is false: their own if they carry one, otherwise the global one. signProfile always comes back in the response; what changes is that silenced signers carry an id and the ones Auco notifies do not, because their access is generated when the email goes out.
This example turns notification off for the whole package and back on only for example2@auco.ai:
{
"name": "Contract package",
"email": "example@auco.ai",
"notification": false,
"documents": [
{
"name": "Documento 1",
"signProfile": [
{ "type": "solicitante", "name": "Firmante 1", "email": "example1@auco.ai" },
{ "type": "aprobador", "name": "Firmante 2", "email": "example2@auco.ai", "notification": true }
]
},
{
"name": "Documento 2",
"signProfile": [
{ "type": "solicitante", "name": "Firmante 1", "email": "example1@auco.ai" }
]
}
]
}
Firmante 1 appears in both documents, so they get the same id in each: they are one person within the package. Firmante 2 carries no id because Auco takes care of them.
{
"id": "packageId",
"documents": [
{
"url": "https://signed_url_to_upload_PDF",
"name": "Documento 1",
"code": "CODEDOC1",
"signProfile": [
{ "id": "0Q", "name": "Firmante 1", "email": "example1@auco.ai" },
{ "name": "Firmante 2", "email": "example2@auco.ai" }
]
},
{
"url": "https://signed_url_to_upload_PDF",
"name": "Documento 2",
"code": "CODEDOC2",
"signProfile": [{ "id": "0Q", "name": "Firmante 1", "email": "example1@auco.ai" }]
}
]
}
| Field | Type | Description |
|---|---|---|
documents[x].signProfile | Array | List of signers for the document. |
documents[x].signProfile[y].id | String | Identifier of the signer within the package. Only present when Auco does not notify them; regenerated if you overwrite the package. |
documents[x].signProfile[y].name | String | Name of the signer. |
documents[x].signProfile[y].email | String | Email of the signer. |
⚠️ Error Responses
| Code | Description |
|---|---|
| 400 | Missing parameters, or one or more validations do not meet the applicability conditions. |
| 400 | DOCUMENTS_MIN_TWO — The documents array must have at least 2 elements. Use /document/upload for a single document. |
| 401 | Invalid or missing authentication. |