# Decoding

The responses returned by the Async API for binary requests require you to decode the data as they are encoded using `Base64` encoding. This allows the binary data to be sent as a text string, which can then be decoded back into its original form when you want to use it.

**Example Request:**

{% tabs %}
{% tab title="cURL" %}

```bash
curl --request POST \
  --url "https://async.scraperapi.com/jobs" \
  --header "Content-Type: application/json" \
  --data '{
    "apiKey": "API_KEY",
    "url": "https://pdfobject.com/pdf/sample.pdf"
  }'
```

{% endtab %}

{% tab title="Python" %}

```python
import requests

r = requests.post(
    url='https://async.scraperapi.com/jobs',
    json={
        "apiKey": "API_KEY",
        "url": "https://pdfobject.com/pdf/sample.pdf"
    }
)

print(r.text)
```

{% endtab %}

{% tab title="NodeJS" %}

```javascript
import axios from 'axios';

(async () => {
  const { data } = await axios.post(
    'https://async.scraperapi.com/jobs',
    {
      apiKey: 'API_KEY',
      url: 'https://pdfobject.com/pdf/sample.pdf'
    },
    {
      headers: { 'Content-Type': 'application/json' }
    }
  );

  console.log(data);
})();
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
$payload = json_encode(array(
"apiKey" => "API_KEY",
"url" => "https://pdfobject.com/pdf/sample.pdf"
));
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://async.scraperapi.com/jobs");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $payload);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require 'net/http'
require 'json'

uri = URI('https://async.scraperapi.com/jobs')

response = Net::HTTP.post(uri, {
"apiKey" => "API_KEY",
"url" => "https://pdfobject.com/pdf/sample.pdf"
}.to_json, "Content-Type" => "application/json")

print(response.body)
```

{% endtab %}

{% tab title="Java" %}

```java
import java.io.*;
import java.net.*;

public class Main {
    public static void main(String[] args) {
        try {
            String apiKey = "API_KEY";
            String urlString = "https://async.scraperapi.com/jobs";
            String jsonInputString = "{\"apiKey\": \"" + apiKey + "\", \"url\": \"https://pdfobject.com/pdf/sample.pdf\"}";

            URL url = new URL(urlString);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            try (OutputStream os = connection.getOutputStream()) {
                byte[] input = jsonInputString.getBytes("utf-8");
                os.write(input, 0, input.length);
            }

            int responseCode = connection.getResponseCode();
            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String inputLine;
            StringBuilder response = new StringBuilder();
            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();

            System.out.println("Response Code: " + responseCode);
            System.out.println("Response: " + response.toString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}
{% endtabs %}

**Decode the response** - Use the job ID from your response in place of \<JOB\_ID> to decode that specific result:

{% tabs %}
{% tab title="cURL" %}

```bash
curl https://async.scraperapi.com/jobs/<JOB_ID> \
  | jq -r '.response.base64EncodedBody' \
  | base64 -d > name.pdf
```

{% endtab %}

{% tab title="Python" %}

```python
import requests
import base64

r = requests.get('https://async.scraperapi.com/jobs/<JOB_ID>')
base64_encoded_body = r.json()['response']['base64EncodedBody']
pdf_data = base64.b64decode(base64_encoded_body)

with open('name.pdf', 'wb') as f:
    f.write(pdf_data)
```

{% endtab %}

{% tab title="NodeJS" %}

```javascript
import axios from 'axios';
import fs from 'fs';

(async () => {
  const response = await axios.get('https://async.scraperapi.com/jobs/<JOB_ID>');
  const base64EncodedBody = response.data.response.base64EncodedBody;
  const pdfData = Buffer.from(base64EncodedBody, 'base64');
  
  fs.writeFileSync('name.pdf', pdfData);
})();
```

{% endtab %}

{% tab title="PHP" %}

```php
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://async.scraperapi.com/jobs/<JOB_ID>");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
echo 'Curl error: ' . curl_error($ch);
curl_close($ch);
exit;
}
$data = json_decode($response, true);
if (isset($data['response']['base64EncodedBody'])) {
$base64EncodedBody = $data['response']['base64EncodedBody'];
$pdfData = base64_decode($base64EncodedBody);
file_put_contents('name.pdf', $pdfData);
echo "PDF saved as name.pdf\n";
} else {
echo "Error: base64EncodedBody not found in the response.\n";
}
curl_close($ch);
```

{% endtab %}

{% tab title="Ruby" %}

```ruby
require 'net/http'
require 'json'
require 'base64'

uri = URI('https://async.scraperapi.com/jobs/<JOB_ID>')

response = Net::HTTP.get(uri)
json_response = JSON.parse(response)
base64_encoded_body = json_response['response']['base64EncodedBody']
pdf_data = Base64.decode64(base64_encoded_body)

File.open('name.pdf', 'wb') { |file| file.write(pdf_data) }
```

{% endtab %}

{% tab title="Java" %}

```java
import java.io.*;
import java.net.*;
import java.util.Base64;

public class Main {
    public static void main(String[] args) {
        try {
            URL url = new URL("https://async.scraperapi.com/jobs/<JOB_ID>");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.setRequestProperty("Accept", "application/json");

            BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String response = in.readLine();
            in.close();

            String base64EncodedBody = response.split("\"base64EncodedBody\":\"")[1].split("\"}")[0];
            base64EncodedBody = base64EncodedBody.replaceAll("[^A-Za-z0-9+/=]", "");

            try (FileOutputStream fos = new FileOutputStream("name.pdf")) {
                fos.write(Base64.getDecoder().decode(base64EncodedBody));
            }

            System.out.println("PDF saved as name.pdf");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```

{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.scraperapi.com/asynchronous-api/decoding.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
