Passer au contenu principal
POST
/
signing-requests
/
create-and-send
@firma-dev/sdk
import { FirmaClient } from "@firma-dev/sdk";

const firma = new FirmaClient({ apiKey: "YOUR_API_KEY" });

const response = await firma.signingRequests.createAndSendSigningRequest({
    "name": "Employment Contract - John Doe",
    "description": "Full-time employment contract",
    "document": "JVBERi0xLjQKJeLjz9MK...",
    "expiration_hours": 168,
    "recipients": [
        {
            "id": "temp_signer_1",
            "first_name": "John",
            "last_name": "Doe",
            "email": "john.doe@example.com",
            "designation": "Signer",
            "order": 1,
            "phone_number": "+1-555-0123",
            "company": "Acme Corp",
            "title": "Software Engineer"
        }
    ],
    "fields": [
        {
            "recipient_id": "temp_signer_1",
            "type": "signature",
            "page": 1,
            "x": 100,
            "y": 500,
            "width": 200,
            "height": 50
        },
        {
            "recipient_id": "temp_signer_1",
            "type": "text",
            "page": 1,
            "x": 100,
            "y": 400,
            "width": 150,
            "height": 30,
            "variable_name": "phone_number",
            "required": true,
            "read_only": true
        }
    ],
    "settings": {
        "use_signing_order": true,
        "send_signing_email": true
    }
});
console.log(response);
curl --request POST \
  --url https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send \
  --header 'Authorization: <api-key>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "Employment Contract - John Doe",
  "description": "Contrat de travail à temps plein",
  "document": "JVBERi0xLjQKJeLjz9MK...",
  "expiration_hours": 168,
  "recipients": [
    {
      "id": "temp_signer_1",
      "first_name": "John",
      "last_name": "Doe",
      "email": "john.doe@example.com",
      "designation": "Signer",
      "order": 1,
      "phone_number": "+1-555-0123",
      "company": "Acme Corp",
      "title": "Ingénieur logiciel"
    }
  ],
  "fields": [
    {
      "recipient_id": "temp_signer_1",
      "type": "signature",
      "page": 1,
      "x": 100,
      "y": 500,
      "width": 200,
      "height": 50
    },
    {
      "recipient_id": "temp_signer_1",
      "type": "text",
      "page": 1,
      "x": 100,
      "y": 400,
      "width": 150,
      "height": 30,
      "variable_name": "phone_number",
      "required": true,
      "read_only": true
    }
  ],
  "settings": {
    "use_signing_order": true,
    "send_signing_email": true
  }
}
'
import requests

url = "https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send"

payload = {
    "name": "Employment Contract - John Doe",
    "description": "Contrat de travail à temps plein",
    "document": "JVBERi0xLjQKJeLjz9MK...",
    "expiration_hours": 168,
    "recipients": [
        {
            "id": "temp_signer_1",
            "first_name": "John",
            "last_name": "Doe",
            "email": "john.doe@example.com",
            "designation": "Signer",
            "order": 1,
            "phone_number": "+1-555-0123",
            "company": "Acme Corp",
            "title": "Ingénieur logiciel"
        }
    ],
    "fields": [
        {
            "recipient_id": "temp_signer_1",
            "type": "signature",
            "page": 1,
            "x": 100,
            "y": 500,
            "width": 200,
            "height": 50
        },
        {
            "recipient_id": "temp_signer_1",
            "type": "text",
            "page": 1,
            "x": 100,
            "y": 400,
            "width": 150,
            "height": 30,
            "variable_name": "phone_number",
            "required": True,
            "read_only": True
        }
    ],
    "settings": {
        "use_signing_order": True,
        "send_signing_email": True
    }
}
headers = {
    "Authorization": "<api-key>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
  method: 'POST',
  headers: {Authorization: '<api-key>', 'Content-Type': 'application/json'},
  body: JSON.stringify({
    name: 'Employment Contract - John Doe',
    description: 'Contrat de travail à temps plein',
    document: 'JVBERi0xLjQKJeLjz9MK...',
    expiration_hours: 168,
    recipients: [
      {
        id: 'temp_signer_1',
        first_name: 'John',
        last_name: 'Doe',
        email: 'john.doe@example.com',
        designation: 'Signer',
        order: 1,
        phone_number: '+1-555-0123',
        company: 'Acme Corp',
        title: 'Ingénieur logiciel'
      }
    ],
    fields: [
      {
        recipient_id: 'temp_signer_1',
        type: 'signature',
        page: 1,
        x: 100,
        y: 500,
        width: 200,
        height: 50
      },
      {
        recipient_id: 'temp_signer_1',
        type: 'text',
        page: 1,
        x: 100,
        y: 400,
        width: 150,
        height: 30,
        variable_name: 'phone_number',
        required: true,
        read_only: true
      }
    ],
    settings: {use_signing_order: true, send_signing_email: true}
  })
};

fetch('https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send', options)
  .then(res => res.json())
  .then(res => console.log(res))
  .catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'name' => 'Employment Contract - John Doe',
    'description' => 'Contrat de travail à temps plein',
    'document' => 'JVBERi0xLjQKJeLjz9MK...',
    'expiration_hours' => 168,
    'recipients' => [
        [
                'id' => 'temp_signer_1',
                'first_name' => 'John',
                'last_name' => 'Doe',
                'email' => 'john.doe@example.com',
                'designation' => 'Signer',
                'order' => 1,
                'phone_number' => '+1-555-0123',
                'company' => 'Acme Corp',
                'title' => 'Ingénieur logiciel'
        ]
    ],
    'fields' => [
        [
                'recipient_id' => 'temp_signer_1',
                'type' => 'signature',
                'page' => 1,
                'x' => 100,
                'y' => 500,
                'width' => 200,
                'height' => 50
        ],
        [
                'recipient_id' => 'temp_signer_1',
                'type' => 'text',
                'page' => 1,
                'x' => 100,
                'y' => 400,
                'width' => 150,
                'height' => 30,
                'variable_name' => 'phone_number',
                'required' => true,
                'read_only' => true
        ]
    ],
    'settings' => [
        'use_signing_order' => true,
        'send_signing_email' => true
    ]
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: <api-key>",
    "Content-Type: application/json"
  ],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send"

	payload := strings.NewReader("{\n  \"name\": \"Employment Contract - John Doe\",\n  \"description\": \"Contrat de travail à temps plein\",\n  \"document\": \"JVBERi0xLjQKJeLjz9MK...\",\n  \"expiration_hours\": 168,\n  \"recipients\": [\n    {\n      \"id\": \"temp_signer_1\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"designation\": \"Signer\",\n      \"order\": 1,\n      \"phone_number\": \"+1-555-0123\",\n      \"company\": \"Acme Corp\",\n      \"title\": \"Ingénieur logiciel\"\n    }\n  ],\n  \"fields\": [\n    {\n      \"recipient_id\": \"temp_signer_1\",\n      \"type\": \"signature\",\n      \"page\": 1,\n      \"x\": 100,\n      \"y\": 500,\n      \"width\": 200,\n      \"height\": 50\n    },\n    {\n      \"recipient_id\": \"temp_signer_1\",\n      \"type\": \"text\",\n      \"page\": 1,\n      \"x\": 100,\n      \"y\": 400,\n      \"width\": 150,\n      \"height\": 30,\n      \"variable_name\": \"phone_number\",\n      \"required\": true,\n      \"read_only\": true\n    }\n  ],\n  \"settings\": {\n    \"use_signing_order\": true,\n    \"send_signing_email\": true\n  }\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "<api-key>")
	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send")
  .header("Authorization", "<api-key>")
  .header("Content-Type", "application/json")
  .body("{\n  \"name\": \"Employment Contract - John Doe\",\n  \"description\": \"Contrat de travail à temps plein\",\n  \"document\": \"JVBERi0xLjQKJeLjz9MK...\",\n  \"expiration_hours\": 168,\n  \"recipients\": [\n    {\n      \"id\": \"temp_signer_1\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"designation\": \"Signer\",\n      \"order\": 1,\n      \"phone_number\": \"+1-555-0123\",\n      \"company\": \"Acme Corp\",\n      \"title\": \"Ingénieur logiciel\"\n    }\n  ],\n  \"fields\": [\n    {\n      \"recipient_id\": \"temp_signer_1\",\n      \"type\": \"signature\",\n      \"page\": 1,\n      \"x\": 100,\n      \"y\": 500,\n      \"width\": 200,\n      \"height\": 50\n    },\n    {\n      \"recipient_id\": \"temp_signer_1\",\n      \"type\": \"text\",\n      \"page\": 1,\n      \"x\": 100,\n      \"y\": 400,\n      \"width\": 150,\n      \"height\": 30,\n      \"variable_name\": \"phone_number\",\n      \"required\": true,\n      \"read_only\": true\n    }\n  ],\n  \"settings\": {\n    \"use_signing_order\": true,\n    \"send_signing_email\": true\n  }\n}")
  .asString();
require 'uri'
require 'net/http'

url = URI("https://api.firma.dev/functions/v1/signing-request-api/signing-requests/create-and-send")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"name\": \"Employment Contract - John Doe\",\n  \"description\": \"Contrat de travail à temps plein\",\n  \"document\": \"JVBERi0xLjQKJeLjz9MK...\",\n  \"expiration_hours\": 168,\n  \"recipients\": [\n    {\n      \"id\": \"temp_signer_1\",\n      \"first_name\": \"John\",\n      \"last_name\": \"Doe\",\n      \"email\": \"john.doe@example.com\",\n      \"designation\": \"Signer\",\n      \"order\": 1,\n      \"phone_number\": \"+1-555-0123\",\n      \"company\": \"Acme Corp\",\n      \"title\": \"Ingénieur logiciel\"\n    }\n  ],\n  \"fields\": [\n    {\n      \"recipient_id\": \"temp_signer_1\",\n      \"type\": \"signature\",\n      \"page\": 1,\n      \"x\": 100,\n      \"y\": 500,\n      \"width\": 200,\n      \"height\": 50\n    },\n    {\n      \"recipient_id\": \"temp_signer_1\",\n      \"type\": \"text\",\n      \"page\": 1,\n      \"x\": 100,\n      \"y\": 400,\n      \"width\": 150,\n      \"height\": 30,\n      \"variable_name\": \"phone_number\",\n      \"required\": true,\n      \"read_only\": true\n    }\n  ],\n  \"settings\": {\n    \"use_signing_order\": true,\n    \"send_signing_email\": true\n  }\n}"

response = http.request(request)
puts response.read_body
{ "id": "550e8400-e29b-41d4-a716-446655440000", "name": "Employment Contract - John Doe", "description": "Contrat de travail à temps plein", "status": "sent", "document_url": "https://storage.supabase.co/...", "page_count": 3, "expiration_hours": 168, "settings": { "use_signing_order": true, "allow_download": true, "attach_pdf_on_finish": true, "send_signing_email": true, "send_finish_email": true, "send_expiration_email": true, "send_cancellation_email": true, "hand_drawn_only": false }, "created_date": "2026-01-12T10:30:00Z", "sent_date": "2026-01-12T10:30:00Z", "template_id": null, "first_signer": { "id": "rec456-e89b-12d3-a456-426614174000", "name": "John Doe", "email": "john.doe@example.com", "signing_link": "https://app.firma.dev/signing/rec456-e89b-12d3-a456-426614174000" }, "recipients": [ { "id": "rec456-e89b-12d3-a456-426614174000", "first_name": "John", "last_name": "Doe", "name": "John Doe", "email": "john.doe@example.com", "designation": "Signer", "order": 1 } ], "fields": [ { "id": "field123-e89b-12d3-a456-426614174000", "type": "signature", "page": 1, "x": 100, "y": 500, "width": 200, "height": 50, "required": true, "recipient_id": "rec456-e89b-12d3-a456-426614174000" } ], "credits_remaining": 99 }

Autorisations

Authorization
string
header
requis

Clé API pour l'authentification. Utilisez votre clé API directement sans préfixe (par exemple, 'your-api-key'). Le préfixe Bearer est optionnel mais pas obligatoire.

Corps

application/json
name
string
requis

Nom de la demande de signature

Maximum string length: 255
Exemple:

"Employment Contract - John Doe"

document
string<byte>
requis

Document PDF ou DOCX encodé en base64 (mutuellement exclusif avec template_id et document_id). Les fichiers DOCX sont automatiquement convertis en PDF. Taille maximale : 50 Mo.

Exemple:

"JVBERi0xLjQKJeLjz9MKMyAwIG9iago8PC9UeXBlIC9QYWdlCi9QYXJlbnQgMSAwIFIKL1Jlc291c..."

description
string

Description de la demande de signature

Exemple:

"Full-time employment contract for Software Engineer position"

template_id
string<uuid>

ID du modèle à utiliser (mutuellement exclusif avec document et document_id)

Exemple:

"123e4567-e89b-12d3-a456-426614174000"

expiration_hours
integer
défaut:168

Nombre d'heures avant l'expiration de la demande de signature (par défaut : 168 = 7 jours)

Plage requise: x >= 1
Exemple:

168

recipients
object[]

Tableau de destinataires. Au moins un doit être un Signataire. Pour une création basée sur un document : obligatoire. Pour une création basée sur un modèle : optionnel (utilise les destinataires du modèle si omis). Utilisez template_user_id (préféré) ou order (solution de repli) pour faire correspondre les utilisateurs du modèle.

Minimum array length: 1
fields
object[]

Tableau de champs à remplir (basé sur un document uniquement)

anchor_tags
object[]

Balises d'ancrage pour le placement automatique des champs. Les marqueurs de texte dans le PDF sont localisés puis convertis en champs positionnés. Le texte d'ancrage est supprimé du PDF après traitement. Les champs créés à partir des balises d'ancrage s'ajoutent aux champs spécifiés manuellement. Disponible uniquement pour la création basée sur un document (pas pour celle basée sur un modèle).

Maximum array length: 100
reminders
object[]

Tableau de configurations de rappels

settings
object

Paramètres de la demande de signature

document_id
string<uuid>

ID d'un document précédemment téléversé (mutuellement exclusif avec document et template_id). À obtenir en appelant d'abord POST /documents.

Exemple:

"123e4567-e89b-12d3-a456-426614174000"

Réponse

Demande de signature créée et envoyée avec succès

Demande de signature créée et envoyée

id
string<uuid>
requis

ID de la demande de signature

name
string
requis

Nom de la demande de signature

status
enum<string>
requis

Toujours 'sent' pour ce endpoint

Options disponibles:
sent
description
string | null

Description de la demande de signature

document_url
string<uri>

URL signée pour accéder au document

page_count
integer

Nombre de pages du document

expiration_hours
integer

Nombre d'heures avant expiration

settings
object

Paramètres renvoyés par les endpoints de liste et de détail des demandes de signature. Les modèles utilisent le schéma TemplateSettings (sans champs d'identité).

created_date
string<date-time>
sent_date
string<date-time>

Date d'envoi de la demande

template_id
string<uuid> | null
first_signer
object

Détails du premier signataire ayant reçu l'email

recipients
object[]

Tous les destinataires avec leurs véritables UUID

fields
object[]

Tous les champs avec les véritables UUID de destinataire

credits_remaining
integer

Crédits restants pour l'entreprise après déduction