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

# Send multipart form data

> Build multipart requests from scalar values and Storage files.

## Submit multipart form data

Put `formData` on the first request argument. For one Storage-backed binary part, leave that part's value empty and provide `source` in options.

```js theme={null}
const response = await api.httpCall(
  {
    url: 'https://kyc.example.com/v1/reviews',
    method: 'POST',
    formData: [
      { key: 'customerId', value: api.input('customerId') },
      { key: 'document' },
    ],
  },
  {
    requestType: 'form-data',
    responseType: 'json',
    source: { storageEntryId: api.input('identityDocumentId') },
  },
);

return response.data;
```

Reference each Storage entry directly when the request contains several files:

```js theme={null}
const response = await api.httpCall(
  {
    url: 'https://archive.example.com/v1/packages',
    method: 'POST',
    formData: [
      { key: 'caseId', value: api.input('caseId') },
      { key: 'contract', storageEntryId: api.input('contractId') },
      {
        key: 'attachments',
        storageEntryId: api.input('attachmentArchiveId'),
        options: { filename: 'attachments.zip' },
      },
    ],
  },
  { requestType: 'form-data', responseType: 'json' },
);
```

The runtime creates the MIME boundary. Do not set a manual multipart `Content-Type` header without the matching generated boundary.

Continue with [http](https://docs.revoengine.com/low-code/http.md).


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