📸 Image Watermark API

Add professional timestamps and watermarks to your images

🚀

Fast Processing

High-performance image processing with Sharp

🎨

Professional Design

Modern watermark with auto text wrapping

🔒

Secure & Private

No storage - all processing in memory

📱

Responsive

Auto-adjust to any image size

Leave empty to use default address
Leave empty to use current date & time

Processing your image...

✅ Success!

Result

API Documentation

RESTful API for adding professional watermarks to images. All processing is done in-memory with no file storage.

📤 Upload from File

POST /upload

Upload an image file and add watermark

Request (multipart/form-data):

{
  "image": File,                    // Image file (required)
  "address": String,                // Custom address (optional)
  "time_created": ISO8601 DateTime, // Custom timestamp (optional)
  "format": "binary|json"           // Response format (optional, default: binary)
}

cURL Example:

curl -X POST http://localhost:3000/upload \
  -F "[email protected]" \
  -F "address=Jl. Sudirman No. 123, Jakarta" \
  -F "time_created=2024-01-15T14:30:00+07:00" \
  -o watermarked.jpg

🌐 Upload from URL

POST /upload-url

Download image from URL and add watermark

Request (application/json):

{
  "url": "https://example.com/image.jpg",  // Image URL (required)
  "address": "Custom address",              // Custom address (optional)
  "time_created": "2024-01-15T14:30:00Z",   // Custom timestamp (optional, ISO 8601)
  "format": "binary"                        // Response format (optional)
}

cURL Example:

curl -X POST http://localhost:3000/upload-url \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://example.com/image.jpg",
    "address": "Jl. Sudirman, Jakarta",
    "time_created": "2024-01-15T14:30:00+07:00",
    "format": "json"
  }'

💚 Health Check

GET /health

Check API server status

Response:

{
  "success": true,
  "message": "Service is healthy",
  "timestamp": "2025-11-11T12:00:00.000Z",
  "data": {
    "uptime": 12345,
    "memory": {...}
  }
}

Response Formats

Binary Response (default)

Returns processed image as binary data

Content-Type: image/jpeg
Content-Length: 1234567
Content-Disposition: inline; filename="watermarked-image.jpg"
X-Original-Size: 987654
X-Processed-Size: 1234567

JSON Response

Returns base64 encoded image in JSON

{
  "success": true,
  "message": "Image processed successfully",
  "timestamp": "2025-11-11T12:00:00.000Z",
  "data": {
    "image": "data:image/jpeg;base64,/9j/4AAQ...",
    "size": 1234567,
    "originalSize": 987654
  }
}

⚡ Rate Limiting

  • 100 requests per 15 minutes per IP address
  • Rate limit headers included in response
  • Returns 429 status when limit exceeded

📋 Requirements

  • Supported Formats: JPG, JPEG, PNG, WebP
  • Max File Size: 10MB
  • Address Length: Max 500 characters
  • URL Validation: Must be valid HTTP/HTTPS URL

Built with ❤️ using Node.js, Express, and Sharp

Health Check • GitHub