Create Attachments Process
/package/uploadprivate keyprk_This service allows initiating a process to request attachments for signing or simply attachments without signing. Each attachment can be configured as mandatory or optional.
If you want to include a signing process, you can upload the PDF document in the same request: in Base64 with file, or in binary (via a signed URL with PUT) using compress. If you want the signing and the attachment request to be part of a presaved flow template, it must be configured beforehand with our support team; once created, you reference it by its id in the document field.
Before integrating this endpoint, you may need to see how to define signature positions and identity validation settings.
Authentication
Include your private key in the Authorization header.
Authorization: prk_xxx...
Creation Parameters
- The
file,compressanddocumentfields are mutually exclusive: you can send at most one. If you send none, a collection-only attachments process without signing is created (no document is generated) and in that casenameis not required either. - Each
signProfileobject must include exactly one oftype,labelorposition(mutually exclusive and one required), even in attachment-only processes without signing.
| Name | Type | Description |
|---|---|---|
email | String required | Email address of the process creator. |
document | String conditional | Id of a presaved flow template (created beforehand with the support team) used to create the process. |
name | String conditional | Name of the document to be signed. Only required if the process includes a document (file, compress or document). In a collection-only attachments process without signing, it does not need to be sent. |
packageName | String required | Name for the folder that will contain the attachments and the document to be signed (if included). |
message | String optional | Message that will be included in the body of the email notification sent to signers or approvers. If not sent, Auco uses a default value. |
subject | String optional | Subject of the notification email sent to signers or approvers. If not sent, Auco uses a default value. |
file | String conditional | If you want to upload the document in the same request, send the PDF file in Base64 format in this parameter. (Only for small files) |
compress | Boolean conditional | If the PDF file to be uploaded is too large, it is recommended not to send the file parameter; instead, use compress: true. The service will return a signed URL to upload the PDF file in binary format via a PUT request. |
folder | String conditional | If you want to save this process in a specific folder, provide the path of that folder here. The folder must exist and belong to the process creator. |
remember | Number conditional | Enables automatic reminders with the time lapse (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 should be 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 the identity validation settings. |
signProfile | Array required | List of objects containing information about each signer or approver for notification and signing. |
signProfile[x].name | String required | Name of the attachment user. |
signProfile[x].email | String required | Email address of the attachment user. |
signProfile[x].phone | String required | Phone number of the attachment user. |
signProfile[x].role | String conditional | Defines the participant's role; can be 'APPROVER' or 'SIGNER'. |
signProfile[x].order | String conditional | Defines the order in which the notification process for signing or approval will occur. |
signProfile[x].label | Boolean conditional | Indicates whether signature positioning will be done using labels in the PDF. |
signProfile[x].position | Array conditional | Signature positions for this signer on each page. Signature positions can be preloaded in templates. Get more information in the documentation. |
signProfile[x].type | String conditional | Identifier for the signer type if pre-saved in a template, e.g., 'co-signer'. |
signProfile[x].options | Object optional | Allows defining custom validations for a specific signer. If you want to apply individual validations per signer, this parameter accepts the same fields as the global options. You can combine global and individual validations, applying global ones by default and individual ones where special treatment is required. |
signProfile[x].camera | Boolean optional | To have individual validations per signer and require photo validation, set this parameter to true. Default is false. |
signProfile[x].otpCode | Boolean optional | To have individual validations per signer and require OTP validation, set this parameter to true. Default is false. |
signProfile[x].files | Array required | List of attachment files that will be requested from the signer. |
signProfile[x].files[x].name | String required | Name of the attachment file. |
signProfile[x].files[x].optional | Boolean optional | If any attachment file is optional, send this parameter as true. Default is false. |
Unlike POST /document/many and POST /document/upload, notification cannot be turned off here: Auco writes to every participant to ask for their files. Sending notification at the root or inside signProfile[x] returns an error — the per-signer one, SIGNER_NOTIFICATION_NOT_SUPPORTED.
🧪 Usage Examples
You can copy any of the examples according to your preferred language.
Attachment Collection Only (no document or signing)
No file, compress, document or name is sent: the process only requests attachments from the participants.
- curl
- Python
- Node.js
curl --location 'https://api.auco.ai/v1.5/ext/package/upload' \
--header 'Authorization: prk_prk_tuLlavePrivada' \
--header 'Content-Type: application/json' \
--data-raw '{
"email": "owner@auco.ai",
"message": "Cargar adjuntos de prueba",
"subject": "Solicitud de adjuntos",
"packageName": "Adjuntos sin firma",
"signProfile": [
{
"type": "anexador1",
"name": "Nombre Anexador 1",
"email": "example@auco.ai",
"phone": "+573000000000",
"files": [
{
"name": "cedula de ciudadanía"
},
{
"name": "hoja de vida",
"optional": true
}
]
}
]
}'
import requests
import json
url = "https://api.auco.ai/v1.5/ext/package/upload"
payload = json.dumps({
"email": "owner@auco.ai",
"message": "Cargar adjuntos de prueba",
"subject": "Solicitud de adjuntos",
"packageName": "Adjuntos sin firma",
"signProfile": [
{
"type": "anexador1",
"name": "Nombre Anexador 1",
"email": "example@auco.ai",
"phone": "+573000000000",
"files": [
{
"name": "cedula de ciudadanía"
},
{
"name": "hoja de vida",
"optional": True
}
]
}
]
})
headers = {
'Authorization': 'prk_prk_tuLlavePrivada',
'Content-Type': 'application/json'
}
response = requests.request("POST", url, headers=headers, data=payload)
print(response.text)
const axios = require('axios');
let data = JSON.stringify({
email: 'owner@auco.ai',
message: 'Cargar adjuntos de prueba',
subject: 'Solicitud de adjuntos',
packageName: 'Adjuntos sin firma',
signProfile: [
{
type: 'anexador1',
name: 'Nombre Anexador 1',
email: 'example@auco.ai',
phone: '+573000000000',
files: [
{
name: 'cedula de ciudadanía',
},
{
name: 'hoja de vida',
optional: true,
},
],
},
],
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.auco.ai/v1.5/ext/package/upload',
headers: {
Authorization: 'prk_tuLlavePrivada',
'Content-Type': 'application/json',
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Optional Attachments with Document Signature (PDF Base64)
- curl
- Python
- Node.js
curl --location 'https://api.auco.ai/v1.5/ext/package/upload' \
--header 'Authorization: prk_prk_tuLlavePrivada' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Contratación de prueba upload 1",
"email": "owner@auco.ai",
"message": "Cargar adjuntos de prueba",
"subject": "Solicitud de adjuntos",
"packageName": "Adjuntos api prueba",
"file": Base64,
"signProfile": [
{
"name": "Nombre Firmante 1",
"email": "example@auco.ai",
"phone": "+573000000000",
"position": [
{
"page": 1,
"x": 0.5854166461564629,
"y": 0.8034861200774693,
"w": 100,
"h": 50
}
],
"files": [
{
"name": "cedula de ciudadanía"
},
{
"name": "hoja de vida"
},
{
"name": "pasaporte",
"optional": true
}
]
}
],
}'
import requests
import json
url = "https://api.auco.ai/v1.5/ext/package/upload"
payload = json.dumps({
"name": "Contratación de prueba upload 1",
"email": "owner@auco.ai",
"message": "Cargar adjuntos de prueba",
"subject": "Solicitud de adjuntos",
"packageName": "Adjuntos api prueba",
"file": Base64,
"signProfile": [
{
"name": "Nombre Firmante 1",
"email": "example@auco.ai",
"phone": "+573000000000",
"position": [
{
"page": 1,
"x": 0.5854166461564629,
"y": 0.8034861200774693,
"w": 100,
"h": 50
}
],
"files": [
{
"name": "cedula de ciudadanía"
},
{
"name": "hoja de vida"
},
{
"name": "pasaporte",
"optional": True
}
]
}
],
})
headers = {
'Authorization': 'prk_prk_tuLlavePrivada',
'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: 'Contratación de prueba upload 1',
email: 'owner@auco.ai',
message: 'Cargar adjuntos de prueba',
subject: 'Solicitud de adjuntos',
packageName: 'Adjuntos api prueba',
file: Base64,
signProfile: [
{
name: 'Nombre Firmante 1',
email: 'example@auco.ai',
phone: '+573000000000',
position: [
{
page: 1,
x: 0.5854166461564629,
y: 0.8034861200774693,
w: 100,
h: 50,
},
],
files: [
{
name: 'cedula de ciudadanía',
},
{
name: 'hoja de vida',
},
{
name: 'pasaporte',
optional: true,
},
],
},
],
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.auco.ai/v1.5/ext/package/upload',
headers: {
Authorization: 'prk_tuLlavePrivada',
'Content-Type': 'application/json',
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
Optional Attachments with Document Signature (PDF compress and individual validations)
- curl
- Python
- Node.js
curl --location 'https://api.auco.ai/v1.5/ext/package/upload' \
--header 'Authorization: prk_private_key_company' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Prueba de Anexos Compress y validaciones individuales",
"email": "owner@auco.ai",
"message": "Cargar adjuntos de prueba",
"subject": "Solicitud de adjuntos",
"packageName": "Adjuntos api prueba 2",
"signProfile": [
{
"type": "firmante1",
"name": "Nombre Firmante 1",
"email": "example @auco.ai",
"camera": true,
"otpCode": true,
"options": {
"camera": "identification",
"whatsapp": true,
"otpCode": "email"
},
"phone": "+573000000000",
"files": [
{
"name": "cedula de ciudadanía"
},
{
"name": "hoja de vida"
},
{
"name": "pasaporte",
"optional": true
}
]
},
{
"type": "firmante2",
"name": "Nombre Firmante 2",
"email": "example2@auco.ai",
"phone": "+573000000000",
"otpCode": true,
"options": {
"otpCode": "email"
},
"files": [
{
"name": "certificado"
}
]
}
],
"compress": true
}'
import requests
import json
url = "https://api.auco.ai/v1.5/ext/package/upload"
payload = json.dumps({
"name": "Prueba de Anexos Compress y validaciones individuales",
"email": "owner@auco.ai",
"message": "Cargar adjuntos de prueba",
"subject": "Solicitud de adjuntos",
"packageName": "Adjuntos api prueba 2",
"signProfile": [
{
"type": "firmante1",
"name": "Nombre Firmante 1",
"email": "example @auco.ai",
"camera": True,
"otpCode": True,
"options": {
"camera": "identification",
"whatsapp": True,
"otpCode": "email"
},
"phone": "+573000000000",
"files": [
{
"name": "cedula de ciudadanía"
},
{
"name": "hoja de vida"
},
{
"name": "pasaporte",
"optional": True
}
]
},
{
"type": "firmante2",
"name": "Nombre Firmante 2",
"email": "example2@auco.ai",
"phone": "+573000000000",
"otpCode": True,
"options": {
"otpCode": "email"
},
"files": [
{
"name": "certificado"
}
]
}
],
"compress": True
})
headers = {
'Authorization': 'prk_private_key_company',
'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: 'Prueba de Anexos Compress y validaciones individuales',
email: 'owner@auco.ai',
message: 'Cargar adjuntos de prueba',
subject: 'Solicitud de adjuntos',
packageName: 'Adjuntos api prueba 2',
signProfile: [
{
type: 'firmante1',
name: 'Nombre Firmante 1',
email: 'example @auco.ai',
camera: true,
otpCode: true,
options: {
camera: 'identification',
whatsapp: true,
otpCode: 'email',
},
phone: '+573000000000',
files: [
{
name: 'cedula de ciudadanía',
},
{
name: 'hoja de vida',
},
{
name: 'pasaporte',
optional: true,
},
],
},
{
type: 'firmante2',
name: 'Nombre Firmante 2',
email: 'example2@auco.ai',
phone: '+573000000000',
otpCode: true,
options: {
otpCode: 'email',
},
files: [
{
name: 'certificado',
},
],
},
],
compress: true,
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.auco.ai/v1.5/ext/package/upload',
headers: {
Authorization: 'prk_private_key_company',
'Content-Type': 'application/json',
},
data: data,
};
axios
.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});
📥 Response Examples
🔹 Sending PDF in Base64 using the 'file' attribute
{
"package": "PROCESSID",
"code": "DOCUMENTCODE"
}
🔹 Attachment-only process (no document)
Since no document is created, the response only includes the package.
{
"package": "PROCESSID"
}