Verigin API
Score text, images, and video for content origin. One endpoint. JSON in, JSON out. Start detecting in under 2 minutes.
Quick Start
Get your API key
Sign up at veriginos.polsia.app and generate an API key from your dashboard. Your key starts with vgn_.
Send your first request
Pass any text, image URL, or video URL to the detect endpoint. The API returns origin scores in milliseconds.
curl -X POST https://api.verigin.com/v1/detect \ -H "Authorization: Bearer vgn_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "type": "text", "content": "The quick brown fox jumps over the lazy dog." }'
Read the scores
Every response includes human, ai, and mixed scores as percentages that sum to 100.
{
"origin": {
"human": 92.4,
"ai": 3.1,
"mixed": 4.5
},
"verdict": "human",
"confidence": 0.97
}Authentication
All API requests require a Bearer token in the Authorization header. Your API key is tied to your account and controls rate limits and billing.
Authorization: Bearer vgn_your_api_key
Keep your API key secret. Don't commit it to version control or expose it in client-side code. Use environment variables or a secrets manager.
POST /api/detect
Analyze content and return origin scores indicating whether it was created by a human, AI, or a mix of both. Supports text, images, and video.
Request Body
| Parameter | Type | Required | Description |
|---|---|---|---|
| type | string | Required | Content type: text, image, or video |
| content | string | Required | For text: the raw text to analyze (min 50 chars, max 50,000 chars). For image and video: a publicly accessible URL. |
| language | string | Optional | ISO 639-1 language code (e.g., en, es). Auto-detected if omitted. |
| metadata | boolean | Optional | Set true to include detailed analysis breakdown in the response. Default: false. |
Response Format
Every successful response returns a consistent JSON structure with origin scores, a verdict, and confidence level.
| Field | Type | Description |
|---|---|---|
| origin.human | number | Percentage score (0–100) for human-created origin |
| origin.ai | number | Percentage score (0–100) for AI-generated origin |
| origin.mixed | number | Percentage score (0–100) for human-AI collaborative origin |
| verdict | string | Dominant origin: human ai or mixed |
| confidence | number | Confidence score (0–1) for the verdict |
| content_type | string | Echo of the input type: text, image, or video |
| request_id | string | Unique request identifier for debugging |
Text Detection
Analyze a block of text. Works with articles, social posts, reviews, comments — anything with 50+ characters.
curl -X POST https://api.verigin.com/v1/detect \ -H "Authorization: Bearer vgn_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "type": "text", "content": "Artificial intelligence has transformed the way we interact with technology, enabling machines to perform tasks that once required human intelligence." }'
import requests response = requests.post( "https://api.verigin.com/v1/detect", headers={ "Authorization": "Bearer vgn_your_api_key", "Content-Type": "application/json" }, json={ "type": "text", "content": "Artificial intelligence has transformed the way " "we interact with technology, enabling machines " "to perform tasks that once required human intelligence." } ) result = response.json() print(f"Verdict: {result['verdict']} ({result['confidence']:.0%} confidence)") print(f"Human: {result['origin']['human']}% | AI: {result['origin']['ai']}% | Mixed: {result['origin']['mixed']}%")
const response = await fetch("https://api.verigin.com/v1/detect", { method: "POST", headers: { "Authorization": "Bearer vgn_your_api_key", "Content-Type": "application/json" }, body: JSON.stringify({ type: "text", content: "Artificial intelligence has transformed the way " + "we interact with technology, enabling machines " + "to perform tasks that once required human intelligence." }) }); const result = await response.json(); console.log(`Verdict: ${result.verdict} (${result.confidence} confidence)`); // Verdict: ai (0.94 confidence)
Example Response — AI-Generated Text
{
"origin": {
"human": 2.8,
"ai": 94.1,
"mixed": 3.1
},
"verdict": "ai",
"confidence": 0.94,
"content_type": "text",
"request_id": "req_8f3a1b2c4d5e"
}Image Detection
Pass a publicly accessible image URL. Supports JPEG, PNG, and WebP up to 20MB. Detection covers AI generation (diffusion models like DALL-E, Midjourney, Stable Diffusion) and editing tools.
curl -X POST https://api.verigin.com/v1/detect \ -H "Authorization: Bearer vgn_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "type": "image", "content": "https://example.com/photo.jpg" }'
response = requests.post( "https://api.verigin.com/v1/detect", headers={"Authorization": "Bearer vgn_your_api_key"}, json={ "type": "image", "content": "https://example.com/photo.jpg" } )
const result = await fetch("https://api.verigin.com/v1/detect", { method: "POST", headers: { "Authorization": `Bearer ${process.env.VERIGIN_API_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ type: "image", content: "https://example.com/photo.jpg" }) }).then(r => r.json());
Example Response — Human Photograph
{
"origin": {
"human": 97.2,
"ai": 1.1,
"mixed": 1.7
},
"verdict": "human",
"confidence": 0.98,
"content_type": "image",
"request_id": "req_2d7e9c4f1a6b"
}Video Detection
Analyze video content for AI generation artifacts. Pass a URL to an MP4, MOV, or WebM file up to 100MB. Processing takes 2–8 seconds depending on duration.
curl -X POST https://api.verigin.com/v1/detect \ -H "Authorization: Bearer vgn_your_api_key" \ -H "Content-Type: application/json" \ -d '{ "type": "video", "content": "https://example.com/clip.mp4" }'
response = requests.post( "https://api.verigin.com/v1/detect", headers={"Authorization": "Bearer vgn_your_api_key"}, json={ "type": "video", "content": "https://example.com/clip.mp4", "metadata": True # include frame-by-frame analysis } )
const result = await fetch("https://api.verigin.com/v1/detect", { method: "POST", headers: { "Authorization": `Bearer ${VERIGIN_KEY}`, "Content-Type": "application/json" }, body: JSON.stringify({ type: "video", content: "https://example.com/clip.mp4", metadata: true }) }).then(r => r.json());
Example Response — Mixed Origin Video
{
"origin": {
"human": 28.5,
"ai": 19.3,
"mixed": 52.2
},
"verdict": "mixed",
"confidence": 0.87,
"content_type": "video",
"request_id": "req_5k9m2n7p3q1r"
}Rate Limits
Rate limits are applied per API key. Headers X-RateLimit-Remaining and X-RateLimit-Reset are included in every response.
| Plan | Rate | Burst | Max File Size |
|---|---|---|---|
| Free | 100 req/day | 10 req/min | 5 MB |
| Pro | 10,000 req/day | 100 req/min | 20 MB |
| Enterprise | Custom | Custom | 100 MB |
Error Codes
The API uses standard HTTP status codes. All error responses include a message field with a human-readable explanation.
- 200 Success — origin scores returned
-
400
Bad request — missing or invalid
typeorcontentfield - 401 Unauthorized — missing or invalid API key
- 413 Payload too large — content exceeds size limit for your plan
- 422 Unprocessable — content could not be analyzed (e.g., broken URL, unsupported format)
-
429
Rate limited — too many requests. Check
X-RateLimit-Resetheader - 500 Server error — retry after a few seconds. If persistent, contact support
Error Response Example
{
"error": "rate_limit_exceeded",
"message": "You have exceeded 100 requests/day on the Free plan. Upgrade to Pro for 10,000 requests/day.",
"retry_after": 3600
}