API Documentation

Integrate PreTestAds into your workflow. All endpoints use your API key for authentication.

Generate an API key

Authentication

All API requests require a Bearer token. Pass your API key in the Authorization header:

Authorization: Bearer pta_your_api_key

header

Submit Analysis

POST /api/v1/analyze

Upload a video file as multipart form data. Returns an analysis ID to poll for results.

curl -X POST https://pretestads.com/api/v1/analyze \
  -H "Authorization: Bearer pta_your_api_key" \
  -F "modality=video" \
  -F "window_seconds=60" \
  -F "file=@my_ad.mp4"

curl

Parameters

ParameterTypeRequiredDescription
modalitystringYesMust be video
window_secondsintYesMust be 60
filebinaryYesVideo file (MP4, MOV, AVI — max 500MB)

Get Analysis Result

GET /api/v1/analyze/{id}

Poll this endpoint until status is "complete" or "failed". Typically takes 60–90 seconds.

curl https://pretestads.com/api/v1/analyze/YOUR_ANALYSIS_ID \
  -H "Authorization: Bearer pta_your_api_key"

curl

Response (complete)

{
  "id": "uuid",
  "status": "complete",
  "score": 82,
  "score_raw": 0.82,
  "label": "strong",
  "verdict": "Your ad outperforms the majority of TikTok top performers...",
  "engagement_timeseries": [
    {"second": 0.0, "activation": 0.61},
    {"second": 1.0, "activation": 0.74},
    ...
  ],
  "credits_remaining": 14
}

json

Status values

  • pending — queued
  • processing — running the AdCortex™ engagement model
  • complete — done, results available
  • failed — error, credit refunded

Other Endpoints

List Analyses

GET /api/v1/analyze?page=1&limit=20

Submit Feedback

POST /api/v1/analyze/{id}/feedback

{"outcome": "converted"}

json

Check Credits

GET /api/v1/credits

Error Codes

StatusErrorMeaning
401invalid_api_keyMissing or invalid API key
402insufficient_creditsNo credits remaining
422validation_errorBad parameters
429rate_limited10 req/min exceeded
500server_errorInternal error

Code Examples

Python

import requests
import time

API_KEY = "pta_your_api_key"
BASE = "https://pretestads.com/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}

# Submit analysis
with open("my_ad.mp4", "rb") as f:
    res = requests.post(f"{BASE}/analyze",
        headers=headers,
        files={"file": f},
        data={"modality": "video", "window_seconds": 60})
analysis = res.json()
print(f"Submitted: {analysis['id']}")

# Poll for results
while True:
    res = requests.get(f"{BASE}/analyze/{analysis['id']}", headers=headers)
    result = res.json()
    if result["status"] == "complete":
        print(f"Score: {result['score']} ({result['label']})")
        print(f"Verdict: {result['verdict']}")
        break
    elif result["status"] == "failed":
        print("Analysis failed")
        break
    time.sleep(5)

python

JavaScript

const API_KEY = "pta_your_api_key";
const BASE = "https://pretestads.com/api/v1";
const headers = { Authorization: `Bearer ${API_KEY}` };

// Submit video analysis
const form = new FormData();
form.append("modality", "video");
form.append("window_seconds", "60");
form.append("file", fileBlob, "my_ad.mp4");

const submitRes = await fetch(`${BASE}/analyze`, {
  method: "POST",
  headers,
  body: form,
});
const { id } = await submitRes.json();

// Poll for results
const poll = async () => {
  const res = await fetch(`${BASE}/analyze/${id}`, { headers });
  const result = await res.json();
  if (result.status === "complete") {
    console.log(`Score: ${result.score} (${result.label})`);
    return result;
  }
  if (result.status === "failed") throw new Error("Failed");
  await new Promise(r => setTimeout(r, 5000));
  return poll();
};
const result = await poll();

javascript

Rate Limits

API requests are limited to 10 requests per minute per API key. Exceeding this limit returns a 429 status with a Retry-After header.