Developers

Let your agents Beastify.

A REST API, an MCP server and an agent skill. Same engine as the website: post analysis, rewrites, meme search and rendering (images and video). Included with Pro.

Authentication

Create a key in Dashboard → API & MCP (Pro). Send it as a bearer token. Keys are shown once and stored hashed; revoke them anytime.

Header
Authorization: Bearer bst_…

REST API

Base URL https://beastify.xyz/api/v1. JSON in, JSON out. CORS is open, so you can call it from anywhere, but keep keys server-side.

POST/api/v1/improve

Analysis + 3–4 rewrites. With meme, also picks a template, writes captions and renders it.

{ "post": "…", "meme": "auto" | true | false }
POST/api/v1/transform

One quick remix of a version.

{ "text": "…", "kind": "shorter" | "hook" | "human" | "funnier" | "angle" }
GET/api/v1/memes?query=&mediaType=&limit=&offset=

Search the template library by keywords. mediaType: all, image, video.

GET/api/v1/memes/:handle

A template's input fields (text1, text2… with labels/aliases), size and media type.

POST/api/v1/memes/:handle/generate

Render a meme. Images → JPEG, video/GIF templates → MP4. Returns a public URL.

{ "inputs": { "text1": "…", "text2": "…" } }
POST/api/v1/memes/suggest

Let Beastify choose and caption the best template for a post.

{ "post": "…", "query": "optional hint" }
GET/api/v1/me

Your plan and today's usage.

Improve a post

curl
curl https://beastify.xyz/api/v1/improve \
  -H "Authorization: Bearer $BEASTIFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"post": "We launched a new feature that reduces meetings", "meme": "auto"}'
Response (trimmed)
{
  "id": "6720…",
  "analysis": {
    "mainWeakness": "You're explaining the feature before giving people a reason to care.",
    "summary": "…",
    "scores": { "hook": 3, "clarity": 7, "specificity": 5, "curiosity": 4, "personality": 6, "conversation": 8 }
  },
  "variants": [
    { "id": "…", "strategy": "Best", "text": "Your team doesn't need another tool…", "why": "…" }
  ],
  "meme": { "handle": "two-buttons", "url": "https://static.beastify.xyz/memes/…jpg", "mimeType": "image/jpeg", "inputs": { "text1": "…" } },
  "usage": { "used": 12, "limit": 1000, "remaining": 988, "resetsAt": "…" }
}

Search and render a meme

curl
curl "https://beastify.xyz/api/v1/memes?query=choice&limit=3" -H "Authorization: Bearer $BEASTIFY_API_KEY"

curl https://beastify.xyz/api/v1/memes/two-buttons/generate \
  -H "Authorization: Bearer $BEASTIFY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"inputs": {"text1": "Ship it", "text2": "Write tests", "text3": "Me at 5pm"}}'
JavaScript
const res = await fetch("https://beastify.xyz/api/v1/memes/suggest", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.BEASTIFY_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({ post: "Mondays are for deleting unused SaaS tools" }),
});
const { meme } = await res.json(); // meme.url → JPEG or MP4

MCP server

Streamable HTTP endpoint https://beastify.xyz/mcp, stateless, authenticated with your API key. Tools: improve_post, transform_post, search_memes, get_meme_template, generate_meme, suggest_meme.

Claude Code
claude mcp add --transport http beastify https://beastify.xyz/mcp \
  --header "Authorization: Bearer bst_…"
Cursor, Claude Desktop & other JSON configs
{
  "mcpServers": {
    "beastify": {
      "type": "http",
      "url": "https://beastify.xyz/mcp",
      "headers": {
        "Authorization": "Bearer bst_…"
      }
    }
  }
}

Agent skill

A ready-made SKILL.md that teaches agents when and how to use Beastify (REST, no MCP needed). Save it to ~/.claude/skills/beastify/SKILL.md (or your agent's skills folder) and export BEASTIFY_API_KEY.

Install
mkdir -p ~/.claude/skills/beastify && curl -o ~/.claude/skills/beastify/SKILL.md https://beastify.xyz/skill/beastify/SKILL.md
export BEASTIFY_API_KEY=bst_…

Errors & limits

Errors look like {"error": {"code": "RATE_LIMITED", "message": "…"}}. Common codes: MISSING_API_KEY/INVALID_API_KEY (401), PRO_REQUIRED (402), POST_TOO_LONG/INVALID_INPUTS (400), MEME_NOT_FOUND (404), RATE_LIMITED (429), LLM_TIMEOUT (504).

Pro is unlimited for normal use. A daily fair-use ceiling (1,000 improvements, 3,000 follow-ups, 1,500 renders) only stops runaway scripts. Video renders take 10–30 seconds; set your client timeout to at least 120 seconds.