Skip to content
Docs · Public API

Public API

Plain HTTPS + JSON. Same features as the app: hooks, Studio, scheduling.

Base URL

url
https://app.hookbird.ai/api/public/v1

Authentication

Send your API key as the raw Authorization header (no “Bearer”). Get it in the app under Agents.

bash
curl https://app.hookbird.ai/api/public/v1/agents/ping \
  -H "Authorization: $HOOKBIRD_API_KEY"

Building for other users? Use an OAuth app: its hb_… tokens work in the same header.

Errors

StatusMeaning
400Validation failed. Body: { msg } or the field errors
401No API key, wrong key or invalid token
402Not enough credits. Nothing was reserved
429{ code: "RATE_LIMITED", bucket, limit, retryAfter }
503Feature not configured on this instance

Brand & hooks

EndpointDoes
GET/agents/pingCheck the key: { ok, organization, tools }
GET/brandBrand profile ({ found: false } until read)
POST/hooks/scoreScore { text, platform?, audienceId? }
POST/hooks/generateHooks { topic?, audienceId?, platform?, count? }
bash
curl -X POST https://app.hookbird.ai/api/public/v1/hooks/score \
  -H "Authorization: $HOOKBIRD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"text":"POV: 11pm, your accountant wants 43 receipts","platform":"tiktok"}'

Returns score, pattern, strengths, fixes, rewrite, breakdown and benchmark (percentile, estimated).

Studio

EndpointDoes
GET/studio/formatsFormats, inputs and credit prices
POST/studio/generationsStart: { formatId, input } → { id, status, credits }
GET/studio/generationsList (?status=queued|running|done|failed)
GET/studio/generations/:idStatus and outputs
GET/creditsCredits left
bash
curl -X POST https://app.hookbird.ai/api/public/v1/studio/generations \
  -H "Authorization: $HOOKBIRD_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"formatId":"wall_of_text","input":{"hook":"Nobody tells you this about your first 100 users"}}'

Poll /studio/generations/:id every few seconds until status is done. Outputs are media library files you can attach to a post.

Format ids include wall_of_text, slideshow, hook_plus_demo, voiceover, image_fast, image_quality, image_pro, video_clip. The full list: GET /studio/formats.

Channels

EndpointDoes
GET/integrationsConnected channels: { id, name, identifier, … }
GET/social/:providerSign-in URL to connect a channel
GET/is-connectedWhether any channel is connected
DELETE/integrations/:idDisconnect a channel
GET/analytics/:integration?date=Channel analytics
GET/analytics/post/:postId?date=Post analytics

Media

EndpointDoes
POST/uploadMultipart field file → { id, path }
POST/upload-from-urlImport { url } (public http/https only)
GET/mediaMedia library
bash
curl -X POST https://app.hookbird.ai/api/public/v1/upload \
  -H "Authorization: $HOOKBIRD_API_KEY" \
  -F "file=@./slide-1.png"

Posts

EndpointDoes
POST/postsCreate, schedule or draft
GET/posts?startDate=&endDate=List posts in a range (ISO dates)
DELETE/posts/:idDelete a post (and its group)
GET/find-slot/:idNext free time for a channel
json
{
  "type": "schedule",
  "date": "2026-11-03T18:30:00.000Z",
  "shortLink": false,
  "tags": [],
  "posts": [
    {
      "integration": {
        "id": "<channel id from /integrations>"
      },
      "value": [
        {
          "content": "Nobody tells you this about your first 100 users",
          "image": [
            {
              "id": "<upload id>",
              "path": "<upload path>"
            }
          ]
        }
      ],
      "settings": {
        "__type": "x",
        "who_can_reply_post": "everyone"
      }
    }
  ]
}
  • type: schedule, now or draft.
  • settings.__type is the channel’s identifier; required settings differ per network.
  • Returns one item per channel with its postId.