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

# List the documents

GET https://clients.infonite.tech/api/executions/results/{execution_id}/attachments/v1/all

Every original document the execution retrieved, described but not downloaded.

Engines do not only extract data: where the source issues a document — a *Vida Laboral* report, a tax declaration, a CIRBE report, a certificate — the original file is kept with the execution. This endpoint lists them all: what each one is (`sub_family`), its name, its content type, its size and the `id` you download it by. The catalogue of types is in [Attachments](/guides/data-models/attachments).

**The bytes are not here, on purpose.** A response carrying half a dozen PDFs inline would be enormous and mostly unwanted. Read the list, decide what you need, and fetch each file with [Download a document](api:GET/executions/results/\{execution_id}/attachments/v1/\{attachment_id}).

Results reference their own documents inline too — `attachments` inside a labor check, for instance — with the same identifiers. Both routes lead to the same files.

| Status | Meaning                                                                                                     |
| :----- | :---------------------------------------------------------------------------------------------------------- |
| `200`  | The documents. An empty list means the execution produced none.                                             |
| `202`  | `execution_still_processing` — this endpoint waits for the **whole** execution, unlike the per-family ones. |
| `404`  | No execution with that id for your application, or it has been deleted.                                     |

**Server to server only.** This call is authorised with your application secret: it belongs in your backend, never in a browser, a mobile app or anything your customer can read.

Reference: https://infonite.dev/api-reference/direct-executions/direct-executions-api/fetching-the-results/attachments/direct-executions-v-1-results-attachments-list

## Authentication

- `X-APP-SECRET` header (required) — Application Secret

## Servers

- `https://clients.infonite.tech/api` (Legacy Server, default)
- `https://clients.infonite.io/api` (Production Server)

## Request

### Path parameters

- `execution_id` (string, required) — The execution, as the acceptance response returned it.

## Response

### 200

**200 OK**One entry per document the execution retrieved: what it is, its name, its content type, its size and the `id` you download it by. **The bytes are not here**, on purpose — a body carrying half a dozen PDFs would be enormous and mostly unwanted.

- `list of object`
  - `sub_family` (enum, required) — What kind of document this is (e.g. `attachment:es-tgss-life-report`).
    - Allowed values: `attachment:attachment`, `attachment:supplier_invoice`, `attachment:client_invoice`, `attachment:es-tgss-life-report`, `attachment:es-tgss-contribution-base-report`, `attachment:es-aeat-model-100`, `attachment:es-cirbe-report`, `attachment:sepa-direct-debit-bill`
  - `id` (string, required) — Attachment identifier — use it to download the file through the execution's attachments endpoint.
  - `content_name` (string, required) — File name of the document.
  - `content_type` (string, required) — MIME type of the content.
  - `metadata` (map from string to any, required) — Extra facts about the document, as simple key-value pairs (e.g. its official verification code, its issue date).
  - `product` ("attachment", optional, default: attachment) — The product type identifier. Always `attachment`.
  - `content_hash` (string, optional) — Fingerprint of the content, to verify its integrity.

### 202

**202 Accepted**`execution_still_processing`: this one waits for the WHOLE execution, unlike the per-family endpoints — it is a single view assembled from all of them.

- `detail` (string, required) — Error message

## Errors

### 404 Not Found Error

**404 Not Found**No execution with that id for your application, or it has been deleted.

- `detail` (string, required) — Error message

### 422 Unprocessable Entity Error

Validation Error

- `detail` (list of object, optional)
  - `loc` (list of string or integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)

## Examples

### Two official documents

**Response**

```json
[
  {
    "sub_family": "attachment:es-tgss-life-report",
    "id": "6aa74d55cacbac2754cb62e4",
    "content_name": "work_life_report.pdf",
    "content_type": "application/pdf",
    "metadata": {
      "cea-id": "DEMO3E03CAB9",
      "csv-code": "DEMO0-3E03C-AB917-846EF-19093-A5A2A",
      "csv-url": "https://sandbox.infonite.tech/demo/verify",
      "document-date": "2026-09-12",
      "document-type": "attachment:es-tgss-life-report"
    },
    "product": "attachment",
    "content_hash": "d3df1044751484e3296222487667f33050fda5e1e5d80e159773bbcd2a9540212d5f64afa48e9318b2b93dca1077ad06fd79dfb64c2e58e56c6975528c024a47"
  },
  {
    "sub_family": "attachment:es-cirbe-report",
    "id": "6aa74daf9f005f6719cb62df",
    "content_name": "cirbe_report_es_cirbe_detailed.pdf",
    "content_type": "application/pdf",
    "metadata": {
      "document-date": "2026-09-12T03:28:15.068346+02:00",
      "document-type": "attachment:es-cirbe-report",
      "signature-verified": true
    },
    "product": "attachment",
    "content_hash": "80b3ad5dc1b5fec5eb7fb53ba9b9d6498ff4f2f13d82d50859445c22db0c1006c7fc66d817a17ba38523cd2b7f73a629281bb273b6081ae2c344a7c01ee195ec"
  }
]
```

**SDK Code**

```python Two official documents
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript Two official documents
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

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

```go Two official documents
package main

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

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

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

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

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

}
```

```ruby Two official documents
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all")

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

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

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

```java Two official documents
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php Two official documents
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

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

```csharp Two official documents
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift Two official documents
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

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

### The execution has not closed

**Response**

```json
{
  "detail": "execution_still_processing"
}
```

**SDK Code**

```python The execution has not closed
import requests

url = "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all"

headers = {"X-APP-SECRET": "<apiKey>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript The execution has not closed
const url = 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all';
const options = {method: 'GET', headers: {'X-APP-SECRET': '<apiKey>'}};

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

```go The execution has not closed
package main

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

func main() {

	url := "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("X-APP-SECRET", "<apiKey>")

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

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

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

}
```

```ruby The execution has not closed
require 'uri'
require 'net/http'

url = URI("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all")

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

request = Net::HTTP::Get.new(url)
request["X-APP-SECRET"] = '<apiKey>'

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

```java The execution has not closed
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all")
  .header("X-APP-SECRET", "<apiKey>")
  .asString();
```

```php The execution has not closed
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all', [
  'headers' => [
    'X-APP-SECRET' => '<apiKey>',
  ],
]);

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

```csharp The execution has not closed
using RestSharp;

var client = new RestClient("https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all");
var request = new RestRequest(Method.GET);
request.AddHeader("X-APP-SECRET", "<apiKey>");
IRestResponse response = client.Execute(request);
```

```swift The execution has not closed
import Foundation

let headers = ["X-APP-SECRET": "<apiKey>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://clients.infonite.tech/api/executions/results/6aa3d8b418d1c5dc9a8e3d36/attachments/v1/all")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

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