API Documentation

Overview

The Deceptioner API V2 allows you to rewrite text to evade AI detection systems while maintaining readability. The API uses an asynchronous task-based system where you create a task and then poll for results.

Base URL: https://rapi.deceptioner.site

Authentication

All API requests require the X-Deceptioner-API-V2 header with your API key.

X-Deceptioner-API-V2: your_api_key_here

Endpoints

POST /create-task

Creates a new text rewriting task.

Request Body

Parameter Type Required Description
text string Yes The original text you want to rewrite. Maximum 10,000 characters.
stealth float Yes A value between 0.0 and 1.0. Controls the balance between readability and AI detection evasion. Higher values prioritize evasion. Recommended starting point: 0.5
ai_detector string Yes The target AI detector model to optimize for. See supported detectors below.

Supported AI Detectors

ZeroGPT.com Originality.ai Originality.ai (Legacy) Winston AI Winston AI (Legacy) Turnitin Turnitin (Legacy) ZeroGPT.com (Legacy) Sapling.ai GPTZero.me GPTZero.me (Legacy) CopyLeaks.com CopyLeaks.com (Legacy) Writer.me Universal Mode (Beta)

Response

{
  "status": "pending",
  "taskID": "550e8400-e29b-41d4-a716-446655440000",
  "message": "Task created and is queued for processing."
}
GET /query-task

Check the status of a rewriting task and retrieve results.

Query Parameters

Parameter Type Required Description
task_id string (UUID) Yes The task ID returned from create-task

Response (Processing)

{
  "status": "pending",
  "taskID": "550e8400-e29b-41d4-a716-446655440000",
  "message": "Task created and is queued for processing.",
  "original_text": "Your original text...",
  "paraphrased_text": ""
}

Response (Completed)

{
  "status": "completed",
  "taskID": "550e8400-e29b-41d4-a716-446655440000",
  "message": "Task completed successfully.",
  "original_text": "Your original text...",
  "paraphrased_text": "The rewritten text..."
}
When status is pending or processing, the response includes a Retry-After header indicating the recommended wait time before polling again.

Code Examples

import requests
import time

API_KEY = "your_api_key_here"
BASE_URL = "https://rapi.deceptioner.site"

headers = {
    "Content-Type": "application/json",
    "X-Deceptioner-API-V2": API_KEY
}

def create_task(text, stealth=0.5, ai_detector="GPTZero.me"):
    payload = {
        "text": text,
        "stealth": stealth,
        "ai_detector": ai_detector
    }
    response = requests.post(f"{BASE_URL}/create-task", json=payload, headers=headers)
    return response.json()

def query_task(task_id):
    response = requests.get(f"{BASE_URL}/query-task", params={"task_id": task_id}, headers=headers)
    return response.json(), response.headers.get("Retry-After")

def rewrite_text(text, stealth=0.5, ai_detector="GPTZero.me"):
    # Create the task
    result = create_task(text, stealth, ai_detector)

    if result["status"] == "failed":
        raise Exception(result["message"])

    task_id = result["taskID"]
    print(f"Task created: {task_id}")

    # Poll for results
    while True:
        result, retry_after = query_task(task_id)

        if result["status"] == "completed":
            return result["paraphrased_text"]
        elif result["status"] == "failed":
            raise Exception(result["message"])

        wait_time = int(retry_after) if retry_after else 30
        print(f"Task {result['status']}. Waiting {wait_time} seconds...")
        time.sleep(wait_time)

# Usage
if __name__ == "__main__":
    original_text = "Artificial intelligence has revolutionized the way we interact with technology."
    rewritten = rewrite_text(original_text, stealth=0.7, ai_detector="Originality.ai")
    print(f"Rewritten: {rewritten}")
const axios = require('axios');

const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://rapi.deceptioner.site';

const headers = {
  'Content-Type': 'application/json',
  'X-Deceptioner-API-V2': API_KEY
};

async function createTask(text, stealth = 0.5, aiDetector = 'GPTZero.me') {
  const response = await axios.post(`${BASE_URL}/create-task`, {
    text,
    stealth,
    ai_detector: aiDetector
  }, { headers });

  return response.data;
}

async function queryTask(taskId) {
  const response = await axios.get(`${BASE_URL}/query-task`, {
    params: { task_id: taskId },
    headers
  });

  return {
    data: response.data,
    retryAfter: response.headers['retry-after']
  };
}

async function rewriteText(text, stealth = 0.5, aiDetector = 'GPTZero.me') {
  const createResult = await createTask(text, stealth, aiDetector);

  if (createResult.status === 'failed') {
    throw new Error(createResult.message);
  }

  const taskId = createResult.taskID;
  console.log(`Task created: ${taskId}`);

  while (true) {
    const { data, retryAfter } = await queryTask(taskId);

    if (data.status === 'completed') {
      return data.paraphrased_text;
    } else if (data.status === 'failed') {
      throw new Error(data.message);
    }

    const waitTime = (retryAfter ? parseInt(retryAfter) : 30) * 1000;
    console.log(`Task ${data.status}. Waiting ${waitTime / 1000} seconds...`);
    await new Promise(resolve => setTimeout(resolve, waitTime));
  }
}

// Usage
(async () => {
  try {
    const originalText = 'Artificial intelligence has revolutionized the way we interact with technology.';
    const rewritten = await rewriteText(originalText, 0.7, 'Originality.ai');
    console.log(`Rewritten: ${rewritten}`);
  } catch (error) {
    console.error('Error:', error.message);
  }
})();

Create Task:

curl -X POST "https://rapi.deceptioner.site/create-task" \
  -H "Content-Type: application/json" \
  -H "X-Deceptioner-API-V2: your_api_key_here" \
  -d '{
    "text": "Your text to rewrite goes here.",
    "stealth": 0.5,
    "ai_detector": "GPTZero.me"
  }'

Query Task:

curl -X GET "https://rapi.deceptioner.site/query-task?task_id=550e8400-e29b-41d4-a716-446655440000" \
  -H "X-Deceptioner-API-V2: your_api_key_here"
<?php

$apiKey = 'your_api_key_here';
$baseUrl = 'https://rapi.deceptioner.site';

function createTask($text, $stealth = 0.5, $aiDetector = 'GPTZero.me') {
    global $apiKey, $baseUrl;

    $payload = json_encode([
        'text' => $text,
        'stealth' => $stealth,
        'ai_detector' => $aiDetector
    ]);

    $ch = curl_init("$baseUrl/create-task");
    curl_setopt_array($ch, [
        CURLOPT_POST => true,
        CURLOPT_POSTFIELDS => $payload,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Content-Type: application/json',
            "X-Deceptioner-API-V2: $apiKey"
        ]
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    return json_decode($response, true);
}

function queryTask($taskId) {
    global $apiKey, $baseUrl;

    $ch = curl_init("$baseUrl/query-task?task_id=$taskId");
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HEADER => true,
        CURLOPT_HTTPHEADER => [
            "X-Deceptioner-API-V2: $apiKey"
        ]
    ]);

    $response = curl_exec($ch);
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $headers = substr($response, 0, $headerSize);
    $body = substr($response, $headerSize);
    curl_close($ch);

    $retryAfter = null;
    if (preg_match('/Retry-After:\s*(\d+)/i', $headers, $matches)) {
        $retryAfter = (int)$matches[1];
    }

    return [
        'data' => json_decode($body, true),
        'retryAfter' => $retryAfter
    ];
}

function rewriteText($text, $stealth = 0.5, $aiDetector = 'GPTZero.me') {
    $result = createTask($text, $stealth, $aiDetector);

    if ($result['status'] === 'failed') {
        throw new Exception($result['message']);
    }

    $taskId = $result['taskID'];
    echo "Task created: $taskId\n";

    while (true) {
        $queryResult = queryTask($taskId);
        $data = $queryResult['data'];

        if ($data['status'] === 'completed') {
            return $data['paraphrased_text'];
        } elseif ($data['status'] === 'failed') {
            throw new Exception($data['message']);
        }

        $waitTime = $queryResult['retryAfter'] ?? 30;
        echo "Task {$data['status']}. Waiting $waitTime seconds...\n";
        sleep($waitTime);
    }
}

// Usage
try {
    $originalText = 'Artificial intelligence has revolutionized the way we interact with technology.';
    $rewritten = rewriteText($originalText, 0.7, 'Originality.ai');
    echo "Rewritten: $rewritten\n";
} catch (Exception $e) {
    echo "Error: " . $e->getMessage() . "\n";
}
const API_KEY = 'your_api_key_here';
const BASE_URL = 'https://rapi.deceptioner.site';

async function createTask(text, stealth = 0.5, aiDetector = 'GPTZero.me') {
  const response = await fetch(`${BASE_URL}/create-task`, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'X-Deceptioner-API-V2': API_KEY
    },
    body: JSON.stringify({
      text,
      stealth,
      ai_detector: aiDetector
    })
  });

  return response.json();
}

async function queryTask(taskId) {
  const response = await fetch(`${BASE_URL}/query-task?task_id=${taskId}`, {
    headers: {
      'X-Deceptioner-API-V2': API_KEY
    }
  });

  return {
    data: await response.json(),
    retryAfter: response.headers.get('Retry-After')
  };
}

async function rewriteText(text, stealth = 0.5, aiDetector = 'GPTZero.me') {
  const createResult = await createTask(text, stealth, aiDetector);

  if (createResult.status === 'failed') {
    throw new Error(createResult.message);
  }

  const taskId = createResult.taskID;

  while (true) {
    const { data, retryAfter } = await queryTask(taskId);

    if (data.status === 'completed') {
      return data.paraphrased_text;
    } else if (data.status === 'failed') {
      throw new Error(data.message);
    }

    const waitTime = (retryAfter ? parseInt(retryAfter) : 30) * 1000;
    await new Promise(resolve => setTimeout(resolve, waitTime));
  }
}

// Usage
rewriteText('Your text here', 0.5, 'GPTZero.me')
  .then(result => console.log(result))
  .catch(err => console.error(err));

Error Responses

Status Code Description
403 Invalid or missing API key
422 Invalid task ID or task not found
500 Internal server error

Best Practices

  • Polling Frequency: Respect the Retry-After header to avoid unnecessary requests.
  • Stealth Value: Start with 0.5 and adjust based on results.
  • Text Length: Keep text under 10,000 characters per request.
  • Error Handling: Always implement proper error handling and retries.

Key Points

  • Word limit per request is determined by your plan. View pricing page for more info.
  • API access is only available on Premium Monthly, Basic Yearly, Standard Yearly, and Premium Yearly plans.
  • API access of all plans have a rate limit of 100 requests/min.
  • Your account's current word limit (check 'Subscription Info' section in your Profile Page) stays the same if you rewrite the same text again using the API.