Création de modèle
Ce service vous permet de créer des modèles personnalisés qui pourront ensuite être utilisés pour remplir des documents à signer.
/templateclé privéeprk_Authentification
Incluez votre clé privée dans l'en-tête Authorization.
Authorization: prk_xxx...
Paramètres de création
| Nom | Type | Description |
|---|---|---|
name | String obligatoire | Nom de l'automatisation. |
description | String facultatif | Texte décrivant le modèle, jusqu'à 500 caractères. |
config | Array obligatoire | Tableau de questions pour l'utilisateur. Voir Configuration JSON. |
signatureProfile | Array obligatoire | Définition des signataires et des approbateurs. Voir Profils de signature. |
sign | Array obligatoire | Noms des questions obligatoires. |
preBuild | Boolean facultatif | Si true, inclut un pré-remplissage automatique. |
description est de 500 caractèresdescription est informative : elle ne modifie pas le comportement du modèle et aide votre équipe à
reconnaître à quoi sert chaque modèle. Si vous ne l'envoyez pas, le modèle n'a pas de description. Si
le texte dépasse 500 caractères, l'API répond 400 et ne crée pas le modèle.
GET /template renvoie ce champ, aussi bien dans la liste que dans
le détail par id.
Exemples de création
- curl
- Python
- Node.js
curl -X POST https://api.auco.ai/v1.5/ext/template \
-H "Content-Type: application/json" \
-H "Authorization: prk_private_key_company" \
-d '{
"name": "Test de modification des variables du document",
"description": "Contrat de service avec un seul signataire, pour l'\''équipe commerciale",
"config": [
{
"name": "client_name",
"type": "name",
"description": "Saisissez le nom du client"
},
{
"description": "Sélectionnez le type de document du client",
"name": "client_document_type",
"type": "clausula",
"value": "id_card",
"options": [
{
"name": "Carte d'\''identité nationale",
"value": "id_card"
},
{
"name": "Carte d'\''identité d'\''étranger",
"value": "foreign_id"
}
]
},
{
"description": "Saisissez le numéro de carte d'\''identité nationale du client",
"name": "client_id_card",
"type": "number",
"prereq": [
{
"k": "client_document_type",
"v": "id_card"
}
]
},
{
"description": "Saisissez le numéro de carte d'\''étranger du client",
"name": "client_foreign_id",
"type": "number",
"prereq": [
{
"k": "client_document_type",
"v": "foreign_id"
}
]
},
{
"name": "client_email",
"type": "email",
"description": "Saisissez l'\''e-mail du client"
},
{
"name": "client_phone",
"type": "phone",
"description": "Saisissez le téléphone du client"
}
],
"sign": [
"client_name",
"client_id_card",
"client_foreign_id",
"client_email",
"client_phone"
],
"signatureProfile": [
{
"email": "client_email",
"phone": "client_phone",
"identification": "client_id_card|client_foreign_id",
"name": "client_name",
"type": "client"
}
]
}'
import requests
import json
template_data = {
"name": "Test de modification des variables du document",
"description": "Contrat de service avec un seul signataire, pour l'équipe commerciale",
"config": [
{
"name": "client_name",
"type": "name",
"description": "Saisissez le nom du client"
},
{
"description": "Sélectionnez le type de document du client",
"name": "client_document_type",
"type": "clausula",
"value": "id_card",
"options": [
{
"name": "Carte d'identité nationale",
"value": "id_card"
},
{
"name": "Carte d'identité d'étranger",
"value": "foreign_id"
}
]
},
{
"description": "Saisissez le numéro de carte d'identité nationale du client",
"name": "client_id_card",
"type": "number",
"prereq": [
{
"k": "client_document_type",
"v": "id_card"
}
]
},
{
"description": "Saisissez le numéro de carte d'étranger du client",
"name": "client_foreign_id",
"type": "number",
"prereq": [
{
"k": "client_document_type",
"v": "foreign_id"
}
]
},
{
"name": "client_email",
"type": "email",
"description": "Saisissez l'e-mail du client"
},
{
"name": "client_phone",
"type": "phone",
"description": "Saisissez le téléphone du client"
}
],
"sign": [
"client_name",
"client_id_card",
"client_foreign_id",
"client_email",
"client_phone"
],
"signatureProfile": [
{
"email": "client_email",
"phone": "client_phone",
"identification": "client_id_card|client_foreign_id",
"name": "client_name",
"type": "client"
}
]
}
def create_template():
url = "https://api.auco.ai/v1.5/ext/template"
headers = {
"Content-Type": "application/json",
"Authorization": "prk_private_key_company"
}
try:
response = requests.post(
url,
json=template_data,
headers=headers
)
response.raise_for_status()
result = response.json()
print("Modèle créé avec succès !")
print(f"ID du modèle : {result['id']}")
print(f"URL du Mask : {result['urls']['mask']}")
print(f"URL du Complete : {result['urls']['complete']}")
return result
except requests.exceptions.RequestException as error:
print(f"Erreur lors de la création du modèle : {error.response.json() if hasattr(error, 'response') else error}")
if __name__ == "__main__":
create_template()
const axios = require('axios');
const templateData = {
name: 'Test de modification des variables du document',
description: "Contrat de service avec un seul signataire, pour l'équipe commerciale",
config: [
{
name: 'client_name',
type: 'name',
description: 'Saisissez le nom du client',
},
{
description: 'Sélectionnez le type de document du client',
name: 'client_document_type',
type: 'clausula',
value: 'id_card',
options: [
{
name: "Carte d'identité nationale",
value: 'id_card',
},
{
name: "Carte d'identité d'étranger",
value: 'foreign_id',
},
],
},
{
description: "Saisissez le numéro de carte d'identité nationale du client",
name: 'client_id_card',
type: 'number',
prereq: [
{
k: 'client_document_type',
v: 'id_card',
},
],
},
{
description: "Saisissez le numéro de carte d'étranger du client",
name: 'client_foreign_id',
type: 'number',
prereq: [
{
k: 'client_document_type',
v: 'foreign_id',
},
],
},
{
name: 'client_email',
type: 'email',
description: "Saisissez l'e-mail du client",
},
{
name: 'client_phone',
type: 'phone',
description: 'Saisissez le téléphone du client',
},
],
sign: ['client_name', 'client_id_card', 'client_foreign_id', 'client_email', 'client_phone'],
signatureProfile: [
{
email: 'client_email',
phone: 'client_phone',
identification: 'client_id_card|client_foreign_id',
name: 'client_name',
type: 'client',
},
],
};
async function createTemplate() {
try {
const response = await axios.post('https://api.auco.ai/v1.5/ext/template', templateData, {
headers: {
'Content-Type': 'application/json',
Authorization: 'prk_private_key_company',
},
});
console.log('Modèle créé avec succès !');
console.log('ID du modèle :', response.data.id);
console.log('URL du Mask :', response.data.urls.mask);
console.log('URL du Complete :', response.data.urls.complete);
return response.data;
} catch (error) {
console.error('Erreur lors de la création du modèle :', error.response?.data || error.message);
}
}
createTemplate();
Exemple de réponse
{
"id": "template_id",
"urls": {
"mask": "https://signed_url_mask",
"complete": "https://signed_url_complete"
}
}
Téléversement du HTML Complete et du HTML Mask :
Dans la réponse du service de création, vous trouverez deux URL signées, une pour chaque HTML. Leur durée de vie est de
120 secondes : passé ce délai, elles ne sont plus valides. Préparez les fichiers HTML Complete et HTML Mask avant de créer le
modèle et téléversez chacun d'eux, tel quel, dans une requête PUT vers son URL.
Content-Type: binary/octet-streamLes URL sont signées pour ce type de contenu : si vous en envoyez un autre —par exemple text/html—, le téléversement est rejeté. Envoyez le fichier sans le transformer : avec curl, utilisez --data-binary et non -d, qui supprime les sauts de ligne.
- curl
- Python
- Node.js
# Upload HTML Mask
curl -X PUT https://signed_url_mask \
-H "Content-Type: binary/octet-stream" \
--data-binary @mask.html
# Upload HTML Complete
curl -X PUT https://signed_url_complete \
-H "Content-Type: binary/octet-stream" \
--data-binary @complete.html
import requests
def upload_html_files(mask_url, complete_url):
"""
Téléverse les fichiers HTML vers les URL signées
Args:
mask_url (str): URL signée du HTML Mask
complete_url (str): URL signée du HTML Complete
"""
try:
# Lire les fichiers HTML
with open('mask.html', 'rb') as f:
mask_html = f.read()
with open('complete.html', 'rb') as f:
complete_html = f.read()
headers = {'Content-Type': 'binary/octet-stream'}
# Téléverser le HTML Mask
response_mask = requests.put(mask_url, data=mask_html, headers=headers)
print(f"HTML Mask téléversé : {response_mask.status_code}")
# Téléverser le HTML Complete
response_complete = requests.put(complete_url, data=complete_html, headers=headers)
print(f"HTML Complete téléversé : {response_complete.status_code}")
except requests.exceptions.RequestException as error:
print(f"Erreur lors du téléversement : {error}")
# Utilisation à partir de la réponse précédente
mask_url = "https://signed_url_mask"
complete_url = "https://signed_url_complete"
upload_html_files(mask_url, complete_url)
const fs = require('fs');
const axios = require('axios');
/**
* Téléverse les fichiers HTML vers les URL signées
* @param {string} maskUrl - URL signée du HTML Mask
* @param {string} completeUrl - URL signée du HTML Complete
*/
async function uploadHtmlFiles(maskUrl, completeUrl) {
try {
// Lire les fichiers HTML
const maskHtml = fs.readFileSync('mask.html');
const completeHtml = fs.readFileSync('complete.html');
const headers = { 'Content-Type': 'binary/octet-stream' };
// Téléverser le HTML Mask
await axios.put(maskUrl, maskHtml, { headers });
console.log('HTML Mask téléversé avec succès');
// Téléverser le HTML Complete
await axios.put(completeUrl, completeHtml, { headers });
console.log('HTML Complete téléversé avec succès');
} catch (error) {
console.error('Erreur lors du téléversement des fichiers :', error.message);
}
}
// Utilisation à partir de la réponse précédente
const maskUrl = 'https://signed_url_mask';
const completeUrl = 'https://signed_url_complete';
uploadHtmlFiles(maskUrl, completeUrl);
Si elles expirent avant que vous ne téléversiez les fichiers, appelez PUT /template avec l'id du modèle pour obtenir de nouvelles URL. N'appelez pas à nouveau POST /template : vous créeriez un autre modèle.
⚠️ Réponses d'erreur
Les erreurs sont accompagnées du corps { "message": "..." }.
| Code | Description |
|---|---|
| 400 | Corps invalide : PAYLOAD_NOT_VALID (le corps n'est pas du JSON), PROFILE_FIELD_NOT_FOUND: <field> (l'email ou le phone d'un signataire n'est ni une question de config ni un champ de preFill), PROFILE_FIELD_TYPE_INVALID: <field> must be type <type> (il pointe vers une question d'un autre type), ou le message du validateur |
| 401 | Authentification invalide ou manquante |
Le message du validateur nomme le champ en cause, par exemple "name" is required, "config[0].maxLength" is not allowed ou "signatureProfile[0].name" must be a string. Consultez les règles de chaque champ dans Configuration JSON.