curl
curl --request POST \
--url https://api.iyzpdf.com/v1/pdf/merge \
--header "X-API-Key: $IYZPDF_API_KEY" \
--form "files=@cover.pdf" \
--form "files=@appendix.pdf" \
--form 'order=[0,1]' \
--output merged.pdfimport os
import requests
api_key = os.environ["IYZPDF_API_KEY"]
with open("cover.pdf", "rb") as cover_file, open("appendix.pdf", "rb") as appendix_file:
response = requests.post(
"https://api.iyzpdf.com/v1/pdf/merge",
headers={"X-API-Key": api_key},
files=[
("files", ("cover.pdf", cover_file, "application/pdf")),
("files", ("appendix.pdf", appendix_file, "application/pdf")),
],
data={"order": "[0,1]"},
timeout=60,
)
if not response.ok:
raise Exception(response.text)
with open("merged.pdf", "wb") as output_file:
output_file.write(response.content)import { readFileSync } from "node:fs";
import { writeFile } from "node:fs/promises";
const apiKey = process.env.IYZPDF_API_KEY;
const form = new FormData();
form.append("files", new Blob([readFileSync("cover.pdf")], { type: "application/pdf" }), "cover.pdf");
form.append("files", new Blob([readFileSync("appendix.pdf")], { type: "application/pdf" }), "appendix.pdf");
form.append("order", JSON.stringify([0, 1]));
const response = await fetch("https://api.iyzpdf.com/v1/pdf/merge", {
method: "POST",
headers: {
"X-API-Key": apiKey
},
body: form
});
if (!response.ok) {
throw new Error(await response.text());
}
await writeFile("merged.pdf", Buffer.from(await response.arrayBuffer()));<?php
$apiKey = getenv('IYZPDF_API_KEY');
$ch = curl_init('https://api.iyzpdf.com/v1/pdf/merge');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $apiKey,
],
CURLOPT_POSTFIELDS => [
'files[0]' => new CURLFile('cover.pdf', 'application/pdf', 'cover.pdf'),
'files[1]' => new CURLFile('appendix.pdf', 'application/pdf', 'appendix.pdf'),
'order' => json_encode([0, 1]),
],
]);
$pdf = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($pdf === false || $status !== 200) {
throw new RuntimeException('Request failed: ' . curl_error($ch) . PHP_EOL . $pdf);
}
file_put_contents('merged.pdf', $pdf);
curl_close($ch);import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MergePdfExample {
public static void main(String[] args) throws IOException {
String apiKey = System.getenv("IYZPDF_API_KEY");
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"files",
"cover.pdf",
RequestBody.create(Files.readAllBytes(Path.of("cover.pdf")), MediaType.parse("application/pdf")))
.addFormDataPart(
"files",
"appendix.pdf",
RequestBody.create(Files.readAllBytes(Path.of("appendix.pdf")), MediaType.parse("application/pdf")))
.addFormDataPart("order", "[0,1]")
.build();
Request request = new Request.Builder()
.url("https://api.iyzpdf.com/v1/pdf/merge")
.addHeader("X-API-Key", apiKey)
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful() || response.body() == null) {
String errorBody = response.body() != null ? response.body().string() : "";
throw new IOException("Request failed: " + response.code() + " " + errorBody);
}
Files.write(Path.of("merged.pdf"), response.body().bytes());
}
}
}var apiKey = Environment.GetEnvironmentVariable("IYZPDF_API_KEY");
using var client = new HttpClient();
using var form = new MultipartFormDataContent();
await using var first = File.OpenRead("cover.pdf");
await using var second = File.OpenRead("appendix.pdf");
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
form.Add(new StreamContent(first), "files", "cover.pdf");
form.Add(new StreamContent(second), "files", "appendix.pdf");
form.Add(new StringContent("[0,1]"), "order");
using var response = await client.PostAsync(
"https://api.iyzpdf.com/v1/pdf/merge",
form);
response.EnsureSuccessStatusCode();
await using var output = File.Create("merged.pdf");
await response.Content.CopyToAsync(output);{
"fileName": "output.pdf",
"size": 183240,
"creditsUsed": 1,
"creditsRemaining": 49,
"contentType": "application/pdf"
}{
"error": {
"code": "INVALID_REQUEST",
"message": "The request payload is invalid or incomplete."
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid API key."
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "You need more credits to complete this request.",
"creditsRequired": 2,
"creditsBalance": 0,
"purchaseUrl": "https://iyzpdf.com/portal/credits"
}
}{
"error": {
"code": "FILE_TOO_LARGE",
"message": "The uploaded file or request body exceeds the allowed size limit."
}
}{
"error": {
"code": "UNSUPPORTED_MEDIA_TYPE",
"message": "The uploaded file type or content type is not supported."
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please retry after the rate limit resets."
}
}{
"error": {
"code": "PROCESSING_FAILED",
"message": "The document could not be processed."
}
}PDF Editing
Merge PDF
Merge multiple PDF files into a single output document.
POST
https://api.iyzpdf.com/v1
/
pdf
/
merge
curl
curl --request POST \
--url https://api.iyzpdf.com/v1/pdf/merge \
--header "X-API-Key: $IYZPDF_API_KEY" \
--form "files=@cover.pdf" \
--form "files=@appendix.pdf" \
--form 'order=[0,1]' \
--output merged.pdfimport os
import requests
api_key = os.environ["IYZPDF_API_KEY"]
with open("cover.pdf", "rb") as cover_file, open("appendix.pdf", "rb") as appendix_file:
response = requests.post(
"https://api.iyzpdf.com/v1/pdf/merge",
headers={"X-API-Key": api_key},
files=[
("files", ("cover.pdf", cover_file, "application/pdf")),
("files", ("appendix.pdf", appendix_file, "application/pdf")),
],
data={"order": "[0,1]"},
timeout=60,
)
if not response.ok:
raise Exception(response.text)
with open("merged.pdf", "wb") as output_file:
output_file.write(response.content)import { readFileSync } from "node:fs";
import { writeFile } from "node:fs/promises";
const apiKey = process.env.IYZPDF_API_KEY;
const form = new FormData();
form.append("files", new Blob([readFileSync("cover.pdf")], { type: "application/pdf" }), "cover.pdf");
form.append("files", new Blob([readFileSync("appendix.pdf")], { type: "application/pdf" }), "appendix.pdf");
form.append("order", JSON.stringify([0, 1]));
const response = await fetch("https://api.iyzpdf.com/v1/pdf/merge", {
method: "POST",
headers: {
"X-API-Key": apiKey
},
body: form
});
if (!response.ok) {
throw new Error(await response.text());
}
await writeFile("merged.pdf", Buffer.from(await response.arrayBuffer()));<?php
$apiKey = getenv('IYZPDF_API_KEY');
$ch = curl_init('https://api.iyzpdf.com/v1/pdf/merge');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . $apiKey,
],
CURLOPT_POSTFIELDS => [
'files[0]' => new CURLFile('cover.pdf', 'application/pdf', 'cover.pdf'),
'files[1]' => new CURLFile('appendix.pdf', 'application/pdf', 'appendix.pdf'),
'order' => json_encode([0, 1]),
],
]);
$pdf = curl_exec($ch);
$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($pdf === false || $status !== 200) {
throw new RuntimeException('Request failed: ' . curl_error($ch) . PHP_EOL . $pdf);
}
file_put_contents('merged.pdf', $pdf);
curl_close($ch);import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MergePdfExample {
public static void main(String[] args) throws IOException {
String apiKey = System.getenv("IYZPDF_API_KEY");
OkHttpClient client = new OkHttpClient();
RequestBody formBody = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart(
"files",
"cover.pdf",
RequestBody.create(Files.readAllBytes(Path.of("cover.pdf")), MediaType.parse("application/pdf")))
.addFormDataPart(
"files",
"appendix.pdf",
RequestBody.create(Files.readAllBytes(Path.of("appendix.pdf")), MediaType.parse("application/pdf")))
.addFormDataPart("order", "[0,1]")
.build();
Request request = new Request.Builder()
.url("https://api.iyzpdf.com/v1/pdf/merge")
.addHeader("X-API-Key", apiKey)
.post(formBody)
.build();
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful() || response.body() == null) {
String errorBody = response.body() != null ? response.body().string() : "";
throw new IOException("Request failed: " + response.code() + " " + errorBody);
}
Files.write(Path.of("merged.pdf"), response.body().bytes());
}
}
}var apiKey = Environment.GetEnvironmentVariable("IYZPDF_API_KEY");
using var client = new HttpClient();
using var form = new MultipartFormDataContent();
await using var first = File.OpenRead("cover.pdf");
await using var second = File.OpenRead("appendix.pdf");
client.DefaultRequestHeaders.Add("X-API-Key", apiKey);
form.Add(new StreamContent(first), "files", "cover.pdf");
form.Add(new StreamContent(second), "files", "appendix.pdf");
form.Add(new StringContent("[0,1]"), "order");
using var response = await client.PostAsync(
"https://api.iyzpdf.com/v1/pdf/merge",
form);
response.EnsureSuccessStatusCode();
await using var output = File.Create("merged.pdf");
await response.Content.CopyToAsync(output);{
"fileName": "output.pdf",
"size": 183240,
"creditsUsed": 1,
"creditsRemaining": 49,
"contentType": "application/pdf"
}{
"error": {
"code": "INVALID_REQUEST",
"message": "The request payload is invalid or incomplete."
}
}{
"error": {
"code": "UNAUTHORIZED",
"message": "Missing or invalid API key."
}
}{
"error": {
"code": "INSUFFICIENT_CREDITS",
"message": "You need more credits to complete this request.",
"creditsRequired": 2,
"creditsBalance": 0,
"purchaseUrl": "https://iyzpdf.com/portal/credits"
}
}{
"error": {
"code": "FILE_TOO_LARGE",
"message": "The uploaded file or request body exceeds the allowed size limit."
}
}{
"error": {
"code": "UNSUPPORTED_MEDIA_TYPE",
"message": "The uploaded file type or content type is not supported."
}
}{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Too many requests. Please retry after the rate limit resets."
}
}{
"error": {
"code": "PROCESSING_FAILED",
"message": "The document could not be processed."
}
}Notes
- Credits:
1 - Upload between
2and20PDF files - The total authenticated upload limit is
100 MB - Every uploaded part must be a valid PDF
- Use
orderwhen the upload order is not your desired output order - The generated output file name is
merged.pdf
Authorizations
Send your server-side API key in the X-API-Key header.
Body
multipart/form-data