InspectAd API
Integrate compliance checks directly into your ad creation pipeline. Check text, images, and landing pages against platform advertising policies with a single API call.
curl -X POST https://inspectad.com/api/v1/check-text \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"text": "Lose 30 lbs in 2 weeks!",
"platforms": ["meta"]
}'Authentication
The InspectAd API uses API keys for authentication. Include your key in the Authorization header as a Bearer token.
Generate keys from your Settings → API page. Keys are shown once at creation — store them securely.
curl https://inspectad.com/api/v1/usage \
-H "Authorization: Bearer sk_live_abc123def456..."Base URL
All API endpoints are relative to the base URL below. All responses are JSON. CORS headers are included for server-to-server usage.
https://inspectad.com/api/v1Rate Limits
API requests are subject to rate limits (requests per minute) and plan-based usage limits (checks per month). Every response includes a usage object.
| Limit | Value |
|---|---|
| API requests | 300/min |
| Text checks | Per plan |
| Image analyses | Per plan |
| Landing page checks | Per plan |
HTTP/1.1 429 Too Many Requests
Retry-After: 30
{
"error": "rate_limited",
"message": "Too many requests. Retry after 30s."
}Check Text
Analyze ad copy against platform advertising policies. Returns compliance findings, a pass/warn/fail decision, confidence score, and AI-generated compliant alternatives.
Parameters
textrequiredAd copy to analyze (20–2,000 characters)
platformsrequiredTarget platforms: "meta", "tiktok", "x", "youtube", "linkedin"
toneTone for suggestions: "Neutral", "Friendly", "Professional", "Playful" (default: "Neutral")
curl -X POST https://inspectad.com/api/v1/check-text \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"text": "Lose 30 lbs in 2 weeks with our miracle pill!",
"platforms": ["meta", "tiktok"],
"tone": "Neutral"
}'{
"decision": "fail",
"confidence": 92,
"findings": [
{
"severity": "Fail",
"snippet": "Lose 30 lbs in 2 weeks",
"reason": "Unrealistic weight loss claims violate Meta Ad Standards.",
"platform": "meta"
}
],
"suggestions": [
"Transform your wellness journey — sustainable results you'll love."
],
"platforms": ["meta", "tiktok"],
"tone": "Neutral",
"usage": { "used": 12, "limit": 100, "remaining": 88 }
}Analyze Image
Analyze ad creatives for compliance issues, text overlay percentage, and platform specification adherence. Supports PNG, JPEG, and WebP up to 10 MB.
Parameters
imagerequiredImage file (PNG, JPEG, WebP — max 10 MB)
platformsComma-separated platforms (default: "meta")
curl -X POST https://inspectad.com/api/v1/analyze-image \
-H "Authorization: Bearer sk_live_..." \
-F "image=@ad-creative.png" \
-F "platforms=meta,tiktok"{
"overallScore": 85,
"dimensions": { "width": 1080, "height": 1080 },
"format": "png",
"fileSize": 524288,
"textOverlayPercent": 15,
"textContent": "CINEMATIC IMMERSION — True 4K Brilliance",
"visualDescription": "Product shot with gradient background...",
"contentFindings": [...],
"platforms": ["meta", "tiktok"],
"usage": { "used": 5, "limit": 25, "remaining": 20 }
}Analyze Landing Page
Check a landing page for compliance issues — SSL, privacy policy, disclaimers, mobile-friendliness, and content policy violations.
Parameters
urlrequiredFull URL of the landing page to analyze
curl -X POST https://inspectad.com/api/v1/analyze-landing-page \
-H "Authorization: Bearer sk_live_..." \
-H "Content-Type: application/json" \
-d '{ "url": "https://example.com/offer" }'{
"url": "https://example.com/offer",
"overallScore": 72,
"technicalChecks": {
"hasSSL": true,
"hasMobileFriendly": true,
"hasPrivacyPolicy": false,
"hasTermsOfService": true
},
"contentChecks": { ... },
"issues": [
{
"severity": "high",
"category": "Privacy",
"message": "No privacy policy link found."
}
],
"usage": { "used": 2, "limit": -1, "remaining": "unlimited" }
}Get Usage
Retrieve your current month's usage counts and plan limits across all resource types.
curl https://inspectad.com/api/v1/usage \
-H "Authorization: Bearer sk_live_..."{
"plan": "agency",
"planName": "Agency",
"period": "2026-02",
"usage": {
"textChecks": { "used": 142, "limit": "unlimited", "remaining": "unlimited" },
"imageChecks": { "used": 35, "limit": "unlimited", "remaining": "unlimited" },
"landingPageChecks": { "used": 8, "limit": "unlimited", "remaining": "unlimited" },
"videoAnalyses": { "used": 3, "limit": 20, "remaining": 17 },
"bulkChecks": { "used": 0, "limit": 100, "remaining": 100 }
},
"platformsPerCheck": 4
}Platforms
Use these enum values when specifying target platforms in your API calls.
| Value | Platform |
|---|---|
meta | Meta (Facebook & Instagram) |
tiktok | TikTok |
youtube | YouTube / Google Ads |
linkedin | |
x | X (Twitter) |
{
"platforms": ["meta", "tiktok", "youtube"]
}Error Codes
All errors return a consistent JSON envelope with an error code and human-readable message.
| Status | Code | Description |
|---|---|---|
| 401 | authentication_required | Missing or invalid Authorization header |
| 401 | invalid_api_key | API key is invalid, expired, or revoked |
| 403 | insufficient_scope | Key doesn't have permission for this endpoint |
| 403 | plan_upgrade_required | Your plan doesn't include API access |
| 400 | validation_error | Invalid request parameters |
| 429 | limit_exceeded | Monthly plan usage limit reached |
| 429 | rate_limited | Too many requests (see Retry-After header) |
| 500 | internal_error | Something went wrong on our end |
{
"error": "limit_exceeded",
"message": "Text check limit reached (100/100).",
"usage": {
"used": 100,
"limit": 100,
"remaining": 0
},
"upgradeUrl": "https://inspectad.com/pricing"
}Code Examples
Full working examples for the most common languages. Replace sk_live_... with your actual API key.
import requests
API_KEY = "sk_live_..."
BASE = "https://inspectad.com/api/v1"
resp = requests.post(
f"{BASE}/check-text",
headers={"Authorization": f"Bearer {API_KEY}"},
json={
"text": "Limited time offer! Act now!",
"platforms": ["meta", "tiktok"],
"tone": "Professional"
}
)
data = resp.json()
print(f"Decision: {data['decision']}")
print(f"Issues: {len(data['findings'])}")
for f in data["findings"]:
print(f" [{f['severity']}] {f['snippet']}")
print(f" {f['reason']}")const API_KEY = process.env.INSPECTAD_API_KEY!;
const BASE = "https://inspectad.com/api/v1";
const res = await fetch(`${BASE}/check-text`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
text: "Limited time offer! Act now!",
platforms: ["meta", "tiktok"],
}),
});
const data = await res.json();
console.log(`Decision: ${data.decision}`);
console.log(`Remaining: ${data.usage.remaining}`);Need help? contact@inspectad.com · FAQ · Manage API Keys