Verigin API

Score text, images, and video for content origin. One endpoint. JSON in, JSON out. Start detecting in under 2 minutes.

Base URL https://api.verigin.com/v1

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
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.

json
{
  "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.

header
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

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
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."
  }'
python
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']}%")
javascript
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

json
{
  "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
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"
  }'
python
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"
    }
)
javascript
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

json
{
  "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
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"
  }'
python
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
    }
)
javascript
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

json
{
  "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.

Free
100
requests / day
Pro
10K
requests / day
Enterprise
Custom
unlimited scaling
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 type or content field
  • 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-Reset header
  • 500 Server error — retry after a few seconds. If persistent, contact support

Error Response Example

json
{
  "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
}