> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.goodflag.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.goodflag.com/_mcp/server.

# Définir l'image de signature

POST https://request-manager/api/requests/{requestId}/signatureImage
Content-Type: application/json

Définit l'image de signature manuscrite, le fuseau horaire du signataire et la raison de la signature d'une requête. La raison est authentifiée par un HMAC calculé avec la phrase secrète partagée du client.

Aucune requise. Usage privé uniquement : appelée par la page de consentement et Odisia, pas par l'application demandeuse.

Reference: https://docs.goodflag.com/rm/api-reference/documentation-api/cle-api/requests/set-signature-image

## Request

### Path parameters

- `requestId` (string, required) — L'identifiant de la requête.

### Body (application/json)

This endpoint expects an object.

- `signatureImage` (string, required) — L'image de signature, sous forme de data URI.
- `signerTimeZone` (string, required) — Le fuseau horaire utilisé pour le formatage des dates.
- `reason` (string, required) — La raison ajoutée aux signatures.
- `reasonHmac` (string, required) — Le HMAC de la raison à ajouter.

## Response

### 200

L'entité Request mise à jour.

- `id` (string, required) — L'identifiant de la requête.
- `clientId` (string, required) — L'identifiant du client.
- `params` (object, required) — Les paramètres de requête. Voir le guide d'intégration pour plus d'informations.
- `profiles` (object, required) — Les paramètres de profil. Voir le guide d'intégration pour plus d'informations.
- `status` (string, required) — Le statut de la requête.
- `created` (double, required) — La date de création de la requête.
- `updated` (double, required) — La date de dernière modification de la requête.

## Errors

### 404 Not Found Error

RequestNotFound : La requête spécifiée est introuvable.

- `status` (integer, required) — Le code de statut HTTP.
- `error` (string, required) — Le message de statut HTTP.
- `message` (string, required) — Le message d'erreur.
- `code` (string, required) — Le code d'erreur.

## Examples

**Request**

```json
{
  "signatureImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
  "signerTimeZone": "GMT+00:00",
  "reason": "Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l",
  "reasonHmac": "YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo="
}
```

**Response**

```json
{
  "id": "req_01_VLj2JEnVuuDu3nwq1hPVom3X",
  "clientId": "01",
  "params": {
    "bypassViewer": "false",
    "signerEmail": "john.doe@my-idp.com"
  },
  "profiles": {
    "default": {
      "forceScrollDocument": "false"
    }
  },
  "status": "started",
  "created": 1787667777941,
  "updated": 1787667777236
}
```

**SDK Code**

```python Requête réussie.
import requests

url = "https://request-manager/api/requests/requestId/signatureImage"

payload = {
    "signatureImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
    "signerTimeZone": "GMT+00:00",
    "reason": "Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l",
    "reasonHmac": "YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo="
}
headers = {"Content-Type": "application/json"}

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

print(response.json())
```

```javascript Requête réussie.
const url = 'https://request-manager/api/requests/requestId/signatureImage';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"signatureImage":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==","signerTimeZone":"GMT+00:00","reason":"Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l","reasonHmac":"YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo="}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go Requête réussie.
package main

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

func main() {

	url := "https://request-manager/api/requests/requestId/signatureImage"

	payload := strings.NewReader("{\n  \"signatureImage\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\",\n  \"signerTimeZone\": \"GMT+00:00\",\n  \"reason\": \"Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l\",\n  \"reasonHmac\": \"YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo=\"\n}")

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

	req.Header.Add("Content-Type", "application/json")

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

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

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby Requête réussie.
require 'uri'
require 'net/http'

url = URI("https://request-manager/api/requests/requestId/signatureImage")

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

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"signatureImage\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\",\n  \"signerTimeZone\": \"GMT+00:00\",\n  \"reason\": \"Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l\",\n  \"reasonHmac\": \"YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo=\"\n}"

response = http.request(request)
puts response.read_body
```

```java Requête réussie.
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://request-manager/api/requests/requestId/signatureImage")
  .header("Content-Type", "application/json")
  .body("{\n  \"signatureImage\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\",\n  \"signerTimeZone\": \"GMT+00:00\",\n  \"reason\": \"Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l\",\n  \"reasonHmac\": \"YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo=\"\n}")
  .asString();
```

```php Requête réussie.
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://request-manager/api/requests/requestId/signatureImage', [
  'body' => '{
  "signatureImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
  "signerTimeZone": "GMT+00:00",
  "reason": "Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l",
  "reasonHmac": "YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo="
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp Requête réussie.
using RestSharp;

var client = new RestClient("https://request-manager/api/requests/requestId/signatureImage");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"signatureImage\": \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==\",\n  \"signerTimeZone\": \"GMT+00:00\",\n  \"reason\": \"Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l\",\n  \"reasonHmac\": \"YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo=\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift Requête réussie.
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "signatureImage": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==",
  "signerTimeZone": "GMT+00:00",
  "reason": "Qz1GUixPVT1ldmlfMDFfTHJTNmtEU0QzMkNQYnVtdnZNMVRCaXdTLFNVUk5BTUU9RG9lLEdJVkVOTkFNRT1Kb2huLENOPUpvaG4gRG9l",
  "reasonHmac": "YSOrbdDLFUC8wOlWG+TudSa4ZAReKefZDKmdik1YEWo="
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://request-manager/api/requests/requestId/signatureImage")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```