Archers Intel API
A clean REST API for license key validation, user profiles, and more — built for developers and AI assistants alike.
Base URL & Versioning
All endpoints are versioned. The current version is v1. Prefix every request with /v1.
https://api.archersintel.com/v1/{endpoint}
/v2, etc). Old versions stay live.
Response Format
Every response is JSON. Success and error responses share the same wrapper shape — your code only needs to check ok.
"ok": true, "data": { /* endpoint-specific payload */ }
"ok": false, "error": "error_code", "message": "Human-readable explanation"
Error Codes
| HTTP | error | Meaning |
|---|---|---|
| 400 | missing_params | One or more required query parameters are absent. |
| 400 | not_applicable | The requested action doesn't apply (e.g. product has no license keys). |
| 401 | unauthorized | API secret is missing or incorrect. |
| 404 | not_found | User, product, or resource doesn't exist. |
| 500 | server_error | Unexpected internal error. |
User Profile
Returns a seller's public profile and their listed products.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
username |
string | required | The seller's username on Archers Intel. |
Example Request
curl https://api.archersintel.com/v1/johndoe
const res = await fetch('https://api.archersintel.com/v1/johndoe'); const json = await res.json(); if (json.ok) { console.log(json.data.display_name); // "John Doe" console.log(json.data.products); // array of products }
import requests r = requests.get('https://api.archersintel.com/v1/johndoe') data = r.json() if data['ok']: print(data['data']['display_name']) for product in data['data']['products']: print(product['title'], product['url'])
$res = file_get_contents('https://api.archersintel.com/v1/johndoe'); $data = json_decode($res, true); if ($data['ok']) { echo $data['data']['display_name']; }
Response
{
"ok": true,
"data": {
"username": "johndoe",
"display_name": "John Doe",
"bio": "I build indie tools.",
"location": "Austin, TX",
"website": "https://johndoe.dev",
"avatar_url": "https://archersintel.com/uploads/avatars/abc.jpg",
"joined_at": "2025-11-03 14:22:00",
"product_count": 3,
"products": [
{
"slug": "my-cool-tool",
"title": "My Cool Tool",
"price_cents": 1999,
"pricing_model": "one_time",
"url": "https://archersintel.com/products/my-cool-tool"
}
]
}
}
{ "ok": false, "error": "not_found", "message": "User not found." }
Validate License Key
Checks whether a license key is valid and not revoked. This is a public endpoint — no secret or authentication needed. Call it directly from your app with the key your customer entered.
Path Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
username |
string | required | Your seller username on Archers Intel. |
Query Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
key |
string | required | The license key to validate (e.g. A1B2-C3D4-E5F6-G7H8-I9J0). |
Example Request
curl "https://api.archersintel.com/v1/johndoe/validate_key?key=A1B2-C3D4-E5F6-G7H8-I9J0"
const res = await fetch('https://api.archersintel.com/v1/johndoe/validate_key?key=A1B2-C3D4-E5F6-G7H8-I9J0'); const json = await res.json(); if (json.ok && json.data.valid) { // ✅ Key is valid — grant access } else { // ❌ Key invalid — check json.data.reason }
import requests r = requests.get('https://api.archersintel.com/v1/johndoe/validate_key', params={'key': 'A1B2-C3D4-E5F6-G7H8-I9J0'}) data = r.json() if data['ok'] and data['data']['valid']: print('✅ License valid') else: print(f"❌ Invalid: {data['data']['reason']}")
$url = 'https://api.archersintel.com/v1/johndoe/validate_key?key=' . urlencode('A1B2-C3D4-E5F6-G7H8-I9J0'); $data = json_decode(file_get_contents($url), true); if ($data['ok'] && $data['data']['valid']) { // ✅ Grant access } else { // ❌ Deny — $data['data']['reason'] has the reason code }
Response
{ "ok": true, "data": { "valid": true, "reason": null } }
{ "ok": true, "data": { "valid": false, "reason": "revoked" } }
// reason: "not_found" | "revoked" | "subscription_inactive"
Reason codes
| reason | Meaning |
|---|---|
null | Key is valid and active. Grant access. |
not_found | Key doesn't exist for this product. |
revoked | Key was manually revoked by the seller. |
subscription_inactive | The subscription backing this key has lapsed or been cancelled. |
🤖 AI Integration Guide
Working with an AI assistant (ChatGPT, Claude, Cursor, Copilot, etc.)? Paste the block below as context and tell it what you want to build. It has everything needed to write correct, working integration code on the first try.
📋 Copy this into your AI chat
Replace the placeholder values with your actual username, product slug, and API secret, then describe what you want the AI to build.
I am integrating the Archers Intel API into my project.
BASE URL: https://api.archersintel.com
All responses have this shape:
Success: { "ok": true, "data": { ... } }
Error: { "ok": false, "error": "code", "message": "..." }
=== ENDPOINT 1: User Profile ===
GET /v1/{username}
Returns: username, display_name, bio, location, website, avatar_url, joined_at, product_count, products[]
Each product: { slug, title, price_cents, pricing_model, url }
No authentication required.
=== ENDPOINT 2: License Key Validation ===
GET /v1/{username}/validate_key
Public endpoint — no auth required.
Query params:
key = the license key string (e.g. A1B2-C3D4-E5F6-G7H8-I9J0)
Response data: { valid: bool, reason: null|"not_found"|"revoked"|"subscription_inactive" }
My details:
username: YOUR_USERNAME
Please help me: [DESCRIBE WHAT YOU WANT TO BUILD]
ARCHERS_API_SECRET in an environment variable — never hardcode secrets in source files.
⚡ Quick Start
Three steps to validate a license key in under 5 minutes:
1. Get your API Secret
Go to your seller dashboard → your product → License Settings. Copy the API Secret. Store it as an environment variable.
2. Note your product slug
It's the last part of your product URL: archersintel.com/products/your-slug-here
3. Make the call
curl "https://api.archersintel.com/v1/YOUR_USERNAME/validate_key?key=LICENSE_KEY"