Combine multiple PDF files into a single document
Select multiple PDFs to merge (up to 50 files)
Maximum file size: 100MB per file
Combine up to 50 PDF files into a single document
Drag and drop to arrange PDFs in any order you want
Fast merging with immediate download
Files are automatically deleted after processing
Integrate PDF merging into your applications
Merge PDFs of any size up to 100MB per file
PDF merging is the process of combining multiple PDF documents into a single unified file. This essential tool allows you to organize scattered documents, create comprehensive reports, or consolidate related files for easier sharing and management. Our PDF Merger provides a simple, fast, and secure way to merge your documents online.
Whether you're combining chapters of a report, merging invoices, consolidating contracts, or organizing project documentation, our tool handles all scenarios with ease. Upload your files, arrange them in the desired order using our intuitive drag-and-drop interface, and get your merged PDF instantly.
Combine multiple report sections, financial statements, and appendices into a single comprehensive document.
Merge contracts, agreements, and supporting documents for complete legal documentation packages.
Combine research chapters, bibliography, and appendices for thesis and dissertation submissions.
Merge resume, cover letter, portfolio samples, and references into a single application document.
Consolidate project plans, specifications, timelines, and reports for complete project archives.
Combine property documents, inspection reports, and contracts for complete transaction files.
You can merge up to 50 PDF files in a single operation. Each file can be up to 100MB in size. For larger batch operations, consider using our API with an API key.
Yes! Our merge process maintains 100% quality. All text, images, formatting, hyperlinks, and metadata from your original PDFs are preserved exactly as they were. No compression or quality loss occurs.
Absolutely secure. All files are processed on our secure servers and are automatically deleted immediately after merging is complete. We do not store, share, or access your documents. The merge happens in real-time.
Currently, our tool does not support password-protected PDFs. You'll need to remove the password protection from your PDFs before uploading them for merging. This ensures the security of protected documents.
Yes! Use our drag-and-drop interface to reorder files any way you like. You can also use the up/down arrow buttons for precise positioning. The order shown in the list is exactly how files will be merged.
Yes! Our free web-based tool can be used for both personal and commercial purposes. For high-volume commercial use, we recommend our API service which offers better performance and automation capabilities.
Merging is typically very fast, usually taking just a few seconds depending on the number and size of your PDFs. Most merges with 5-10 files complete in under 5 seconds.
Secure Processing: All PDF merges are processed on our secure servers using industry-standard encryption. Your files are transmitted over HTTPS to ensure data privacy during upload and download.
Automatic Deletion: We take your privacy seriously. All uploaded PDFs and the generated merged file are automatically deleted from our servers within 5 seconds after the merge completes. We retain no copies of your documents.
No Data Collection: We do not collect, store, or analyze the content of your PDFs. Our system only processes the files to perform the requested merge and then removes all traces.
GDPR Compliant: Our service is fully compliant with GDPR and other international data protection regulations. You maintain full ownership of your documents throughout the merge process.
Use our API to integrate PDF merging into your applications
Free tier: Manual merges through the web interface are free.
API usage: Requires an API key and is billed at $0.01 per merge (regardless of PDF count).
Billing: Pay-as-you-go monthly billing. No prepaid credits needed.
Rate limit: 60 requests per minute for job creation, 10 requests per minute for status polling.
https://www.bastiantechnologies.com/api/pdf/merge
https://www.bastiantechnologies.com/api/pdf/merge/status/{jobId}
https://www.bastiantechnologies.com/api/pdf/merge/download/{jobId}
All API requests require an API key. Get yours from your account dashboard.
X-API-Key: your_api_key_here
The PDF Merge API uses asynchronous job processing for reliable handling of large files:
/api/pdf/merge. You'll receive a jobId immediately./api/pdf/merge/status/{jobId} to check progress until status is completed.completed, GET /api/pdf/merge/download/{jobId} to download the merged PDF.Max files: 50 PDFs | Max size per file: 100MB | Job expiry: 1 hour
pdfsorder[0,2,1]). Default: upload order# Step 1: Start merge job
curl -X POST "https://www.bastiantechnologies.com/api/pdf/merge" \
-H "X-API-Key: your_api_key_here" \
-F "pdfs=@/path/to/file1.pdf" \
-F "pdfs=@/path/to/file2.pdf" \
-F 'order=[0,1]'
# Response: {"success":true,"jobId":"abc-123-def","status":"processing",...}
# Step 2: Check status (poll until completed)
curl -X GET "https://www.bastiantechnologies.com/api/pdf/merge/status/abc-123-def" \
-H "X-API-Key: your_api_key_here"
# Response when complete: {"jobId":"abc-123-def","status":"completed","downloadUrl":"..."}
# Step 3: Download merged PDF
curl -X GET "https://www.bastiantechnologies.com/api/pdf/merge/download/abc-123-def" \
-H "X-API-Key: your_api_key_here" \
-o merged.pdf
// Step 1: Start merge job
const formData = new FormData();
formData.append('pdfs', file1);
formData.append('pdfs', file2);
formData.append('order', JSON.stringify([0, 1]));
const startResponse = await fetch('https://www.bastiantechnologies.com/api/pdf/merge', {
method: 'POST',
headers: { 'X-API-Key': 'your_api_key_here' },
body: formData
});
const { jobId } = await startResponse.json();
// Step 2: Poll for completion
let status = 'processing';
while (status === 'processing') {
await new Promise(r => setTimeout(r, 1000));
const statusRes = await fetch(`https://www.bastiantechnologies.com/api/pdf/merge/status/${jobId}`, {
headers: { 'X-API-Key': 'your_api_key_here' }
});
const data = await statusRes.json();
status = data.status;
}
// Step 3: Download merged PDF
const downloadRes = await fetch(`https://www.bastiantechnologies.com/api/pdf/merge/download/${jobId}`, {
headers: { 'X-API-Key': 'your_api_key_here' }
});
const blob = await downloadRes.blob();
import requests
import time
API_KEY = "your_api_key_here"
headers = {"X-API-Key": API_KEY}
# Step 1: Start merge job
files = [
("pdfs", open("file1.pdf", "rb")),
("pdfs", open("file2.pdf", "rb"))
]
data = {"order": "[0,1]"response = requests.post(
"https://www.bastiantechnologies.com/api/pdf/merge",
headers=headers, files=files, data=data
)
job_id = response.json()["jobId"]
# Step 2: Poll for completion
while True:
status_res = requests.get(
f"https://www.bastiantechnologies.com/api/pdf/merge/status/{job_id}",
headers=headers
)
status = status_res.json()["status"]
if status in ["completed", "failed"]:
break
time.sleep(1)
# Step 3: Download merged PDF
download_res = requests.get(
f"https://www.bastiantechnologies.com/api/pdf/merge/download/{job_id}",
headers=headers
)
with open("merged.pdf", "wb") as f:
f.write(download_res.content)
Complete workflow for PDF merging in n8n with status polling and download.
// Each PDF file must use the field name "pdfs" (plural, not "pdf")
// This is critical - using "pdf" will cause a 500 error!
Body Content Type: Form-Data
Body Parameters:
┌─────────────────────────────────────────────────────────────────┐
│ Parameter Type: n8n Binary File │
│ Name: pdfs ← Must be "pdfs" (plural) │
│ Input Data Field Name: attachment_0 │
├─────────────────────────────────────────────────────────────────┤
│ Parameter Type: n8n Binary File │
│ Name: pdfs ← Same name "pdfs" for all files │
│ Input Data Field Name: attachment_1 │
└─────────────────────────────────────────────────────────────────┘
// Add more parameters with Name: "pdfs" for additional PDF files
Node 1: Start Merge Job (HTTP Request)
Method: POST
URL: https://www.bastiantechnologies.com/api/pdf/merge
Authentication: Generic Credential Type → Header Auth
Name: X-API-Key
Value: your_api_key_here
Body Content Type: Form-Data
Body Parameters:
// For each PDF file from your input:
Parameter Type: n8n Binary File
Name: pdfs
Input Data Field Name: attachment_0 (or your binary field name)
// Repeat for second PDF:
Parameter Type: n8n Binary File
Name: pdfs
Input Data Field Name: attachment_1
// Optional: Add merge order
Parameter Type: Form Data
Name: order
Value: [0,1]
Response Format: JSON
Node 2: Check Status (Loop Until Complete)
// Add a Loop node with condition:
Continue If: {{ $json.status !== "completed" && $json.status !== "failed" }}
Max Iterations: 60 // 2 minutes max
// Inside the loop, add Wait node (1-2 seconds), then HTTP Request:
Method: GET
URL: https://www.bastiantechnologies.com/api/pdf/merge/status/{{ $('Node 1').item.json.jobId }}
Headers:
X-API-Key: your_api_key_here
Response Format: JSON
Node 3: Download Merged PDF (HTTP Request)
Method: GET
URL: {{ $('Node 2').item.json.downloadUrl }}
// Or use: https://www.bastiantechnologies.com/api/pdf/merge/download/{{ $('Node 1').item.json.jobId }}
Headers:
X-API-Key: your_api_key_here
Response Format: File
Put Output in Field: data
💡 Tip: The workflow polls every 1-2 seconds until merging completes. The final node downloads the merged PDF file.
Initial Job Response (POST /merge):
{
"success": true,
"jobId": "f28d1c02-7cfa-4d31-a8fa-951636f3528f",
"status": "processing",
"message": "Merge job started",
"statusUrl": "https://www.bastiantechnologies.com/api/pdf/merge/status/f28d1c02-...",
"downloadUrl": "https://www.bastiantechnologies.com/api/pdf/merge/download/f28d1c02-..."
}
Job Status Response (GET /merge/status/{jobId}):
{
"jobId": "f28d1c02-7cfa-4d31-a8fa-951636f3528f",
"status": "completed",
"progress": 100,
"filesCount": 2,
"totalPages": 15,
"outputSize": 2457600,
"processingTime": 1250,
"downloadUrl": "https://www.bastiantechnologies.com/api/pdf/merge/download/f28d1c02-..."
}
{
"jobId": "f28d1c02-7cfa-4d31-a8fa-951636f3528f",
"status": "failed",
"error": "Failed to process PDF: File is corrupted"
}