---
title: "DWS Processor API with other languages"
canonical_url: "https://www.nutrient.io/guides/dws-processor/supported-languages/other/"
md_url: "https://www.nutrient.io/guides/dws-processor/supported-languages/other.md"
last_updated: "2026-05-27T15:15:53.462Z"
description: "Learn how to use Nutrient DWS Processor API with any programming language to create and send your API requests."
---

# DWS Processor API with other languages

Nutrient DWS Processor API is offered as a simple HTTP-based API. That means it can be used from any programming language capable of POSTing [`multipart/form-data`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) payloads.

This guide outlines the general steps that apply, regardless of the language you choose.

To make use of Nutrient DWS Processor API, you essentially have to perform the following steps:

1. Create your `instructions` object. Refer to the [API reference](https://www.nutrient.io/api/reference/public/) for more information on how `instructions` needs to look. You can also look at any of our [tools pages](https://dashboard.nutrient.io/processor-api/playground/) to see how to use a specific function.

2. Encode the `instructions` object as a JSON object, if you didn’t already.

3. Next, assemble your `multipart/form-data` payload. Here, you need to include the `instructions` object with the name `instructions`, along with any assets with the name you use to refer to them, in the `instructions` object.

4. Finally, `POST` your multipart payload to `https://api.nutrient.io/build`, making sure to include your API key in the authorization header.

To help you picture this more clearly, below are code samples for flattening a PDF in multiple languages. They all follow the general approach for using Nutrient DWS Processor API:

### Shell

```shell

curl -X POST https://api.nutrient.io/build \
  -H "Authorization: Bearer your_api_key_here" \
  -o result.pdf \
  --fail \
  -F document.pdf=@document.pdf \
  -F instructions='{
      "parts": [
        {
          "file": "document.pdf"
        }
      ],
      "actions": [
        {
          "type": "flatten"
        }
      ]
    }'

```

### Shell (Windows)

```powershell

curl -X POST https://api.nutrient.io/build ^
  -H "Authorization: Bearer your_api_key_here" ^
  -o result.pdf ^
  --fail ^
  -F document.pdf=@document.pdf ^
  -F instructions="{\"parts\": [{\"file\": \"document.pdf\"}], \"actions\": [{\"type\": \"flatten\"}]}"

```

### Java

```java

package com.example.pspdfkit;

import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;

import org.json.JSONArray;
import org.json.JSONObject;

import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;

public final class PspdfkitApiExample {
  public static void main(final String[] args) throws IOException {
    final RequestBody body = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart(
        "document.pdf",
        "document.pdf",
        RequestBody.create(
          MediaType.parse("application/pdf"),
          new File("document.pdf")
        )
      ).addFormDataPart(
        "instructions",
        new JSONObject().put("parts", new JSONArray().put(new JSONObject().put("file", "document.pdf")
            )
          ).put("actions", new JSONArray().put(new JSONObject().put("type", "flatten")
            )
          ).toString()
      ).build();

    final Request request = new Request.Builder().url("https://api.nutrient.io/build").method("POST", body).addHeader("Authorization", "Bearer your_api_key_here").build();

    final OkHttpClient client = new OkHttpClient().newBuilder().build();

    final Response response = client.newCall(request).execute();

    if (response.isSuccessful()) {
      Files.copy(
        response.body().byteStream(),
        FileSystems.getDefault().getPath("result.pdf"),
        StandardCopyOption.REPLACE_EXISTING
      );
    } else {
      // Handle the error.
      throw new IOException(response.body().string());
    }
  }
}

```

### C#

```csharp

using System;
using System.IO;
using System.Net;
using RestSharp;

namespace PspdfkitApiDemo
{
  class Program
  {
    static void Main(string[] args)
    {
      var client = new RestClient("https://api.nutrient.io/build");

      var request = new RestRequest(Method.POST).AddHeader("Authorization", "Bearer your_api_key_here").AddFile("document.pdf", "document.pdf").AddParameter("instructions", new JsonObject
        {
          ["parts"] = new JsonArray
          {
            new JsonObject
            {
              ["file"] = "document.pdf"
            }
          },
          ["actions"] = new JsonArray
          {
            new JsonObject
            {
              ["type"] = "flatten"
            }
          }
        }.ToString());

      request.AdvancedResponseWriter = (responseStream, response) =>
      {
        if (response.StatusCode == HttpStatusCode.OK)
        {
          using (responseStream)
          {
            using var outputFileWriter = File.OpenWrite("result.pdf");
            responseStream.CopyTo(outputFileWriter);
          }
        }
        else
        {
          var responseStreamReader = new StreamReader(responseStream);
          Console.Write(responseStreamReader.ReadToEnd());
        }
      };

      client.Execute(request);
    }
  }
}

```

### JavaScript

```javascript

// This code requires Node.js. Do not run this code directly in a web browser.

const axios = require("axios");
const FormData = require("form-data");
const fs = require("fs");

const formData = new FormData();
formData.append(
  "instructions",
  JSON.stringify({
    parts: [
      {
        file: "document.pdf",
      },
    ],
    actions: [
      {
        type: "flatten",
      },
    ],
  }),
);
formData.append("document.pdf", fs.createReadStream("document.pdf"));
(async () => {
  try {
    const response = await axios.post(
      "https://api.nutrient.io/build",
      formData,
      {
        headers: formData.getHeaders({
          Authorization: "Bearer your_api_key_here",
        }),
        responseType: "stream",
      },
    );

    response.data.pipe(fs.createWriteStream("result.pdf"));
  } catch (e) {
    const errorString = await streamToString(e.response.data);
    console.log(errorString);
  }
})();

function streamToString(stream) {
  const chunks = [];
  return new Promise((resolve, reject) => {
    stream.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
    stream.on("error", (err) => reject(err));
    stream.on("end", () => resolve(Buffer.concat(chunks).toString("utf8")));
  });
}

```

### Python

```python

import requests
import json

response = requests.request(
  'POST',
  'https://api.nutrient.io/build',
  headers = {
    'Authorization': 'Bearer your_api_key_here'
  },
  files = {
    'document.pdf': open('document.pdf', 'rb')
  },
  data = {
    'instructions': json.dumps({
      'parts': [
        {
          'file': 'document.pdf'
        }
      ],
      'actions': [
        {
          'type': 'flatten'
        }
      ]
    })
  },
  stream = True
)

if response.ok:
  with open('result.pdf', 'wb') as fd:
    for chunk in response.iter_content(chunk_size=8096):
      fd.write(chunk)
else:
  print(response.text)
  exit()

```

### PHP

```php

<?php

$FileHandle = fopen('result.pdf', 'w+');

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.nutrient.io/build',
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_POSTFIELDS => array(
    'instructions' => '{
      "parts": [
        {
          "file": "document.pdf"
        }
      ],
      "actions": [
        {
          "type": "flatten"
        }
      ]
    }',
    'document.pdf' => new CURLFILE('document.pdf')
  ),
  CURLOPT_HTTPHEADER => array(
    'Authorization: Bearer your_api_key_here'
  ),
  CURLOPT_FILE => $FileHandle,
));

$response = curl_exec($curl);

curl_close($curl);

fclose($FileHandle);

```

### HTTP

```http

POST https://api.nutrient.io/build HTTP/1.1
Content-Type: multipart/form-data; boundary=--customboundary
Authorization: Bearer your_api_key_here

--customboundary
Content-Disposition: form-data; name="instructions"
Content-Type: application/json

{
  "parts": [
    {
      "file": "document.pdf"
    }
  ],
  "actions": [
    {
      "type": "flatten"
    }
  ]
}
--customboundary
Content-Disposition: form-data; name="document.pdf"; filename="document.pdf"
Content-Type: application/pdf

(document.pdf data)
--customboundary--

```
---

## Related pages

- [Supported languages](/guides/dws-processor/supported-languages.md)
- [DWS Processor API with Java](/guides/dws-processor/supported-languages/java.md)
- [DWS Processor API with C#](/guides/dws-processor/supported-languages/csharp.md)
- [Enable enhanced code completion and documentation for Claude Code using the Nutrient DWS SDK.](/guides/dws-processor/supported-languages/javascript.md)
- [DWS Processor API with PHP](/guides/dws-processor/supported-languages/php.md)
- [Enable enhanced code completion and documentation for Claude Code using the Nutrient DWS SDK.](/guides/dws-processor/supported-languages/python.md)

