> ## Documentation Index
> Fetch the complete documentation index at: https://docs.quixa.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Request Body Types and File Upload

> Send JSON, URL-encoded forms, multipart forms with files, binary files or raw text/XML from any request node.

Many APIs need more than a JSON body: identity checks that require a document scan, invoice or attachment uploads, payment providers that take URL-encoded forms, or legacy services that expect XML. A request node can send each of these.

## Choosing a body type

Open a request node, go to **Body** and pick the type at the top:

| Type | Sent as | Use it for |
| - | - | - |
| **JSON** | `application/json` | Most REST APIs (default) |
| **Form URL-encoded** | `application/x-www-form-urlencoded` | Login forms, payment providers |
| **Multipart form** | `multipart/form-data` (RFC 7578) | Text fields together with one or more files |
| **Raw** | the media type you choose, e.g. `application/xml`, `text/plain` | SOAP/XML services, plain text, CSV |
| **Binary file** | the file's type or `application/octet-stream` | APIs that take the whole body as a file |
| **No body** | nothing | Requests that must not send a body |

Quixa sets the `Content-Type` header for the body itself (for multipart it includes the boundary), so you do not need to add one.

> [!NOTE]
>
> Bindings (`{{CreateCustomer.response.id}}`), QMock values (`{{QMock.person.firstName}}`) and QPlugin calls work in form field values and in raw bodies, exactly as in JSON bodies.

## Files

In a multipart form, set a field's type to **File**, then:

* **Upload** a file from your computer, or
* **Choose** a file your workspace uploaded earlier.

The file is uploaded once and stored for your workspace; the request keeps only a reference to it. The same file can be used by many requests and flows. A **Binary file** body works the same way with a single file.

* Files belong to your workspace; other workspaces cannot read or reference them.
* File contents never appear in execution results or logs; only the field name and file name are shown.
* The default limit is 25 MB per file. Accepted types include PDF, images (PNG, JPEG, GIF, WebP, TIFF), text, CSV, JSON, XML, ZIP and Office documents.

> [!WARNING]
>
> Use test documents only. Do not upload real identity documents or personal data.

## Imports

Body types are set automatically when you import:

* **OpenAPI 3.x**: `multipart/form-data` becomes a multipart form (properties with `format: binary`, `format: base64` or `contentMediaType` become file fields; `encoding.contentType` is used per part), `application/x-www-form-urlencoded` a URL-encoded form, `application/octet-stream` and image/PDF types a binary body, and XML/text a raw body.
* **Swagger 2.0**: `in: formData` parameters become form fields; `type: file` parameters become file fields.
* **Postman**: form-data, URL-encoded, raw XML/text and file bodies keep their type. The files themselves are not part of a Postman export, so file fields show **Select \<file name>** until you pick a file.

## Self-hosted installations

Files are stored on a volume (`quixa-files`, mounted at `/app/data/files`) by default. To use Azure Blob Storage instead, set:

```bash theme={null}
FileStorage__Provider=AzureBlob
FileStorage__AzureConnectionString=DefaultEndpointsProtocol=https;AccountName=example;AccountKey=YOUR_KEY;EndpointSuffix=core.windows.net
FileStorage__AzureContainer=request-files
FileStorage__MaxFileSizeMb=25
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.