> 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.

# Terminer une requête

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

Transfère le fichier de preuve signé d'une requête afin de produire les documents signés. Le fichier de preuve est authentifié 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/finish-request

## Request

### Path parameters

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

### Body (application/json)

This endpoint expects an object.

- `signedEvidence` (string, required) — Le fichier de preuve, sous forme de XML signé.
- `signedEvidenceHmac` (string, required) — Le HMAC du XML signé.

## 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

### 400 Bad Request Error

InvalidHmac : La requête contient un HMAC invalide. ; RequestHashNotConsistent : L'empreinte de la requête est incohérente dans le fichier de preuve fourni.

- `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.

### 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
{
  "signedEvidence": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...",
  "signedEvidenceHmac": "v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0="
}
```

**Response**

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

**SDK Code**

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

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

payload = {
    "signedEvidence": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...",
    "signedEvidenceHmac": "v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0="
}
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/finish';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"signedEvidence":"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...","signedEvidenceHmac":"v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0="}'
};

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/finish"

	payload := strings.NewReader("{\n  \"signedEvidence\": \"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...\",\n  \"signedEvidenceHmac\": \"v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0=\"\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/finish")

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  \"signedEvidence\": \"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...\",\n  \"signedEvidenceHmac\": \"v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0=\"\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/finish")
  .header("Content-Type", "application/json")
  .body("{\n  \"signedEvidence\": \"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...\",\n  \"signedEvidenceHmac\": \"v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0=\"\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/finish', [
  'body' => '{
  "signedEvidence": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...",
  "signedEvidenceHmac": "v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0="
}',
  '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/finish");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"signedEvidence\": \"PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...\",\n  \"signedEvidenceHmac\": \"v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0=\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

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

let headers = ["Content-Type": "application/json"]
let parameters = [
  "signedEvidence": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+PGV2aWRlbmNlPjxpZD5ldmlfMDFfTHJTNmtEU0QzMkNQYnVt...",
  "signedEvidenceHmac": "v2WN9pnp/qv0RcoWQRoanVUpf2AWMZcKUIfxentyXu0="
] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://request-manager/api/requests/requestId/finish")! 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()
```