Intégrez facilement la signature électronique dans vos applications avec notre API RESTful complète
Connectez-vous à votre compte administrateur et créez une clé API depuis les paramètres.
Testez votre clé API en récupérant la liste de vos documents :
curl -X GET https://giga-signature.com/api/v1/documents \
-H "Authorization: Bearer YOUR_API_KEY_HERE" \
-H "Accept: application/json"
Téléversez un PDF et ajoutez des signataires :
curl -X POST https://giga-signature.com/api/v1/documents \
-H "Authorization: Bearer YOUR_API_KEY_HERE" \
-H "Accept: application/json" \
-F "file=@contrat.pdf" \
-F "name=Mon premier document" \
-F "signers[0][name]=Jean Dupont" \
-F "signers[0][email]=jean.dupont@example.com"
L'API utilise l'authentification par Bearer Token. Incluez votre clé API dans chaque requête :
Authorization: Bearer YOUR_API_KEY_HERE
const response = await fetch('https://giga-signature.com/api/v1/documents', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Accept': 'application/json'
}
});
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://giga-signature.com/api/v1/documents', [
'headers' => [
'Authorization' => 'Bearer YOUR_API_KEY_HERE',
'Accept' => 'application/json',
]
]);
Nouveauté : Gérez l'authentification programmatiquement avec ces nouveaux endpoints. Créez, révoquez et rafraîchissez vos clés API directement via l'API.
Authentifiez-vous avec vos identifiants pour recevoir une nouvelle clé API :
POST /api/v1/auth/login
const response = await fetch('https://giga-signature.com/api/v1/auth/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
body: JSON.stringify({
email: 'admin@example.com',
password: 'secure-password',
key_name: 'Production API Key' // Optionnel
})
});
const data = await response.json();
// Réponse:
{
"success": true,
"data": {
"api_key": "sk_live_1234567890abcdef",
"expires_at": "2025-12-31T23:59:59Z",
"user": {
"id": 1,
"name": "John Doe",
"email": "admin@example.com"
}
}
}
GET /api/v1/auth/me
const response = await fetch('https://giga-signature.com/api/v1/auth/me', {
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Accept': 'application/json'
}
});
// Réponse avec détails complets de l'utilisateur et ses permissions
Générez une nouvelle clé API et révoquez automatiquement l'ancienne :
POST /api/v1/auth/refresh
Attention : L'ancienne clé sera immédiatement révoquée. Mettez à jour vos applications.
POST /api/v1/auth/logout
Révoque la clé API utilisée pour cette requête.
Permissions requises : Seuls les administrateurs tenant peuvent gérer les utilisateurs.
Les permissions users.view
, users.create
, users.update
, et users.delete
sont nécessaires.
GET /api/v1/users?search=jean&role=user&page=1
search
- Recherche par nom/emailrole
- tenant_admin, user, viewerpage
- Numéro de pageper_page
- Résultats par page (max 100)tenant_admin
- Admin du tenantuser
- Utilisateur standardviewer
- Lecture seulePOST /api/v1/users
const userData = {
name: "Marie Dupont",
email: "marie.dupont@example.com",
role: "user",
password: "SecurePass123!", // Requis si send_invitation = false
send_invitation: true // Envoie un email d'invitation au lieu de définir le mot de passe
};
const response = await fetch('https://giga-signature.com/api/v1/users', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify(userData)
});
PUT /api/v1/users/{id}
Modifiez les informations d'un utilisateur, son rôle ou réinitialisez son mot de passe.
POST /api/v1/users/{id}/reset-password
Envoie un email de réinitialisation du mot de passe à l'utilisateur.
Nouveauté v1.1 : Les processus permettent de gérer des workflows complexes avec plusieurs documents et signataires, signatures séquentielles ou parallèles, et vérification OTP optionnelle.
Créez un workflow complet avec plusieurs documents et signataires :
POST /api/v1/signature-processes
const processData = {
name: "Contrat de partenariat 2025",
expires_at: "2025-12-31T23:59:59Z",
sequential_signing: false, // Signature parallèle par défaut
require_otp: true,
otp_method: "choice", // Le signataire choisit SMS ou Email
documents: [
{ document_id: "doc_abc123", order: 1 },
{ document_id: "doc_def456", order: 2 }
],
signers: [
{
name: "Jean Dupont",
email: "jean.dupont@example.com",
phone: "+33612345678",
language: "fr",
otp_method: "sms" // Override pour ce signataire
},
{
name: "Marie Martin",
email: "marie.martin@example.com",
language: "fr"
}
]
};
const response = await fetch('https://giga-signature.com/api/v1/signature-processes', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify(processData)
});
Définissez précisément où chaque signataire doit intervenir :
POST /api/v1/signature-processes/{id}/fields
signature
- Zone de signatureinitials
- Initialesdate
- Datetext
- Texte librecheckbox
- Case à cocherdropdown
- Liste déroulantepage
- Numéro de pageposition_x
- Position X (0-100%)position_y
- Position Y (0-100%)width
- Largeur (1-100%)height
- Hauteur (1-100%)const fields = {
fields: [
{
document_id: "doc_abc123",
signature_id: "sig_123", // Assigné à ce signataire
type: "signature",
label: "Signature Client",
page: 3,
position_x: 15,
position_y: 70,
width: 25,
height: 10,
required: true
},
{
document_id: "doc_abc123",
signature_id: null, // Tous les signataires
type: "date",
label: "Date de signature",
page: 3,
position_x: 70,
position_y: 85,
width: 15,
height: 5
}
]
};
POST /api/v1/signature-processes/{id}/send
Une fois les champs configurés, envoyez le processus aux signataires. Chacun recevra un email avec un lien unique pour signer.
Téléversez un PDF et définissez les signataires :
POST /api/v1/documents
const formData = new FormData();
formData.append('file', pdfFile);
formData.append('name', 'Contrat de service 2025');
formData.append('signers[0][name]', 'Jean Dupont');
formData.append('signers[0][email]', 'jean.dupont@example.com');
formData.append('signers[1][name]', 'Marie Martin');
formData.append('signers[1][email]', 'marie.martin@example.com');
const response = await fetch('https://giga-signature.com/api/v1/documents', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Accept': 'application/json'
},
body: formData
});
const document = await response.json();
console.log('Document créé:', document.data.id);
Récupérez vos documents avec pagination et filtres :
GET /api/v1/documents?status=pending&page=1
status
- pending, completed, refusedpage
- Numéro de pageper_page
- Résultats par pagesearch
- Recherche textuellefrom_date
- Date de débutto_date
- Date de fin{
"data": [...],
"meta": {
"current_page": 1,
"total": 47,
"per_page": 20
}
}
Important : Les signataires reçoivent automatiquement un email avec un lien sécurisé. L'API permet aussi de créer des signatures programmatiquement.
POST /api/v1/documents/{document_id}/signatures
const signatureData = {
signer_email: "jean.dupont@example.com",
signature_data: "data:image/png;base64,iVBORw0KGgoAAAANS...", // Image base64
otp_code: "123456", // Code reçu par email
position: {
page: 1, // Numéro de page
x: 100, // Position X
y: 650, // Position Y
width: 200, // Largeur
height: 50 // Hauteur
}
};
const response = await fetch(`https://giga-signature.com/api/v1/documents/${documentId}/signatures`, {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify(signatureData)
});
Recevez des notifications en temps réel lorsque des événements se produisent.
document.uploaded
document.completed
signature.completed
signature.refused
X-Signature
- HMAC-SHA256X-Event
- Type d'événementX-Timestamp
- Timestamp UnixContent-Type
- application/json// PHP
$payload = file_get_contents('php://input');
$signature = 'sha256=' . hash_hmac('sha256', $payload, $webhook_secret);
$is_valid = hash_equals($signature, $_SERVER['HTTP_X_SIGNATURE']);
if (!$is_valid) {
http_response_code(401);
exit('Signature invalide');
}
// Traiter l'événement
$event = json_decode($payload, true);
switch ($event['event']) {
case 'signature.completed':
// Traiter la signature
break;
}
Nouveauté : Gérez vos webhooks programmatiquement. Créez, testez et surveillez vos endpoints directement via l'API au lieu de l'interface d'administration.
Configurez un nouvel endpoint pour recevoir des événements :
POST /api/v1/webhooks
const webhookConfig = {
url: "https://api.votreapp.com/webhooks/giga-signature",
events: [
"document.uploaded",
"signature.completed",
"signature.refused",
"process.completed"
],
description: "Webhook production pour les signatures",
is_active: true
};
const response = await fetch('https://giga-signature.com/api/v1/webhooks', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify(webhookConfig)
});
const webhook = await response.json();
console.log('Secret webhook:', webhook.data.secret); // Conservez ce secret!
Important : Conservez le secret
retourné pour valider les signatures HMAC des événements.
GET /api/v1/webhooks
Récupérez la liste de tous vos webhooks configurés avec leur statut et dernière activité.
Envoyez un événement de test pour vérifier que votre endpoint fonctionne :
POST /api/v1/webhooks/{id}/test
// Teste le webhook avec un payload exemple
const response = await fetch(`https://giga-signature.com/api/v1/webhooks/${webhookId}/test`, {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE'
}
});
// Réponse avec le code HTTP et le temps de réponse
{
"success": true,
"message": "Test webhook sent successfully",
"data": {
"status": "success",
"response_code": 200,
"response_time": 0.245 // en secondes
}
}
Surveillez les tentatives de livraison et diagnostiquez les problèmes :
GET /api/v1/webhooks/{id}/logs?status=failed
status
- success, failedpage
- PaginationPUT /api/v1/webhooks/{id}
Modifiez l'URL, les événements ou activez/désactivez le webhook.
DELETE /api/v1/webhooks/{id}
Supprimez définitivement un webhook.
Créer un document, envoyer aux signataires et suivre le statut :
// 1. Créer le document
const formData = new FormData();
formData.append('file', contractFile);
formData.append('name', 'Contrat Commercial Q4 2025');
formData.append('signers[0][name]', 'Directeur Commercial');
formData.append('signers[0][email]', 'direction@company.com');
formData.append('signers[1][name]', 'Client ACME');
formData.append('signers[1][email]', 'legal@acme.com');
const createResponse = await fetch('https://giga-signature.com/api/v1/documents', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Accept': 'application/json'
},
body: formData
});
const document = await createResponse.json();
console.log('Document créé:', document.data.id);
// 2. Les signataires reçoivent automatiquement un email
// avec un lien vers la page de signature
// 3. Vérifier le statut périodiquement
const checkStatus = async () => {
const statusResponse = await fetch(`https://giga-signature.com/api/v1/documents/${document.data.id}`, {
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE',
'Accept': 'application/json'
}
});
const status = await statusResponse.json();
console.log('Statut:', status.data.status);
console.log('Signatures:', status.data.signers);
if (status.data.status === 'completed') {
// 4. Télécharger le document signé
const downloadResponse = await fetch(
`https://giga-signature.com/api/v1/documents/${document.data.id}/download/signed`,
{
headers: {
'Authorization': 'Bearer YOUR_API_KEY_HERE'
}
}
);
const blob = await downloadResponse.blob();
// Sauvegarder le fichier...
}
};
// Vérifier toutes les 30 secondes
const interval = setInterval(checkStatus, 30000);
Recevoir des notifications en temps réel sans polling :
// Endpoint webhook dans votre application (Node.js/Express)
app.post('/webhooks/giga-signature', (req, res) => {
// Vérifier la signature
const payload = JSON.stringify(req.body);
const signature = 'sha256=' + crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(payload)
.digest('hex');
if (signature !== req.headers['x-signature']) {
return res.status(401).send('Signature invalide');
}
// Traiter l'événement
const event = req.body;
switch (event.event) {
case 'document.uploaded':
console.log('Nouveau document:', event.data.document.id);
break;
case 'signature.completed':
console.log('Signature reçue:', event.data.signature);
// Mettre à jour votre base de données
updateSignatureStatus(
event.data.document.id,
event.data.signature.email,
'signed'
);
break;
case 'document.completed':
console.log('Document complété:', event.data.document);
// Envoyer une notification
sendNotification('Document signé par toutes les parties');
// Déclencher votre workflow métier
processCompletedContract(event.data.document.id);
break;
case 'signature.refused':
console.log('Signature refusée:', event.data.signature);
// Alerter l'équipe commerciale
alertSalesTeam(event.data.document, event.data.signature.refusal_reason);
break;
}
res.status(200).send('OK');
});
L'API retourne des erreurs standardisées avec des codes HTTP appropriés.
{
"error": {
"code": "validation_error",
"message": "Les données fournies sont invalides",
"errors": {
"signers.0.email": [
"L'adresse email est invalide"
],
"file": [
"Le fichier doit être un PDF"
]
}
}
}
Notre équipe est là pour vous accompagner dans l'intégration de notre API.