Lightweight document protection. Route broker submissions to our endpoint prior to ingestion into your systems. We immediately return protected PDFs—ensuring unmarked files never enter your systems where users have access. Protection includes visible broker and funder attribution and embedded metadata establishing clear chain of custody.
The API uses asynchronous processing to handle submissions without timeouts. Choose whichever delivery method fits your workflow:
webhook_url → Get job_id instantlyBoth options return the same watermarked files. Webhooks eliminate the need to poll, making them ideal for high-volume or event-driven workflows.
Requires Bearer token. Returns the watermarked ZIP file directly. All downloads are logged for audit purposes.
Authorization: Bearer aqua-funder-api-101060-042858-101812
This API key is universal and can be used immediately for testing.
| Parameter | Type | Description |
|---|---|---|
user_email |
String | Your company email (authorized funder account) Use [email protected] for testing |
broker |
String | Broker's name or email address Optional: Use a placeholder (e.g., "For Internal Use Only") if you prefer not to include broker attribution. |
files |
Array of Objects | Array of file objects, each containing:name (required): Filename with .pdf extensionurl or data (required): Public URL or base64-encoded PDFCan mix URL and base64 files in the same request |
webhook_url |
String (optional) | HTTPS URL to receive job results If provided, we POST the result to this URL on completion or failure. |
Max file size: 50MB per file
name: The filename (e.g., "bank-statement-jan.pdf")url: Public URL to the PDF file, ORdata: Base64-encoded PDF dataNote: Examples use cURL for clarity. Translate to your preferred language (Python, JavaScript, Java, etc.). Standard HTTP requests—nothing custom.
curl -X POST https://aquamark-funder-broker.onrender.com/watermark-funder-broker \
-H "Authorization: Bearer aqua-funder-api-101060-042858-101812" \
-H "Content-Type: application/json" \
-d '{
"user_email": "[email protected]",
"broker": "ABC Capital Partners",
"files": [
{
"name": "bank-statement-jan.pdf",
"url": "https://your-portal.com/submissions/jan.pdf"
},
{
"name": "bank-statement-feb.pdf",
"data": "JVBERi0xLjcKJeLjz9MK..."
},
{
"name": "bank-statement-mar.pdf",
"data": "JVBERi0xLjcKJeLjz9MK..."
},
{
"name": "credit-application.pdf",
"url": "https://your-portal.com/submissions/credit-app.pdf"
},
{
"name": "voided-check.pdf",
"data": "JVBERi0xLjcKJeLjz9MK..."
}
]
}'
Note: You can mix files with url and files with data (base64) in the same request. The data field should contain the complete base64-encoded PDF. Convert your PDF files to base64 using any standard library before sending.
{
"success": true,
"job_id": "abc-123-def-456",
"file_count": 5,
"webhook_url": null,
"message": "Watermarking job started",
"status_url": "/job-status/abc-123-def-456"
}
Use the job_id from Step 2 to check status every 10 seconds:
curl https://aquamark-funder-broker.onrender.com/job-status/abc-123-def-456
While processing:
{
"job_id": "abc-123-def-456",
"status": "processing",
"progress": "Processing file 2 of 5: bank-statement-feb.pdf",
"created_at": "2025-01-06T10:00:00Z"
}
When complete:
{
"job_id": "abc-123-def-456",
"status": "completed",
"download_url": "https://...funder-job-results/abc-123-def-456.zip?token=eyJhbG...",
"download_expires_at": "2026-02-24T19:45:22.418Z",
"authenticated_download_url": "https://aquamark-funder-broker.onrender.com/download/abc-123-def-456",
"message": "Ready for download. Signed link expires in 10 minutes. For logged/authenticated downloads, use the authenticated_download_url with your Bearer token.",
"created_at": "2025-01-06T10:00:00Z",
"completed_at": "2025-01-06T10:01:30Z"
}
On error:
{
"job_id": "abc-123-def-456",
"status": "failed",
"error_message": "Job timed out after 10 minutes",
"created_at": "2025-01-06T10:00:00Z",
"completed_at": "2025-01-06T10:10:00Z"
}
Two download methods are available:
Option A: Signed URL (direct)
Use the download_url from Step 3. No auth required, but the link expires in 10 minutes.
curl "https://...funder-job-results/abc-123-def-456.zip?token=eyJhbG..." --output watermarked.zip
Option B: Authenticated download
Use the authenticated_download_url with your Bearer token. Every download is logged with IP, timestamp, and file size.
curl -H "Authorization: Bearer aqua-funder-api-101060-042858-101812" \
https://aquamark-funder-broker.onrender.com/download/abc-123-def-456 \
--output watermarked.zip
Instead of polling, add a webhook_url to your request and we'll POST the results directly to your server when the job finishes.
curl -X POST https://aquamark-funder-broker.onrender.com/watermark-funder-broker \
-H "Authorization: Bearer aqua-funder-api-101060-042858-101812" \
-H "Content-Type: application/json" \
-d '{
"user_email": "[email protected]",
"broker": "ABC Capital Partners",
"files": [
{
"name": "bank-statement-jan.pdf",
"url": "https://your-portal.com/submissions/jan.pdf"
}
],
"webhook_url": "https://your-server.com/aquamark-webhook"
}'
{
"success": true,
"job_id": "abc-123-def-456",
"file_count": 1,
"webhook_url": "https://your-server.com/aquamark-webhook",
"message": "Watermarking job started. You will receive a webhook when processing completes.",
"status_url": "/job-status/abc-123-def-456"
}
When processing completes, we POST to your webhook_url:
On success:
POST https://your-server.com/aquamark-webhook
Headers:
Content-Type: application/json
X-Aquamark-Event: job.completed
X-Aquamark-Signature: 2ed0b90b005db9ef29a048f28a1e8acf...
X-Aquamark-Delivery: 7860e1bc-0b42-48e5-ad95-587c04c0efbe
User-Agent: Aquamark-Webhooks/1.0
Body:
{
"event": "job.completed",
"job_id": "abc-123-def-456",
"status": "completed",
"download_url": "https://...funder-job-results/abc-123-def-456.zip?token=eyJhbG...",
"download_expires_at": "2026-02-20T15:40:12.456Z",
"authenticated_download_url": "https://aquamark-funder-broker.onrender.com/download/abc-123-def-456",
"file_count": 1,
"failure_count": 0,
"elapsed_ms": 1842,
"completed_at": "2026-02-20T15:30:12.456Z"
}
On error:
{
"event": "job.failed",
"job_id": "abc-123-def-456",
"status": "failed",
"error_message": "All files failed to process",
"completed_at": "2026-02-20T15:31:00.000Z"
}
Two download options are available:
Option A: Signed URL (direct)
Use the download_url from the webhook payload. No auth required, but the link expires in 10 minutes.
curl "https://...funder-job-results/abc-123-def-456.zip?token=eyJhbG..." --output watermarked.zip
Option B: Authenticated download
Use the authenticated_download_url with your Bearer token. Every download is logged.
curl -H "Authorization: Bearer aqua-funder-api-101060-042858-101812" \
https://aquamark-funder-broker.onrender.com/download/abc-123-def-456 \
--output watermarked.zip
Each webhook includes an X-Aquamark-Signature header — an HMAC-SHA256 hash of the request body signed with your API key. Verify it to confirm the webhook came from Aquamark:
// Node.js example
const crypto = require('crypto');
function verifyWebhook(requestBody, signatureHeader, apiKey) {
const expected = crypto
.createHmac('sha256', apiKey)
.update(requestBody)
.digest('hex');
return expected === signatureHeader;
}
/job-status/:job_id as a backup, even when using webhooks.
watermarked.zip/
├── bank-statement-jan-abc-capital-partners.pdf
├── bank-statement-feb-abc-capital-partners.pdf
├── bank-statement-mar-abc-capital-partners.pdf
├── credit-application-abc-capital-partners.pdf
└── voided-check-abc-capital-partners.pdf
Each file is watermarked with your funder logo and the broker's name.
completed or failed/download/:job_id) are deleted immediately after downloadStorage tip: Watermarked files are available for download for up to 30 minutes. We recommend downloading immediately after job completion. Using the authenticated download endpoint ensures files are cleaned up automatically.
| Code | Meaning | Example Response |
|---|---|---|
| 400 | Bad request | Validation error (missing params, invalid format) |
| 401 | Invalid API key | Invalid API key |
| 403 | User not authorized | User not found or inactive |
| 404 | Job not found | Job not found |
| 410 | File expired or already downloaded | File has already been downloaded and removed, or has expired |
| 413 | File too large | File 'statement.pdf' exceeds 50MB limit |
| 429 | Rate limit exceeded | Too many requests. Please wait 15 minutes and try again. |
| 500 | Server error | Internal server error |
To integrate watermarking API:
Questions? Contact [email protected]
Privacy Policy