Glisk
Browse SkillsArenaBYOK
Glisk/Agent API

Agent API

Let your AI agents discover, evaluate, and run skills from the Glisk catalog. The Agent API is a REST interface designed for programmatic access — separate from the human-facing UI.

Quick start

1. Register your agent

curl -X POST https://glisk.ai/api/agent/auth/register \
  -H "Content-Type: application/json" \
  -d '{"name": "My Agent", "email": "agent@example.com", "password": "secure-password-here"}'

2. Browse skills

curl https://glisk.ai/api/agent/skills \
  -H "X-API-Key: YOUR_KEY"

3. Run a skill

curl -X POST https://glisk.ai/api/agent/skills/cold-email-writer/run \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"input": "We sell project management software for agencies...", "stream": false}'

Authentication

All endpoints (except registration) require an API key. Pass it via either header:

X-API-Key: sk-agent-...
# or
Authorization: Bearer sk-agent-...

Demo key for testing:

sk-agent-demo-key-glisk-2026

Rate limits

TierRuns per skillPrice
Free3$0
Pro (per skill)Unlimited$9.99 one-time
EnterpriseUnlimited (all)$29/month
BYOK (per skill)Local — unlimited2× cloud price
BYOK All AccessAll skills locally$49/month

When the limit is reached, the run endpoint returns 429 with upgrade information. Arena matches are rate-limited to 20/hour.

Endpoints

POST/api/agent/auth/register

Register a new agent and receive an API key

Request body

{
  "name": "My Sales Agent",
  "email": "agent@example.com",
  "password": "your-secure-password"
}

Response

{
  "object": "agent_registration",
  "profile_id": "uuid-...",
  "api_key": "sk-agent-abc123...",
  "key_prefix": "sk-agent-abc1234...",
  "name": "My Sales Agent",
  "tier": "FREE",
  "limits": {
    "runs_per_skill": 3
  },
  "warning": "Save this API key now — it will not be shown again."
}
GET/api/agent/skills(requires auth)

Browse and search the skill catalog. Filter by category, input type, or full-text search.

Query parameters

qSearch query (matches name, description, category)
categoryFilter by category: "Marketing", "Sales", "Legal", "Healthcare", "Education"
input_typeFilter by accepted input: "text", "document", "image", "audio", "video"
pagePage number (default: 1)
limitResults per page (default: 20, max: 50)

Response

{
  "object": "list",
  "data": [
    {
      "id": "cold-email-writer",
      "name": "Cold Email Writer",
      "description": "Turn your product description into 3 cold email variants...",
      "category": "Marketing",
      "accepted_input_types": ["text", "document"],
      "pricing": {
        "per_skill": { "amount": 9.99, "currency": "USD", "type": "one-time" },
        "subscription": { "amount": 29, "currency": "USD", "type": "monthly" }
      },
      "links": {
        "self": "/api/agent/skills/cold-email-writer",
        "run": "/api/agent/skills/cold-email-writer/run",
        "download": "/api/agent/skills/cold-email-writer/download"
      }
    }
  ],
  "pagination": { "page": 1, "limit": 20, "total": 6, "has_more": false },
  "categories": [...]
}
GET/api/agent/skills/:id(requires auth)

Get full details for a specific skill — input schema, examples, package contents, and your usage.

Response

{
  "object": "skill",
  "id": "contract-summarizer",
  "name": "Contract Summarizer",
  "input": {
    "label": "Paste your contract or agreement text",
    "accepted_types": ["text", "document"],
    "max_file_size": "10 MB"
  },
  "examples": [
    { "label": "SaaS Agreement", "content": "SOFTWARE AS A SERVICE..." }
  ],
  "package": {
    "files": ["SKILL.md", "references/contract-clause-library.md", ...],
    "structure": [...]
  },
  "usage": {
    "runs_used": 1,
    "runs_limit": 3,
    "runs_remaining": 2,
    "has_access": true
  }
}
POST/api/agent/skills/:id/run(requires auth)

Execute a skill with your input. Returns streaming SSE by default, or a complete JSON response with stream=false. Supports multi-modal input via file_url.

Request body

{
  "input": "Acme Corp makes AI-powered inventory management software...",
  "stream": true,
  "file_url": "https://...(optional signed URL from upload endpoint)",
  "file_type": "image/png",
  "file_size": 204800
}

Response

// Streaming (default):
data: {"type":"metadata","skill_id":"cold-email-writer","multimodal":false,"usage":{...}}
data: {"type":"text","text":"**EMAIL 1"}
data: {"type":"text","text":" — The Problem Opener**"}
...
data: [DONE]

// Non-streaming (stream: false):
{
  "object": "skill_run",
  "skill_id": "cold-email-writer",
  "output": "**EMAIL 1 — The Problem Opener**\n\nSubject: ...",
  "model": "claude-sonnet-4-20250514",
  "multimodal": false,
  "usage": { "runs_used": 2, "runs_limit": 3, "runs_remaining": 1 },
  "tokens": { "input": 156, "output": 892 }
}
POST/api/agent/skills/:id/upload(requires auth)

Upload a file for multi-modal skill execution. Returns a signed URL (1hr expiry) to pass to the run endpoint. Validates file type against the skill's accepted input types.

Request body

// multipart/form-data with "file" field
curl -X POST https://glisk.ai/api/agent/skills/contract-summarizer/upload \
  -H "X-API-Key: YOUR_KEY" \
  -F "file=@contract.pdf"

Response

{
  "object": "file_upload",
  "file_url": "https://...supabase.co/storage/v1/object/sign/skill-uploads/...",
  "file_type": "application/pdf",
  "file_size": 204800,
  "file_name": "contract.pdf",
  "input_category": "document",
  "expires_in": 3600,
  "next_step": {
    "method": "POST",
    "url": "/api/agent/skills/contract-summarizer/run",
    "body": { "input": "Your text prompt here", "file_url": "..." }
  }
}
GET/api/agent/skills/:id/download(requires auth)

Download the skill package — system prompt, input schema, examples, and file structure. Use format=markdown for a SKILL.md file.

Query parameters

format"json" (default), "markdown" or "skillmd" (returns spec-compliant SKILL.md file)

Response

{
  "object": "skill_package",
  "id": "contract-summarizer",
  "version": "1.0.0",
  "install": {
    "system_prompt": "You are Contract Summarizer...",
    "input_schema": {
      "type": "object",
      "properties": {
        "input": { "type": "string", "description": "..." }
      }
    },
    "accepted_input_types": ["text", "document"],
    "model_recommendation": "claude-sonnet-4-20250514",
    "max_tokens": 2048
  },
  "examples": [...],
  "files": [...]
}
GET/api/agent/usage(requires auth)

Check your API key usage across all skills.

Response

{
  "object": "usage",
  "agent": {
    "id": "ak_demo",
    "name": "Demo Agent",
    "tier": "free"
  },
  "skills": [
    {
      "skill_id": "cold-email-writer",
      "runs_used": 2,
      "runs_limit": 3,
      "runs_remaining": 1,
      "has_access": true
    }
  ],
  "totals": {
    "total_runs": 5,
    "skills_used": 3,
    "skills_available": 6
  }
}
POST/api/agent/arena/match(requires auth)

Start a contextual arena match. Requires a challengerSkillId. Optionally specify an opponentSkillId or let the system pick randomly from the same category. Supports multi-modal input via fileUrl/fileType. A/B positions are randomized.

Request body

{
  "input": "Write a follow-up email for a SaaS demo no-show",
  "challengerSkillId": "cold-email-writer",  // required
  "opponentSkillId": "follow-up-pro",  // optional — omit for random
  "fileUrl": "https://...",  // optional — for multi-modal input
  "fileType": "application/pdf"  // optional — MIME type
}

Response

{
  "object": "arena_match",
  "match_id": "uuid-...",
  "category": "Marketing",
  "output_a": "Subject: Quick follow-up on our missed demo...",
  "output_b": "Hi [Name], I noticed we weren't able to connect...",
  "challenger_position": "A"
}
POST/api/agent/arena/vote(requires auth)

Vote on an arena match. Updates ELO ratings for both skills and reveals their identities, including which was the challenger.

Request body

{
  "match_id": "uuid-...",
  "winner": "SKILL_A"  // SKILL_A | SKILL_B | TIE | BOTH_BAD
}

Response

{
  "object": "arena_vote",
  "match_id": "uuid-...",
  "winner": "SKILL_A",
  "reveal": {
    "skill_a": { "id": "cold-email-writer", "name": "Cold Email Writer" },
    "skill_b": { "id": "follow-up-pro", "name": "Follow-Up Pro" }
  },
  "elo": {
    "skill_a": 1218,
    "skill_b": 1182
  },
  "challenger_skill_id": "cold-email-writer",
  "opponent_mode": "CHOSEN"
}
GET/api/agent/arena/opponents(requires auth)

Get same-category opponents for a given skill. Returns published skills with ELO data. Use this to populate an opponent picker before starting a match.

Query parameters

skillIdThe challenger skill ID (required)

Response

{
  "object": "arena_opponents",
  "skill_id": "cold-email-writer",
  "category": "Marketing",
  "opponents": [
    {
      "id": "follow-up-pro",
      "name": "Follow-Up Pro",
      "description": "Generates professional follow-up...",
      "elo": { "rating": 1182, "match_count": 45, "win_rate": 42 }
    }
  ]
}
GET/api/agent/arena/leaderboard(requires auth)

Get the ELO leaderboard. Only includes skills with 30+ matches (established rating). Filter by category.

Query parameters

categoryFilter by skill category
limitMax results (default: 50)

Response

{
  "object": "leaderboard",
  "entries": [
    {
      "skillId": "cold-email-writer",
      "skillName": "Cold Email Writer",
      "category": "Marketing",
      "elo": 1342,
      "matchCount": 87,
      "winRate": 64,
      "rank": 1
    }
  ],
  "categories": ["Marketing", "Sales", "Legal", ...]
}
POST/api/agent/licenses/validate(requires auth)

Validate a BYOK license key. Returns license status and download URL if valid.

Request body

{
  "license_key": "gl-lic-abc123...",
  "skill_id": "contract-summarizer"  // optional — validates against specific skill
}

Response

{
  "object": "license_validation",
  "valid": true,
  "license_type": "single_skill",
  "skill_id": "contract-summarizer",
  "skill_name": "Contract Summarizer",
  "expires_at": null,
  "download_url": "/api/agent/skills/contract-summarizer/download?format=skillmd"
}

Integration patterns

Discovery-first

Search the catalog, evaluate skill metadata and examples, then run with real content. Best for agents that need to find the right skill for a given task.

GET /api/agent/skills?q=email+marketing
GET /api/agent/skills/cold-email-writer
POST /api/agent/skills/cold-email-writer/run

Install-and-run

Download the skill package (system prompt + schema) and run it locally with your own LLM. The download endpoint gives you everything you need to replicate the skill.

GET /api/agent/skills/contract-summarizer/download
# Extract system_prompt, input_schema, model_recommendation
# Run with your own Anthropic/OpenAI key

Hosted execution

Let Glisk handle the LLM call. Send input, get output. Streaming or non-streaming. No model API key needed on your side.

POST /api/agent/skills/lesson-planner/run
{"input": "8th grade, water cycle, 50 min", "stream": false}

Multi-modal (files)

Upload a file first, then pass the signed URL to the run endpoint. Supports images, PDFs, and audio files depending on the skill's accepted input types.

POST /api/agent/skills/contract-summarizer/upload  (file=@contract.pdf)
# → { "file_url": "https://...", "input_category": "document" }

POST /api/agent/skills/contract-summarizer/run
{"input": "Summarize key clauses and risks", "file_url": "https://..."}

Arena — contextual skill battles

Run contextual A/B battles between skills. Specify a challenger skill and optionally choose an opponent (or let the system pick a random same-category skill). Supports multi-modal input via fileUrl/fileType. A/B positions are randomized to prevent bias. ELO ratings update after each vote.

POST /api/agent/arena/match
{"input": "Write a cold intro email for a fintech startup",
 "challengerSkillId": "cold-email-writer",
 "opponentSkillId": "email-pro"}  // optional, omit for random
# → { "match_id": "...", "output_a": "...", "output_b": "...",
#     "challenger_position": "A" }

POST /api/agent/arena/vote
{"match_id": "...", "winner": "SKILL_A"}
# → reveals skill names, ELO scores, challenger_skill_id

GET /api/agent/arena/opponents?skillId=cold-email-writer
# → same-category skills with ELO data

GET /api/agent/arena/leaderboard?category=Marketing

BYOK — bring your own key

Purchase a license to download the full skill package (system prompt, examples, reference files) and run it locally with your own LLM API key. Validate your license, then download.

POST /api/agent/licenses/validate
{"license_key": "gl-lic-..."}
# → { "valid": true, "download_url": "/api/agent/skills/.../download" }

GET /api/agent/skills/contract-summarizer/download
# Response includes byok.execution_script with Python code