Convert PDF to PDF/X with the API
Convert an existing PDF to PDF/X-1a or PDF/X-4 for print production. Provide a publicly accessible HTTPS URL or a Base64-encoded PDF, choose an ICC profile, and receive the converted PDF or a temporary download link.
PDF/X conversion through the API requires the Growth plan or higher. You can try it in the Playground on any plan.
Try in PlaygroundEndpoints
| Method | Endpoint | Successful response |
|---|---|---|
POST | /v1/tools/convert-pdfx/direct | PDF bytes with Content-Type: application/pdf |
POST | /v1/tools/convert-pdfx/sync | JSON with result metadata and a download URL when using default storage |
Both endpoints wait for conversion to complete before responding.
Authentication
Use a conversion API key in the API-KEY header.
API-KEY: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
Find your key on the API Credentials page in your Dashboard.
Convert a PDF to PDF/X from a URL
The examples use a public sample PDF. To convert your own file, set url to its direct HTTPS URL. The code examples below convert it to PDF/X-4 using the FOGRA39 profile and save the result as print-ready.pdf.
The examples use the Direct endpoint. To receive a download URL, replace /direct with /sync and read the response as JSON. The documentUrl field contains the download URL.
- Request body
- cURL
- Node.js
- Python
- PHP
- Java
- C#
- Go
- Rust
{
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}
curl --fail --show-error \
'https://api.pdfbolt.com/v1/tools/convert-pdfx/direct' \
-H 'API-KEY: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' \
-H 'Content-Type: application/json' \
-d '{
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}' \
-o print-ready.pdf
Requires Node.js 18 or later.
const fs = require('fs');
async function convertPdfToPdfX() {
const requestData = {
url: 'https://pdfbolt.com/samples/pdfx-conversion-sample.pdf',
printProduction: {
colorSpace: 'cmyk',
pdfStandard: 'pdf-x-4',
iccProfile: 'fogra39',
preserveBlack: true
}
};
const response = await fetch('https://api.pdfbolt.com/v1/tools/convert-pdfx/direct', {
method: 'POST',
headers: {
'API-KEY': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData)
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`HTTP ${response.status} - ${errorText}`);
}
const pdfBuffer = await response.arrayBuffer();
fs.writeFileSync('print-ready.pdf', Buffer.from(pdfBuffer));
console.log('PDF converted successfully');
}
convertPdfToPdfX().catch(console.error);
Install requests with pip install requests.
import requests
url = "https://api.pdfbolt.com/v1/tools/convert-pdfx/direct"
headers = {
"API-KEY": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"Content-Type": "application/json"
}
data = {
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": True
}
}
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
with open('print-ready.pdf', 'wb') as f:
f.write(response.content)
print("PDF converted successfully")
except requests.exceptions.HTTPError:
print(f"HTTP {response.status_code}")
print(f"Error Message: {response.text}")
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
Install Guzzle with composer require guzzlehttp/guzzle.
<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$headers = [
'API-KEY' => 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'Content-Type' => 'application/json',
];
$body = [
'url' => 'https://pdfbolt.com/samples/pdfx-conversion-sample.pdf',
'printProduction' => [
'colorSpace' => 'cmyk',
'pdfStandard' => 'pdf-x-4',
'iccProfile' => 'fogra39',
'preserveBlack' => true,
],
];
try {
$client = new Client();
$response = $client->post('https://api.pdfbolt.com/v1/tools/convert-pdfx/direct', [
'headers' => $headers,
'json' => $body,
]);
file_put_contents('print-ready.pdf', (string) $response->getBody());
echo "PDF converted successfully\n";
} catch (RequestException $e) {
if ($e->hasResponse()) {
echo "HTTP " . $e->getResponse()->getStatusCode() . "\n";
echo "Error Message: " . $e->getResponse()->getBody() . "\n";
} else {
echo "Error: " . $e->getMessage() . "\n";
}
}
Requires Java 17 or later.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Paths;
public class PDFBoltIntegration {
public static void main(String[] args) throws Exception {
String jsonBody = """
{
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}
""";
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.pdfbolt.com/v1/tools/convert-pdfx/direct"))
.header("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
if (response.statusCode() == 200) {
Files.write(Paths.get("print-ready.pdf"), response.body());
System.out.println("PDF converted successfully");
} else {
System.err.println("HTTP " + response.statusCode());
System.err.println("Error Message: " + new String(response.body()));
}
}
}
Use a .NET 6 or later console project.
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class PDFBoltIntegration {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
url = "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
printProduction = new {
colorSpace = "cmyk",
pdfStandard = "pdf-x-4",
iccProfile = "fogra39",
preserveBlack = true
}
};
using var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/tools/convert-pdfx/direct"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("print-ready.pdf", pdfBytes);
Console.WriteLine("PDF converted successfully");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Requires Go 1.16 or later.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
)
func main() {
data := map[string]interface{}{
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": map[string]interface{}{
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true,
},
}
jsonBody, err := json.Marshal(data)
if err != nil {
log.Fatal(err)
}
req, err := http.NewRequest("POST", "https://api.pdfbolt.com/v1/tools/convert-pdfx/direct", bytes.NewReader(jsonBody))
if err != nil {
log.Fatal(err)
}
req.Header.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
req.Header.Add("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("HTTP %d\n", resp.StatusCode)
fmt.Printf("Error Message: %s\n", string(body))
return
}
file, err := os.Create("print-ready.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}
fmt.Println("PDF converted successfully")
}
Add these dependencies to Cargo.toml:
[dependencies]
reqwest = { version = "0.13", features = ["json"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
use reqwest::Client;
use serde_json::json;
use std::fs;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let url = "https://api.pdfbolt.com/v1/tools/convert-pdfx/direct";
let request_data = json!({
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
});
let response = client
.post(url)
.header("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
.header("Content-Type", "application/json")
.json(&request_data)
.send()
.await?;
if !response.status().is_success() {
println!("HTTP {}", response.status().as_u16());
let error_text = response.text().await?;
println!("Error Message: {}", error_text);
return Ok(());
}
let pdf_bytes = response.bytes().await?;
fs::write("print-ready.pdf", pdf_bytes)?;
println!("PDF converted successfully");
Ok(())
}
Convert a Local PDF to PDF/X
Read your local PDF file and encode its contents as Base64. Replace BASE64_PDF in the examples below with the encoded data, without the data:application/pdf;base64, prefix.
- Request body
- cURL
- Node.js
- Python
- PHP
- Java
- C#
- Go
- Rust
{
"pdf": "BASE64_PDF",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}
curl --fail --show-error \
'https://api.pdfbolt.com/v1/tools/convert-pdfx/direct' \
-H 'API-KEY: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX' \
-H 'Content-Type: application/json' \
-d '{
"pdf": "BASE64_PDF",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}' \
-o print-ready.pdf
Requires Node.js 18 or later.
const fs = require('fs');
async function convertPdfToPdfX() {
const requestData = {
pdf: 'BASE64_PDF',
printProduction: {
colorSpace: 'cmyk',
pdfStandard: 'pdf-x-4',
iccProfile: 'fogra39',
preserveBlack: true
}
};
const response = await fetch('https://api.pdfbolt.com/v1/tools/convert-pdfx/direct', {
method: 'POST',
headers: {
'API-KEY': 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData)
});
if (!response.ok) {
const errorText = await response.text();
throw new Error(`HTTP ${response.status} - ${errorText}`);
}
const pdfBuffer = await response.arrayBuffer();
fs.writeFileSync('print-ready.pdf', Buffer.from(pdfBuffer));
console.log('PDF converted successfully');
}
convertPdfToPdfX().catch(console.error);
Install requests with pip install requests.
import requests
url = "https://api.pdfbolt.com/v1/tools/convert-pdfx/direct"
headers = {
"API-KEY": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"Content-Type": "application/json"
}
data = {
"pdf": "BASE64_PDF",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": True
}
}
try:
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
with open('print-ready.pdf', 'wb') as f:
f.write(response.content)
print("PDF converted successfully")
except requests.exceptions.HTTPError:
print(f"HTTP {response.status_code}")
print(f"Error Message: {response.text}")
except requests.exceptions.RequestException as e:
print(f"Error: {e}")
Install Guzzle with composer require guzzlehttp/guzzle.
<?php
require __DIR__ . '/vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
$headers = [
'API-KEY' => 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX',
'Content-Type' => 'application/json',
];
$body = [
'pdf' => 'BASE64_PDF',
'printProduction' => [
'colorSpace' => 'cmyk',
'pdfStandard' => 'pdf-x-4',
'iccProfile' => 'fogra39',
'preserveBlack' => true,
],
];
try {
$client = new Client();
$response = $client->post('https://api.pdfbolt.com/v1/tools/convert-pdfx/direct', [
'headers' => $headers,
'json' => $body,
]);
file_put_contents('print-ready.pdf', (string) $response->getBody());
echo "PDF converted successfully\n";
} catch (RequestException $e) {
if ($e->hasResponse()) {
echo "HTTP " . $e->getResponse()->getStatusCode() . "\n";
echo "Error Message: " . $e->getResponse()->getBody() . "\n";
} else {
echo "Error: " . $e->getMessage() . "\n";
}
}
Requires Java 17 or later.
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.file.Files;
import java.nio.file.Paths;
public class PDFBoltIntegration {
public static void main(String[] args) throws Exception {
String jsonBody = """
{
"pdf": "BASE64_PDF",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}
""";
var client = HttpClient.newHttpClient();
var request = HttpRequest.newBuilder()
.uri(URI.create("https://api.pdfbolt.com/v1/tools/convert-pdfx/direct"))
.header("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
var response = client.send(request, HttpResponse.BodyHandlers.ofByteArray());
if (response.statusCode() == 200) {
Files.write(Paths.get("print-ready.pdf"), response.body());
System.out.println("PDF converted successfully");
} else {
System.err.println("HTTP " + response.statusCode());
System.err.println("Error Message: " + new String(response.body()));
}
}
}
Use a .NET 6 or later console project.
using System;
using System.IO;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
public class PDFBoltIntegration {
public static async Task Main(string[] args) {
using var client = new HttpClient();
var requestData = new {
pdf = "BASE64_PDF",
printProduction = new {
colorSpace = "cmyk",
pdfStandard = "pdf-x-4",
iccProfile = "fogra39",
preserveBlack = true
}
};
using var request = new HttpRequestMessage {
Method = HttpMethod.Post,
RequestUri = new Uri("https://api.pdfbolt.com/v1/tools/convert-pdfx/direct"),
Content = new StringContent(
JsonSerializer.Serialize(requestData),
Encoding.UTF8,
"application/json"
)
};
request.Headers.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX");
try {
using var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) {
var errorContent = await response.Content.ReadAsStringAsync();
Console.WriteLine($"HTTP {(int)response.StatusCode}");
Console.WriteLine($"Error Message: {errorContent}");
return;
}
var pdfBytes = await response.Content.ReadAsByteArrayAsync();
await File.WriteAllBytesAsync("print-ready.pdf", pdfBytes);
Console.WriteLine("PDF converted successfully");
} catch (Exception ex) {
Console.WriteLine($"Error: {ex.Message}");
}
}
}
Requires Go 1.16 or later.
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"log"
"net/http"
"os"
)
func main() {
data := map[string]interface{}{
"pdf": "BASE64_PDF",
"printProduction": map[string]interface{}{
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true,
},
}
jsonBody, err := json.Marshal(data)
if err != nil {
log.Fatal(err)
}
req, err := http.NewRequest("POST", "https://api.pdfbolt.com/v1/tools/convert-pdfx/direct", bytes.NewReader(jsonBody))
if err != nil {
log.Fatal(err)
}
req.Header.Add("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
req.Header.Add("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
if resp.StatusCode != http.StatusOK {
body, err := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
fmt.Printf("HTTP %d\n", resp.StatusCode)
fmt.Printf("Error Message: %s\n", string(body))
return
}
file, err := os.Create("print-ready.pdf")
if err != nil {
log.Fatal(err)
}
defer file.Close()
if _, err := io.Copy(file, resp.Body); err != nil {
log.Fatal(err)
}
fmt.Println("PDF converted successfully")
}
Add these dependencies to Cargo.toml:
[dependencies]
reqwest = { version = "0.13", features = ["json"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }
use reqwest::Client;
use serde_json::json;
use std::fs;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client = Client::new();
let url = "https://api.pdfbolt.com/v1/tools/convert-pdfx/direct";
let request_data = json!({
"pdf": "BASE64_PDF",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
});
let response = client
.post(url)
.header("API-KEY", "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX")
.header("Content-Type", "application/json")
.json(&request_data)
.send()
.await?;
if !response.status().is_success() {
println!("HTTP {}", response.status().as_u16());
let error_text = response.text().await?;
println!("Error Message: {}", error_text);
return Ok(());
}
let pdf_bytes = response.bytes().await?;
fs::write("print-ready.pdf", pdf_bytes)?;
println!("PDF converted successfully");
Ok(())
}
Request Parameters
Set the Content-Type header to application/json. Include either url or pdf in the JSON body, not both. Encrypted or password-protected PDFs are not supported.
url
Type: string
Required: Yes, if pdf is omitted
Details: Direct, publicly accessible HTTPS URL of the input PDF. Maximum length: 2,048 characters.
URLs must not contain login credentials or fragments such as #page=2. Redirects, private network addresses, and custom headers for downloading the PDF are not supported.
Usage:
{
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf"
}
pdf
Type: string
Required: Yes, if url is omitted
Details: Base64-encoded contents of the input PDF, without the data:application/pdf;base64, prefix.
Usage:
{
"pdf": "BASE64_PDF"
}
printProduction
Type: object
Required: No
Default Value: pdfStandard: "pdf-x-4", iccProfile: "fogra39", preserveBlack: true
Details: Sets the PDF/X standard, ICC profile, and black preservation. Output is always CMYK.
Usage:
{
"url": "https://pdfbolt.com/samples/pdfx-conversion-sample.pdf",
"printProduction": {
"colorSpace": "cmyk",
"pdfStandard": "pdf-x-4",
"iccProfile": "fogra39",
"preserveBlack": true
}
}
Print Production Settings
| Parameter | Type | Default | Values | Description |
|---|---|---|---|---|
colorSpace | string | Not set | "cmyk" | Output is always CMYK. |
pdfStandard | string | "pdf-x-4" | "pdf-x-4""pdf-x-1a" | Target PDF/X standard. |
iccProfile | string | "fogra39" | "fogra39""fogra51""swop""gracol" | ICC profile used for color conversion. |
preserveBlack | boolean | true | truefalse | Keeps pure RGB black as 100% K when enabled. |
- Send only
urlorpdfto use the defaults: PDF/X-4, FOGRA39, andpreserveBlack: true. - When setting
iccProfile, also setcolorSpaceto"cmyk". - When setting
preserveBlack, setcolorSpaceto"cmyk"or includepdfStandard.
PDF/X-4 preserves live transparency. PDF/X-1a flattens transparency. Use the PDF/X standard and ICC profile required by your print provider. See Print Production for details on standards, profiles, and black preservation.
filename
Type: string
Required: No
Default Value: convert-pdfx.pdf
Details: Output PDF filename in the Content-Disposition header. Maximum 255 characters. Allowed characters: A–Z, a–z, 0–9, ., _, and -. Provide the filename with or without the .pdf extension.
Usage:
{
"pdf": "BASE64_PDF",
"filename": "print-ready.pdf"
}
contentDisposition
Type: string
Required: No
Default Value: inline
Details: Specifies whether the browser should display or download the PDF.
"inline": Display the PDF in the browser, if supported."attachment": Prompt a download.
Usage:
{
"pdf": "BASE64_PDF",
"filename": "print-ready.pdf",
"contentDisposition": "attachment"
}
customS3PresignedUrl
Type: string
Required: No
Details: Uploads the converted PDF to your S3-compatible bucket using an HTTPS pre-signed PUT URL. Available only with /v1/tools/convert-pdfx/sync. Maximum 2048 characters.
The URL must remain valid until the upload completes. On success, isCustomS3Bucket is true, and documentUrl and expiresAt are null. Omit this parameter to use PDFBolt's temporary storage.
See Uploading to Your S3 Bucket for setup details.
Usage:
{
"pdf": "BASE64_PDF",
"filename": "print-ready.pdf",
"contentDisposition": "attachment",
"customS3PresignedUrl": "https://your-bucket.s3.amazonaws.com/print-ready.pdf?<presigned-query-params>"
}
Successful Response
The response format depends on the endpoint.
- Direct
- Sync
Returns HTTP 200 with the converted PDF in the response body.
Content-Type: application/pdf
Save the response body as a PDF file. The result is not stored for later download.
Returns HTTP 200 with a JSON response containing the result metadata.
Content-Type: application/json
With PDFBolt's default storage, download the PDF from documentUrl before expiresAt (valid for 24 hours). The example below uses default storage.
{
"requestId": "db347fe5-7b72-45f6-92f9-a7b7755ab6c8",
"status": "SUCCESS",
"errorCode": null,
"errorMessage": null,
"documentUrl": "https://s3.pdfbolt.com/pdfbolt_db347fe5-7b72-92f9-a7b7755ab6_2026-11-03T10-00-00Z.pdf",
"expiresAt": "2026-11-04T10:00:00Z",
"isAsync": false,
"duration": 1840,
"documentSizeMb": 1.25,
"isCustomS3Bucket": false
}
With customS3PresignedUrl, the PDF is uploaded to your bucket. On success, isCustomS3Bucket is true, and documentUrl and expiresAt are null.
See Sync response fields for field descriptions.
Failure Response
Failed conversions consume no credits. Check errorCode and errorMessage for details before retrying.
| HTTP status | Common cause | Action |
|---|---|---|
400 | Invalid parameters, an inaccessible URL or PDF download timeout, an encrypted or invalid PDF, failed PDF/X validation, or a plan restriction. | Check errorMessage and correct the input or settings. PDF/X API access requires Growth or higher. |
400 | Custom S3 upload failed (CUSTOM_S3_UPLOAD_ERROR, Sync only). | Check the pre-signed URL and upload permissions. |
413 | The input PDF, request body, or output PDF exceeds its size limit. | Reduce the file or request size. See Limits and Credits. |
422 | The PDF/X processing time limit was exceeded (CONVERSION_TIMEOUT). | Use a smaller or less complex PDF. Retrying the same document may time out again. |
Example validation error:
{
"timestamp": "2026-11-03T10:00:00Z",
"httpErrorCode": 400,
"errorCode": "BAD_REQUEST",
"errorMessage": "PDF/X requires CMYK output."
}
See Error Handling for the error response format and other common errors.
Limits and Credits
| Limit | Value |
|---|---|
| Input files per request | 1 PDF |
| Input PDF size | 100 MB |
Encrypted, empty, and invalid PDFs are rejected.
Successful conversions cost one credit per started 5 MB of output. Failed conversions consume no credits.
Requests share your account's rate limits. The x-pdfbolt-conversion-cost response header reports the credits charged.
Processing time and output size depend on the document. PDF/X-1a conversion may take longer and produce a larger file because of transparency flattening. Both endpoints wait for conversion to finish.
Related Documentation
📄️ Generate PDFs with PDF/X Output
Generate PDF/X files from HTML, URLs, or templates.
📄️ Free PDF/X Converter
Convert PDFs to PDF/X online without an account.
📄️ OpenAPI Reference
Explore endpoint schemas and response formats.
📄️ Merge PDFs
Combine multiple PDFs into one file.
📄️ Compress PDFs
Reduce the size of existing PDF files.