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

# Créer des parties de modèle depuis des blobs

POST https://workflow-manager/api/templates/{templateId}/blobs/parts
Content-Type: application/json

Crée des parties de modèle de parapheur à partir de blobs.

`templateManager`

Reference: https://docs.goodflag.com/wm/api-reference/documentation-api/token-portail/workflow-template-documents/create-template-parts-from-blobs

## Authentication

- `Authorization` header (bearer token, required) — Authentification Bearer par jeton utilisateur ou jeton d'accès : `Authorization: Bearer <token>`.

## Request

### Path parameters

- `templateId` (string, required) — L'identifiant du modèle de parapheur.

### Query parameters

- `unzip` (string, optional) — Indique si les archives ZIP sont décompressées.
- `pdf2pdfa` (string, optional) — Indique si les fichiers PDF sont convertis en PDF/A. Valeurs possibles : disabled, forced, auto. Sans valeur spécifiée, la valeur par défaut est auto.
- `createDocuments` (string, optional) — Indique si les documents sont créés.
- `readonly` (string, optional) — Indique si les documents créés sont en lecture seule.
- `removable` (string, optional) — Indique si les documents créés sont supprimables.
- `ignoreAttachments` (string, optional) — Indique si les pièces jointes sont ignorées.
- `signatureProfileId` (string, optional) — Le profil de signature utilisé pour signer les documents créés. S'il est vide, les documents créés sont des pièces jointes. S'il est absent, une recherche de profils de signature adaptés est effectuée.
- `confidentiality` (string, optional) — Le statut de confidentialité des pièces jointes.

### Body (application/json)

This endpoint expects an object.

- `parts` (list of object, required) — Les parties à créer.
  - `filename` (string, required) — Le nom de fichier de la partie.
  - `contentType` (string, required) — Le type de contenu de la partie.
  - `blobs` (list of string, required) — La séquence de blobs utilisée pour construire la partie.

## Response

### 200

Créer des parties de modèle depuis des blobs

- `ignoredAttachments` (long, required) — Le nombre de pièces jointes ignorées, lorsque les indicateurs createDocuments et ignoreAttachments valent true.
- `parts` (list of object, required) — Les parties créées.
  - `contentType` (string, required) — Le type de contenu de la partie.
  - `filename` (string, required) — Le nom de fichier de la partie.
  - `hash` (string, required) — L'empreinte cryptographique de la partie.
  - `size` (long, required) — La taille de la partie.
  - `isOriginal` (boolean, optional) — Indique si la partie est une partie originale ou modifiée.
  - `policyUri` (string, optional) — L'URL d'accès au PDF de la politique de signature. Sans valeur spécifiée, l'URL de la politique de signature par défaut est appliquée.
  - `visualIdentification` (string, optional) — L'identification visuelle appliquée à la partie.
- `documents` (list of object, optional) — Les documents créés, si demandés.
  - `created` (long, required) — La date de création de l'entité.
  - `displayedParts` (list of object, required) — Les parties du document affichées à l'utilisateur final.
    - `contentType` (string, required) — Le type de contenu de la partie affichée à l'utilisateur final.
    - `filename` (string, required) — Le nom de fichier de la partie affichée à l'utilisateur final.
    - `hash` (string, required) — L'empreinte cryptographique de la partie affichée à l'utilisateur final.
    - `size` (long, required) — La taille de la partie affichée à l'utilisateur final.
    - `isOriginal` (boolean, optional) — Indique si la partie affichée à l'utilisateur final est une partie originale ou modifiée.
    - `policyUri` (string, optional) — L'URL d'accès au PDF de la politique de signature. Sans valeur spécifiée, l'URL de la politique de signature par défaut est appliquée.
    - `visualIdentification` (string, optional) — L'identification visuelle appliquée à la partie.
  - `id` (string, required) — L'identifiant du document.
  - `parts` (list of object, required) — Les parties créées.
    - `contentType` (string, required) — Le type de contenu de la partie.
    - `filename` (string, required) — Le nom de fichier de la partie.
    - `hash` (string, required) — L'empreinte cryptographique de la partie.
    - `size` (long, required) — La taille de la partie.
    - `isOriginal` (boolean, optional) — Indique si la partie est une partie originale ou modifiée.
    - `policyUri` (string, optional) — L'URL d'accès au PDF de la politique de signature. Sans valeur spécifiée, l'URL de la politique de signature par défaut est appliquée.
    - `visualIdentification` (string, optional) — L'identification visuelle appliquée à la partie.
  - `readonly` (boolean, required) — Indique si le document est en lecture seule.
  - `removable` (boolean, required) — Indique si le document est supprimable.
  - `templateId` (string, required) — L'identifiant du modèle de parapheur auquel appartient le document.
  - `tenantId` (string, required) — L'identifiant du tenant auquel appartient le document.
  - `updated` (long, required) — La date de dernière modification de l'entité.
  - `confidentiality` (boolean, optional) — Le statut de confidentialité des pièces jointes.
  - `orderIndex` (long, optional) — L'index d'ordre permet de personnaliser l'ordre d'affichage des documents.
  - `signatureProfileId` (string, optional) — Le profil de signature utilisé pour signer le document. S'il est absent, le document est une pièce jointe.
  - `pdfSignatureFields` (list of any, optional) — Pour un document PDF, la liste des champs de signature que les signataires devront remplir.
  - `subOrderIndex` (double, optional) — L'index de sous-ordre permet de personnaliser l'ordre d'affichage des documents dans les dossiers.

## Errors

### 400 Bad Request Error

EncryptedPdf : Les PDF avec restrictions d'accès ou de modification ne sont pas pris en charge. Fournissez un autre PDF. ; InvalidPdf : Le PDF importé n'est pas reconnu. Vérifiez l'intégrité du fichier avec un éditeur PDF. ; InvalidXml : Le XML envoyé est invalide. ; InvalidZip : L'archive ZIP envoyée ne peut pas être décompressée. ; MaxDocumentSizeExceeded : Taille maximale de document dépassée. ; MaxDocumentSizeExceededByBlob : Taille maximale de document dépassée par les blobs. ; PasswordProtectedPdf : Les PDF protégés par mot de passe ne sont pas pris en charge. Fournissez un autre PDF. ; TenantMaxAttachmentsReached : Le nombre maximal de pièces jointes est atteint. ; TenantMaxDocumentsReached : Le nombre maximal de documents à signer est atteint.

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

### 403 Forbidden Error

AuthenticatedUserDisabled : L'utilisateur authentifié est désactivé. ; MissingBearerToken : Un jeton Bearer est requis. ; SignatureProfileDisabled : Le profil de signature spécifié est désactivé. ; SignatureProfileNotAllowed : Le profil de signature spécifié n'est pas autorisé pour ce document. ; TenantAttachmentsNotAllowed : Les pièces jointes ne sont pas autorisées par le tenant. ; TenantInactive : Le tenant est inactif et n'autorise aucune opération. ; UserGroupDisabled : Le groupe de l'utilisateur spécifié est désactivé. ; UserNotAllowed : L'utilisateur authentifié n'est pas autorisé à effectuer cette opération.

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

SignatureProfileNotFound : Le profil de signature spécifié est introuvable. ; WorkflowTemplateBlobNotFound : Le blob de modèle spécifié est introuvable. ; WorkflowTemplateNotFound : Le modèle de parapheur spécifié 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
{
  "parts": [
    {
      "filename": "document.pdf",
      "contentType": "application/pdf",
      "blobs": [
        "blb_L89sWLRJ38NB2GsNZJB9sRzs",
        "blb_Fve2QDfybVCuvY73BxkMG6Ya",
        "blb_P18bgB1rygnhfbCTHtHaUSer"
      ]
    }
  ]
}
```

**Response**

```json
{
  "ignoredAttachments": 0,
  "parts": [
    {
      "contentType": "application/pdf",
      "filename": "document.pdf",
      "hash": "O3DoQCYo2l443ulByo4hwGuxzCZwiW0Vr7K9j56AYuM=",
      "size": 18667,
      "isOriginal": true,
      "policyUri": "https://sites.banque-france.fr/igc/signature/ps/ps_1_2_250_1_115_200_300_4.pdf"
    }
  ],
  "documents": [
    {
      "created": 1782821414385,
      "displayedParts": [
        {
          "contentType": "application/pdf",
          "filename": "document.pdf",
          "hash": "O3DoQCYo2l443ulByo4hwGuxzCZwiW0Vr7K9j56AYuM=",
          "size": 18667,
          "isOriginal": true,
          "policyUri": "https://sites.banque-france.fr/igc/signature/ps/ps_1_2_250_1_115_200_300_4.pdf"
        }
      ],
      "id": "wtd_MDDqQuuSmBug7tG1yvkiYAwg",
      "parts": [
        {
          "contentType": "application/pdf",
          "filename": "document.pdf",
          "hash": "O3DoQCYo2l443ulByo4hwGuxzCZwiW0Vr7K9j56AYuM=",
          "size": 18667,
          "isOriginal": true,
          "policyUri": "https://sites.banque-france.fr/igc/signature/ps/ps_1_2_250_1_115_200_300_4.pdf"
        }
      ],
      "readonly": false,
      "removable": true,
      "templateId": "wtm_9DzH9KVajZwwB9VqWpZU9UNQ",
      "tenantId": "ten_Hm5gqY6oKADYdg9cjhsVbQDH",
      "updated": 1782821414385,
      "confidentiality": false,
      "orderIndex": 1,
      "signatureProfileId": "sip_CSRi6rm3B6QaZ8KKH8v9tcr5"
    }
  ]
}
```

**SDK Code**

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

url = "https://workflow-manager/api/templates/templateId/blobs/parts"

payload = { "parts": [
        {
            "filename": "document.pdf",
            "contentType": "application/pdf",
            "blobs": ["blb_L89sWLRJ38NB2GsNZJB9sRzs", "blb_Fve2QDfybVCuvY73BxkMG6Ya", "blb_P18bgB1rygnhfbCTHtHaUSer"]
        }
    ] }
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

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

print(response.json())
```

```javascript Requête réussie.
const url = 'https://workflow-manager/api/templates/templateId/blobs/parts';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"parts":[{"filename":"document.pdf","contentType":"application/pdf","blobs":["blb_L89sWLRJ38NB2GsNZJB9sRzs","blb_Fve2QDfybVCuvY73BxkMG6Ya","blb_P18bgB1rygnhfbCTHtHaUSer"]}]}'
};

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://workflow-manager/api/templates/templateId/blobs/parts"

	payload := strings.NewReader("{\n  \"parts\": [\n    {\n      \"filename\": \"document.pdf\",\n      \"contentType\": \"application/pdf\",\n      \"blobs\": [\n        \"blb_L89sWLRJ38NB2GsNZJB9sRzs\",\n        \"blb_Fve2QDfybVCuvY73BxkMG6Ya\",\n        \"blb_P18bgB1rygnhfbCTHtHaUSer\"\n      ]\n    }\n  ]\n}")

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

	req.Header.Add("Authorization", "Bearer <token>")
	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://workflow-manager/api/templates/templateId/blobs/parts")

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

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"parts\": [\n    {\n      \"filename\": \"document.pdf\",\n      \"contentType\": \"application/pdf\",\n      \"blobs\": [\n        \"blb_L89sWLRJ38NB2GsNZJB9sRzs\",\n        \"blb_Fve2QDfybVCuvY73BxkMG6Ya\",\n        \"blb_P18bgB1rygnhfbCTHtHaUSer\"\n      ]\n    }\n  ]\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://workflow-manager/api/templates/templateId/blobs/parts")
  .header("Authorization", "Bearer <token>")
  .header("Content-Type", "application/json")
  .body("{\n  \"parts\": [\n    {\n      \"filename\": \"document.pdf\",\n      \"contentType\": \"application/pdf\",\n      \"blobs\": [\n        \"blb_L89sWLRJ38NB2GsNZJB9sRzs\",\n        \"blb_Fve2QDfybVCuvY73BxkMG6Ya\",\n        \"blb_P18bgB1rygnhfbCTHtHaUSer\"\n      ]\n    }\n  ]\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://workflow-manager/api/templates/templateId/blobs/parts', [
  'body' => '{
  "parts": [
    {
      "filename": "document.pdf",
      "contentType": "application/pdf",
      "blobs": [
        "blb_L89sWLRJ38NB2GsNZJB9sRzs",
        "blb_Fve2QDfybVCuvY73BxkMG6Ya",
        "blb_P18bgB1rygnhfbCTHtHaUSer"
      ]
    }
  ]
}',
  'headers' => [
    'Authorization' => 'Bearer <token>',
    'Content-Type' => 'application/json',
  ],
]);

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

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

var client = new RestClient("https://workflow-manager/api/templates/templateId/blobs/parts");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"parts\": [\n    {\n      \"filename\": \"document.pdf\",\n      \"contentType\": \"application/pdf\",\n      \"blobs\": [\n        \"blb_L89sWLRJ38NB2GsNZJB9sRzs\",\n        \"blb_Fve2QDfybVCuvY73BxkMG6Ya\",\n        \"blb_P18bgB1rygnhfbCTHtHaUSer\"\n      ]\n    }\n  ]\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

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

let headers = [
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
]
let parameters = ["parts": [
    [
      "filename": "document.pdf",
      "contentType": "application/pdf",
      "blobs": ["blb_L89sWLRJ38NB2GsNZJB9sRzs", "blb_Fve2QDfybVCuvY73BxkMG6Ya", "blb_P18bgB1rygnhfbCTHtHaUSer"]
    ]
  ]] as [String : Any]

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

let request = NSMutableURLRequest(url: NSURL(string: "https://workflow-manager/api/templates/templateId/blobs/parts")! 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()
```