MEDIA COMPLIANCE API

Strip. Compress.
Comply. One call.

E-commerce marketplaces process millions of seller images daily. Filtrate handles metadata removal, optimization, and AI compliance in a single API request. Sub-200ms. Fraction of a cent.

curl
POST /v1/process
{
  "image_url": "https://seller-uploads.example.com/img_4821.jpg",
  "strip_exif": true,
  "compress": { "quality": 85, "format": "webp" },
  "compliance": ["nsfw", "fraud", "banned_logos"]
}

// 143ms later
{
  "status": "clean",
  "optimized_url": "https://cdn.filtrate.io/processed/a8f2..webp",
  "size_reduction": "67%",
  "compliance": { "safe": true, "flags": [] }
}

Three services. One endpoint.

Marketplaces currently stitch together separate tools for metadata stripping, image optimization, and content moderation. Filtrate replaces the patchwork.

01

EXIF Strip

Remove GPS coordinates, device info, timestamps, and all dangerous metadata that exposes seller or buyer identity.

02

Optimize

Compress, transcode to modern formats (WebP, AVIF), resize to platform specs. Average 60-70% size reduction.

03

AI Comply

Scan for explicit content, counterfeit goods, banned brand logos, and policy violations. Verdict in milliseconds.

01

Zero Ops

Serverless infrastructure scales from 10 requests to 10 million. No servers to manage, no capacity planning, no 3am pages.

02

Metered Billing

Pay per image processed. No monthly minimums, no credit packs. Start at fractions of a cent, volume discounts at scale.

03

Self-Serve

API key in 30 seconds. Sandbox environment to test against real images. Full SDK support for Node, Python, Go, and Ruby.

04

Global Edge

Processing nodes in NA, EU, and APAC. Images processed closest to your users. Sub-200ms p95 latency worldwide.

Built for marketplace scale

From indie sellers to enterprise platforms handling millions of daily uploads.

Starter
Up to 50K images/mo
$0.002/image
Growth
Up to 500K images/mo
$0.001/image
Enterprise
Unlimited volume
Custom
LIVE PLAYGROUND

Try it. Right now.

Paste a URL or upload a file. See the real API response in under a second.

REQUEST 5 free requests / 15 min
Accepts jpg, png, webp, gif, avif — up to 10 MB
85
Try a sample
RESPONSE
Your response will appear here

Get your API key.

Takes 30 seconds. No credit card. No signup form. Just a key.

API REFERENCE

Everything you need to integrate.

One endpoint. Three services. Full compliance in a single call.

Authentication

All /v1/process requests require an X-API-Key header. Get a free key instantly — no credit card required.

1
Issue a key

POST to /v1/keys with an optional label. The raw key is returned once and never retrievable again — store it securely.

2
Send the header

Include X-API-Key: flt_your_key_here on every request to /v1/process.

bash
# Step 1 — issue a key
curl -X POST https://filtrate.polsia.app/v1/keys \
  -H "Content-Type: application/json" \
  -d '{"label": "my-project"}'

# Response:
# {
#   "api_key": "flt_abc123...",
#   "id": "uuid",
#   "message": "Store this key securely — it cannot be retrieved again."
# }

# Step 2 — use the key
curl -X POST https://filtrate.polsia.app/v1/process \
  -H "X-API-Key: flt_abc123..." \
  -H "Content-Type: application/json" \
  -d '{"image_url": "https://example.com/photo.jpg"}'
javascript
// Step 1 — issue a key (run once)
const keyRes = await fetch('https://filtrate.polsia.app/v1/keys', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ label: 'my-project' }),
});
const { api_key } = await keyRes.json();
// Store api_key in an env var — it won't be shown again

// Step 2 — process an image
const res = await fetch('https://filtrate.polsia.app/v1/process', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.FILTRATE_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    image_url: 'https://example.com/photo.jpg',
    compress: { quality: 85, format: 'webp' },
  }),
});
const result = await res.json();
python
import requests, os

# Step 1 — issue a key (run once)
r = requests.post(
    "https://filtrate.polsia.app/v1/keys",
    json={"label": "my-project"}
)
api_key = r.json()["api_key"]
# Store api_key in an env var — it won't be shown again

# Step 2 — process an image
headers = {"X-API-Key": os.environ["FILTRATE_API_KEY"]}
result = requests.post(
    "https://filtrate.polsia.app/v1/process",
    headers=headers,
    json={
        "image_url": "https://example.com/photo.jpg",
        "compress": {"quality": 85, "format": "webp"},
    },
)
data = result.json()
POST /v1/process

The core endpoint. Strips EXIF, compresses to WebP, runs AI content moderation. Returns a CDN URL and compliance verdict.

Request

Accepts JSON body with image_url or multipart form-data with an image file field.

FieldTypeRequiredDescription
image_url string one of URL of a remote image. Accepted: jpeg, png, webp, gif, avif.
image file one of Multipart file upload. Max 20 MB. Same accepted formats.
compress.quality integer optional WebP quality 1–100. Default: 85.
strip_exif boolean optional Strip all metadata. Default: true (always on — cannot be disabled).
Response
FieldTypeDescription
status string Top-level compliance verdict. One of: safe explicit fraud banned_logo unknown
optimized_url string CDN URL of the processed WebP. Ready to serve.
size_reduction string Percentage size reduction vs. original (e.g. "67%").
original_size_bytes integer Input file size in bytes.
output_size_bytes integer Processed file size in bytes.
processing_ms integer Total wall-clock time in milliseconds.
compliance.verdict string Same as top-level status.
compliance.categories.explicit object { flagged: boolean, confidence: number } — nudity / adult content.
compliance.categories.fraud object { flagged: boolean, confidence: number } — counterfeits / misleading claims.
compliance.categories.banned_logo object { flagged: boolean, confidence: number } — major brand logos / copyrighted marks.
Error codes
CodeMeaning
400 Missing image / invalid URL / unsupported format.
401 Missing X-API-Key header.
403 Invalid or revoked API key.
429 Rate limit exceeded (playground only). Get a key for unlimited access.
500 Processing error. Image may be corrupt or too large to decode.
bash — URL input
curl -X POST https://filtrate.polsia.app/v1/process \
  -H "X-API-Key: flt_abc123..." \
  -H "Content-Type: application/json" \
  -d '{
    "image_url": "https://example.com/product.jpg",
    "compress": { "quality": 85, "format": "webp" }
  }'

# File upload
curl -X POST https://filtrate.polsia.app/v1/process \
  -H "X-API-Key: flt_abc123..." \
  -F "image=@/path/to/photo.jpg" \
  -F 'compress={"quality":85}'
javascript
const res = await fetch('https://filtrate.polsia.app/v1/process', {
  method: 'POST',
  headers: {
    'X-API-Key': process.env.FILTRATE_API_KEY,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    image_url: 'https://example.com/product.jpg',
    compress: { quality: 85 },
  }),
});

const data = await res.json();
// {
//   status: 'safe',
//   optimized_url: 'https://cdn.example.com/filtrate_1234.webp',
//   size_reduction: '67%',
//   processing_ms: 143,
//   compliance: {
//     verdict: 'safe',
//     categories: {
//       explicit: { flagged: false, confidence: 0 },
//       fraud: { flagged: false, confidence: 0 },
//       banned_logo: { flagged: false, confidence: 0 },
//     }
//   }
// }

if (data.status !== 'safe') {
  console.warn('Image flagged:', data.compliance.verdict);
}
python
import requests, os

headers = {"X-API-Key": os.environ["FILTRATE_API_KEY"]}

# URL input
r = requests.post(
    "https://filtrate.polsia.app/v1/process",
    headers=headers,
    json={
        "image_url": "https://example.com/product.jpg",
        "compress": {"quality": 85},
    },
)
data = r.json()

# File upload
with open("/path/to/photo.jpg", "rb") as f:
    r = requests.post(
        "https://filtrate.polsia.app/v1/process",
        headers=headers,
        files={"image": f},
        data={"compress": '{"quality": 85}'},
    )
    data = r.json()

print(f"Verdict: {data['status']}, Reduction: {data['size_reduction']}")
POST /v1/keys

Self-serve API key issuance. No auth required. Returns a raw key shown once — store it immediately.

FieldTypeRequiredDescription
label string optional Human-readable tag for this key (e.g. "staging", "prod").
response
{
  "api_key": "flt_abc123xyz...",
  "id": "01234567-89ab-cdef-...",
  "message": "Store this key securely — it cannot be retrieved again."
}

The invisible layer between upload and listing.

Every image that goes live on a marketplace should be safe, fast, and clean. Filtrate makes that automatic. One line of code. Every image. Every time.