Get FREE Screen Watermarking with your subscription!

Funder API

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.

SOC2 Type II Certified Infrastructure
Files are encrypted in transit (TLS 1.2+) and at rest (AES-256). All downloads are logged. Files are automatically deleted and not retained in backups.
Setup time: 2-4 hours
Standard HTTP requests • Polling or webhook delivery • Most developers complete integration same day

Get Started

How It Works

The API uses asynchronous processing to handle submissions without timeouts. Choose whichever delivery method fits your workflow:

Option A: Polling (pull)

1 Submit job → Get job_id instantly

2 Poll status → Check if complete

3 Download → Get your watermarked PDFs
Option B: Webhooks (push)

1 Submit job with webhook_url → Get job_id instantly

2 We POST results to your URL when ready

3 Download → Get your watermarked PDFs

Both options return the same watermarked files. Webhooks eliminate the need to poll, making them ideal for high-volume or event-driven workflows.

Endpoints

Submit Job

POST https://aquamark-funder-broker.onrender.com/watermark-funder-broker

Check Status

GET https://aquamark-funder-broker.onrender.com/job-status/:job_id

Download (Authenticated)

GET https://aquamark-funder-broker.onrender.com/download/:job_id

Requires Bearer token. Returns the watermarked ZIP file directly. All downloads are logged for audit purposes.

Authentication

Authorization: Bearer aqua-funder-api-101060-042858-101812

This API key is universal and can be used immediately for testing.

Parameters

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 extension
url or data (required): Public URL or base64-encoded PDF
Can 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

Files Parameter Format:

Each file object must include:
name: The filename (e.g., "bank-statement-jan.pdf")
url: Public URL to the PDF file, OR
data: Base64-encoded PDF data

You can mix URL and base64 files in the same request for maximum flexibility.

Note: Examples use cURL for clarity. Translate to your preferred language (Python, JavaScript, Java, etc.). Standard HTTP requests—nothing custom.

Complete Example: Polling

1 Submit Job

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.

2 Response (instant)

{
  "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"
}

3 Poll Status

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"
}

4 Download

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

Complete Example: Webhooks

Instead of polling, add a webhook_url to your request and we'll POST the results directly to your server when the job finishes.

1 Submit Job with Webhook

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"
  }'

2 Response (instant)

{
  "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"
}

3 Webhook Delivery

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"
}

4 Download

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

Verifying Webhook Signatures

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;
}

Webhook Behavior

Retry policy: If your server returns a 5xx error or is unreachable, we retry up to 3 times with exponential backoff (2s, 4s, 8s). Client errors (4xx) are not retried.

Timeout: Your endpoint must respond within 10 seconds.

HTTPS required: Webhook URLs must use HTTPS.

Fallback: You can always poll /job-status/:job_id as a backup, even when using webhooks.

Example ZIP Contents

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.

Polling Interval

File Availability & Security

Important Notes

Unzip required. Downloads are ZIP files. Use standard extraction libraries in your language.

Storage 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.

Error Codes

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

Limits

Getting Started

To integrate watermarking API:

  1. Test: Verify integration using test parameters above (uses Aquamark branding).
  2. Ready?: Email [email protected] to request production access.
  3. Authorization: We'll authorize your company email.
  4. Upload logo: We'll provide instructions for logo upload.
  5. Billing: We'll send your first invoice after 30 days, based on usage.
  6. Go live: Deploy to production when ready.

Questions? Contact [email protected]
Privacy Policy