Loading...
Loading...
Apply multiple watermark types to digital content -- visible overlays, invisible patterns, steganographic encoding, forensic markers, and AI fingerprints -- with full verification support.
Overlay watermarks visible to the human eye.
Imperceptible frequency-domain patterns.
Data hidden within pixel or audio samples.
Unique per-distribution markers for leak tracing.
ML-model-specific identification patterns.
import { DRD } from '@drd/sdk';
const drd = new DRD({ token: 'drd_live_sk_...' });
// Create a watermark profile
const profile = await drd.watermark.createProfile({
name: 'Forensic Image Profile',
watermarkType: 'forensic',
config: { opacity: 0, position: 'distributed', pattern: 'fingerprint' },
contentTypes: ['image/png', 'image/jpeg'],
enabled: true,
});
// Apply watermark to content
const result = await drd.watermark.apply({
profileId: profile.id,
contentId: 'content_abc123',
contentType: 'image/png',
originalHash: 'sha256:abc...',
watermarkedHash: 'sha256:def...',
});Verify watermark integrity and detect tampering with automatic hash comparison.
{
"id": "app_abc123",
"verificationResult": "verified",
"verifiedAt": "2026-02-12T10:30:00Z",
"originalHash": "sha256:abc...",
"watermarkedHash": "sha256:def...",
"extractable": true
}How each watermark type survives common content transformations.
| Attack / Transform | Visible | Frequency | Stego | Forensic | AI FP |
|---|---|---|---|---|---|
| JPEG Compression | High | High | Low | High | High |
| Scaling/Resize | High | High | Medium | High | High |
| Cropping | Medium | Medium | Low | High | Medium |
| Screenshot | High | Medium | None | Medium | High |
| Re-encoding | High | High | Low | High | Medium |
| Print & Scan | High | Low | None | Medium | Low |
| AI Re-generation | None | None | None | Low | High |
| Collusion Attack | N/A | Low | Low | High | Medium |
Layered Protection Recommended
For maximum protection, combine Frequency-Domain (survives compression) with Forensic Per-User (leak tracing) and AI Fingerprint (AI provenance). DRD supports applying multiple watermark types in a single API call.
curl -X POST https://api.drd.io/v1/watermark/embed \
-H "Authorization: Bearer drd_ws_sk_live_Abc123..." \
-H "Content-Type: application/json" \
-d '{
"contentUrl": "https://cdn.example.com/image.jpg",
"types": ["frequency", "forensic"],
"payload": {
"agentId": "agt_01HQ3XBN4RTYP",
"recipientId": "usr_01HQ3XBN4RTYP",
"timestamp": "2026-02-14T12:00:00Z"
},
"options": {
"frequency": { "strength": 0.8, "redundancy": 3 },
"forensic": { "collusionResistance": "high" }
}
}'
# Response
{
"ok": true,
"data": {
"id": "wm_01JM7XBN4RTYP",
"watermarkedUrl": "https://cdn.drd.io/wm/abc123.jpg",
"types": ["frequency", "forensic"],
"payload": {
"agentId": "agt_01HQ3XBN4RTYP",
"recipientId": "usr_01HQ3XBN4RTYP"
},
"quality": {
"psnr": 48.2,
"ssim": 0.998
},
"createdAt": "2026-02-14T12:00:00Z"
}
}curl -X POST https://api.drd.io/v1/watermark/extract \
-H "Authorization: Bearer drd_ws_sk_live_Abc123..." \
-H "Content-Type: application/json" \
-d '{
"contentUrl": "https://leaked-site.example/suspect-image.jpg",
"types": ["frequency", "forensic", "ai_fingerprint"]
}'
# Response
{
"ok": true,
"data": {
"detected": true,
"watermarks": [
{
"type": "frequency",
"confidence": 0.94,
"payload": {
"agentId": "agt_01HQ3XBN4RTYP"
}
},
{
"type": "forensic",
"confidence": 0.97,
"payload": {
"recipientId": "usr_01HQ3XBN4RTYP",
"timestamp": "2026-02-14T12:00:00Z"
}
}
],
"extractedAt": "2026-02-14T12:05:00Z"
}
}import { DRD } from '@drd/sdk';
const drd = new DRD({ apiKey: process.env.DRD_API_KEY });
// Embed multiple watermark types
const result = await drd.watermark.embed({
contentUrl: 'https://cdn.example.com/image.jpg',
types: ['frequency', 'forensic', 'ai_fingerprint'],
payload: {
agentId: 'agt_01HQ3XBN4RTYP',
recipientId: 'usr_01HQ3XBN4RTYP',
},
});
console.log(`Watermarked URL: ${result.watermarkedUrl}`);
console.log(`Quality - PSNR: ${result.quality.psnr}dB, SSIM: ${result.quality.ssim}`);
// Extract watermarks from suspect content
const extraction = await drd.watermark.extract({
contentUrl: 'https://suspect-site.com/image.jpg',
types: ['frequency', 'forensic', 'ai_fingerprint'],
});
if (extraction.detected) {
for (const wm of extraction.watermarks) {
console.log(`Found ${wm.type} watermark (confidence: ${(wm.confidence * 100).toFixed(0)}%)`);
console.log(`Payload: ${JSON.stringify(wm.payload)}`);
}
}