Mise à jour d'un modèle
Ce service permet de mettre à jour les 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 mise à jour
| Nom | Type | Description |
|---|---|---|
id | String obligatoire | Identifiant du modèle. |
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 le pré-remplissage automatique. |
PUT /template valide le corps de la même manière que POST /template : name, config, sign et signatureProfile sont obligatoires même s'ils ne changent pas, et l'API répond 400 s'il en manque un. La méthode la plus sûre consiste à partir de ce que renvoie GET /template?id=, à modifier ce dont vous avez besoin, puis à le renvoyer sans urls, que l'API n'accepte pas en écriture.
description est conservée si vous ne l'envoyez pasOmettre description dans le PUT n'efface pas la description que le modèle possède déjà : la
précédente est conservée. Pour la modifier, envoyez le nouveau texte — jusqu'à 500 caractères, sinon l'API répond
400.
Il n'existe aujourd'hui aucun moyen de laisser un modèle sans description une fois qu'il en possède une : la validation
rejette aussi bien la chaîne vide ("") que null, et omettre le champ conserve la valeur précédente. Si
vous avez besoin que le texte cesse d'être affiché, remplacez-le par le texte approprié.
Exemples de mise à jour
- curl
- Python
- Node.js
curl -X PUT https://api.auco.ai/v1.5/ext/template \
-H "Content-Type: application/json" \
-H "Authorization: prk_private_key_company" \
-d '{
"id": "64823dc5ce28a265e02d68f3",
"name": "Modification des variables du document de test",
"description": "Contrat de service avec un seul signataire, pour l'équipe commerciale",
"config": [
{
"name": "new_question",
"type": "name",
"description": "Exemple de nouvelle question"
},
{
"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 nationale d'identité",
"value": "id_card"
},
{
"name": "Pièce d'identité étrangère",
"value": "foreign_id"
}
]
},
{
"description": "Saisissez le numéro de la carte nationale d'identité du client",
"name": "client_id_card",
"type": "number",
"prereq": [
{
"k": "client_document_type",
"v": "id_card"
}
]
},
{
"description": "Saisissez le numéro de la pièce d'identité étrangère 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",
"new_question"
],
"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 = {
"id": "64823dc5ce28a265e02d68f3",
"name": "Modification des variables du document de test",
"description": "Contrat de service avec un seul signataire, pour l'équipe commerciale",
"config": [
{
"name": "new_question",
"type": "name",
"description": "Exemple de nouvelle question"
},
{
"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 nationale d'identité",
"value": "id_card"
},
{
"name": "Pièce d'identité étrangère",
"value": "foreign_id"
}
]
},
{
"description": "Saisissez le numéro de la carte nationale d'identité du client",
"name": "client_id_card",
"type": "number",
"prereq": [
{
"k": "client_document_type",
"v": "id_card"
}
]
},
{
"description": "Saisissez le numéro de la pièce d'identité étrangère 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",
"new_question"
],
"signatureProfile": [
{
"email": "client_email",
"phone": "client_phone",
"identification": "client_id_card|client_foreign_id",
"name": "client_name",
"type": "client"
}
]
}
def update_template():
url = "https://api.auco.ai/v1.5/ext/template"
headers = {
"Content-Type": "application/json",
"Authorization": "prk_private_key_company"
}
try:
response = requests.put(
url,
json=template_data,
headers=headers
)
response.raise_for_status()
result = response.json()
print("Template updated successfully!")
print(f"Mask URL: {result['urls']['mask']}")
print(f"Complete URL: {result['urls']['complete']}")
return result
except requests.exceptions.RequestException as error:
print(f"Error updating template: {error.response.json() if hasattr(error, 'response') else error}")
if __name__ == "__main__":
update_template()
const axios = require('axios');
const templateData = {
id: '64823dc5ce28a265e02d68f3',
name: 'Modification des variables du document de test',
description: 'Contrat de service avec un seul signataire, pour l'équipe commerciale',
config: [
{
name: 'new_question',
type: 'name',
description: 'Exemple de nouvelle question',
},
{
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 nationale d'identité',
value: 'id_card',
},
{
name: 'Pièce d'identité étrangère',
value: 'foreign_id',
},
],
},
{
description: 'Saisissez le numéro de la carte nationale d'identité du client',
name: 'client_id_card',
type: 'number',
prereq: [
{
k: 'client_document_type',
v: 'id_card',
},
],
},
{
description: 'Saisissez le numéro de la pièce d'identité étrangère 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',
'new_question',
],
signatureProfile: [
{
email: 'client_email',
phone: 'client_phone',
identification: 'client_id_card|client_foreign_id',
name: 'client_name',
type: 'client',
},
],
};
async function updateTemplate() {
try {
const response = await axios.put('https://api.auco.ai/v1.5/ext/template', templateData, {
headers: {
'Content-Type': 'application/json',
Authorization: 'prk_private_key_company',
},
});
console.log('Template updated successfully!');
console.log('Mask URL:', response.data.urls.mask);
console.log('Complete URL:', response.data.urls.complete);
return response.data;
} catch (error) {
console.error('Error updating template:', error.response?.data || error.message);
}
}
updateTemplate();
Exemple de réponse
{
"urls": {
"mask": "https://signed_url_mask",
"complete": "https://signed_url_complete"
}
}
Téléversement du HTML complet et du HTML masque :
Vous devrez téléverser de nouveau les fichiers HTML. Dans la réponse du service de mise à jour, vous trouverez deux URL signées, une pour chaque
HTML. Elles ont une durée de vie de 120 secondes : passé ce délai, elles ne sont plus valides. Préparez les fichiers HTML complet et HTML masque
avant de mettre à jour le modèle, puis 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):
"""
Uploads HTML files to the signed URLs
Args:
mask_url (str): Signed URL for the HTML Mask
complete_url (str): Signed URL for the HTML Complete
"""
try:
# Read HTML files
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'}
# Upload Mask HTML
response_mask = requests.put(mask_url, data=mask_html, headers=headers)
print(f"Mask HTML uploaded: {response_mask.status_code}")
# Upload Complete HTML
response_complete = requests.put(complete_url, data=complete_html, headers=headers)
print(f"Complete HTML uploaded: {response_complete.status_code}")
except requests.exceptions.RequestException as error:
print(f"Error uploading: {error}")
# Usage from the previous response
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');
/**
* Uploads HTML files to the signed URLs
* @param {string} maskUrl - Signed URL for the HTML Mask
* @param {string} completeUrl - Signed URL for the HTML Complete
*/
async function uploadHtmlFiles(maskUrl, completeUrl) {
try {
// Read HTML files
const maskHtml = fs.readFileSync('mask.html');
const completeHtml = fs.readFileSync('complete.html');
const headers = { 'Content-Type': 'binary/octet-stream' };
// Upload Mask HTML
await axios.put(maskUrl, maskHtml, { headers });
console.log('Mask HTML uploaded successfully');
// Upload Complete HTML
await axios.put(completeUrl, completeHtml, { headers });
console.log('Complete HTML uploaded successfully');
} catch (error) {
console.error('Error uploading files:', error.message);
}
}
// Usage from the previous response
const maskUrl = 'https://signed_url_mask';
const completeUrl = 'https://signed_url_complete';
uploadHtmlFiles(maskUrl, completeUrl);
Si elles expirent avant que vous ayez téléversé les fichiers, appelez de nouveau PUT /template : chaque appel renvoie de nouvelles URL.
Si vous ne mettez à jour que config, sign ou signatureProfile et que le HTML est inchangé, vous pouvez ignorer les URL renvoyées et sauter complètement le téléversement. Le serveur conservera les HTML de la version précédente.
⚠️ Réponses d'erreur
Les erreurs sont accompagnées du corps { "message": "..." }.
| Code | Description |
|---|---|
| 400 | Corps invalide ou modèle introuvable : DOCUMENT_NOT_FOUND (l'id ne correspond à aucun modèle de votre organisation), 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 absente |
Le message du validateur nomme le champ en erreur, par exemple "signatureProfile" 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.
La validation de email et phone dans signatureProfile est plus récente que de nombreux modèles. Un modèle qui se remplit encore sans problème peut être rejeté par le PUT avec PROFILE_FIELD_TYPE_INVALID, presque toujours parce que l'e-mail du signataire est demandé avec une question de type text. Changez le type de cette question en email dans le même PUT.