kloudboard API

One key. Every AI tool.

Voice, images, thumbnails, video, transcripts, research, kloudie and your workspace from Claude Code, scripts or CI. One API key, one AI credit balance. No OpenAI, ElevenLabs or Google accounts to set up.

Quickstart in three steps

  1. 1

    Create a key

    Settings > API > Create key. Pick its scopes; you see the secret once.

  2. 2

    Store it

    Put it in KLOUDBOARD_API_KEY (a .env file, your shell, or CI secrets).

  3. 3

    Connect or call

    Add it to Claude Code with one command, or call any tool over HTTPS.

Claude Code

Every tool in your terminal, billed to this workspace's AI credits. No provider keys, no browser sign-in (good for CI).

claude mcp add --transport http kloudboard https://app.kloudboard.com/mcp \
  --header "Authorization: Bearer $KLOUDBOARD_API_KEY"

.env

Keep the key in an environment variable; every example here reads it.

KLOUDBOARD_API_KEY=kbk_your_key_here

curl

Check the balance (free), then run any tool by name with its arguments as JSON.

curl https://app.kloudboard.com/api/v1/credits \
  -H "Authorization: Bearer $KLOUDBOARD_API_KEY"

curl -X POST https://app.kloudboard.com/api/v1/tools/generate_audio \
  -H "Authorization: Bearer $KLOUDBOARD_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{"capability":"tts","prompt":"Hello from kloudboard."}'

TypeScript

Plain fetch, no SDK needed. Paid calls report their cost in X-Credits-Charged.

const res = await fetch("https://app.kloudboard.com/api/v1/tools/web_search", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.KLOUDBOARD_API_KEY}`,
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID(),
  },
  body: JSON.stringify({ query: "best time to post on YouTube" }),
});
const body = await res.json();
if (!body.ok) throw new Error(`${body.error.code}: ${body.error.message}`);
console.log(body.data, res.headers.get("X-Credits-Charged"));

Python

requests, with the same envelope: ok, data, error.code.

import os, uuid, requests

res = requests.post(
    "https://app.kloudboard.com/api/v1/tools/web_search",
    headers={
        "Authorization": f"Bearer {os.environ['KLOUDBOARD_API_KEY']}",
        "Idempotency-Key": str(uuid.uuid4()),
    },
    json={"query": "best time to post on YouTube"},
)
body = res.json()
if not body["ok"]:
    raise RuntimeError(f"{body['error']['code']}: {body['error']['message']}")
print(body["data"], res.headers.get("X-Credits-Charged"))

What one key reaches

Every tool is POST /api/v1/tools/<tool> with its arguments as JSON. GET /api/v1/tools lists them with their schemas; the tool reference has every one.

LLM text

POST /api/v1/text: drafts, summaries and rewrites on fast, standard or writer models. No model provider key.

Voice, music and sound

ElevenLabs voiceovers with word timestamps, sound effects and music.

generate_audiolist_voices

Images and thumbnails

Nano Banana images, Pikzels thumbnails, scores and title ideas.

generate_imagegenerate_thumbnailscore_thumbnailgenerate_titles

Video

Veo clips and YouTube rough cuts, as jobs you poll.

generate_videocreate_youtube_video

Transcripts

YouTube, TikTok, Instagram and your own files, timestamped.

transcriberead_url

Research

The open web and YouTube, with cited reports.

web_searchdeep_researchsearch_youtubefind_outlier_videos

An AI teammate

Scripts, plans and answers from the assistant that knows your workspace.

ask_kloudie

Your workspace

Boards, cards, tasks, Drive and the Brain.

list_cardscreate_cardsearch_drivesearch_brain

Authentication and scopes

Send Authorization: Bearer $KLOUDBOARD_API_KEY. A key belongs to one workspace, acts as the member who created it, and stops working when it is revoked or they leave. The same key works as a Bearer header on the MCP server, so headless Claude Code and CI need no browser sign-in.

readReadBoards, cards, Drive, Brain, jobs and balances.
writeWriteCreate and change cards, tasks, files; publish and invite.
spendSpend AI creditsVoice, images, video, research and every other paid tool (ask_kloudie also needs Write).

Credits and pricing

1 AI credit = $0.002. Paid calls hold their estimate first, refund what they do not use, and report the charge in cost and the X-Credits-Charged and X-Credits-Remaining headers. Reads are free; get_pricing quotes any plan before you run it.

JobToolCreditsCost
Voiceover1,000 characters, about a minute of speech (ElevenLabs)generate_audioabout 60$0.12
Sound effectOne effect (ElevenLabs)generate_audioabout 45$0.09
Music30-second track (ElevenLabs)generate_audioabout 55$0.11
ImageNano Banana 2, per imagegenerate_imageabout 55$0.11
Image, sharperNano Banana Pro, per imagegenerate_imageabout 105$0.21
Video clip8 seconds, Veo 3.1 Litegenerate_videoabout 302$0.60
Video clip8 seconds, Veo 3.1 Fastgenerate_videoabout 905$1.81
Video clip8 seconds, Veo 3.1generate_videoabout 2,412$4.82
YouTube thumbnailPikzels pkz_3 (the default model)generate_thumbnailabout 130$0.26
Title ideas3 to 5 titles (Pikzels)generate_titlesabout 60$0.12
Thumbnail score0 to 100 grade with a suggestion (Pikzels)score_thumbnailabout 25$0.05
TranscriptOne YouTube video with captionstranscribeabout 15$0.03
Transcript from audioPer minute: TikTok, Instagram, Facebook, Drive files, uncaptioned videotranscribeabout 30$0.06
Web searchOne search, 5 sourcesweb_searchabout 19$0.04
Read a web pageOne page or captioned videoread_urlabout 15$0.03
Deep researchCited report from up to 12 sourcesdeep_researchabout 325$0.65

Responses and errors

Every answer is { ok, data } or { ok: false, error: { code, message, hint, request_id } } with a real status code and an X-Request-Id header. Switch on error.code.

// 200
{ "ok": true, "tool": "generate_audio", "data": { "asset": { "url": "https://…" } },
  "cost": { "credits": 60, "usd": "$0.12", "balance": 12250 } }

// 402
{ "ok": false, "error": { "code": "insufficient_credits",
  "message": "This costs about 60 AI credits and the workspace has 12 left.",
  "hint": "Nothing was charged. Top up AI credits, then retry with the same Idempotency-Key.",
  "top_up_url": "https://app.kloudboard.com/settings?tab=billing",
  "request_id": "req_5f0c6a1b2c3d4e5f6a7b8c9d" } }
400invalid_requestBad JSON, a missing field, or arguments the tool refused. Fix the request; retrying as-is fails again.
401unauthenticatedNo key, a mistyped key, or a revoked one.
402insufficient_creditsThe workspace cannot cover the call. Nothing was charged; error.top_up_url is where the owner buys credits.
403permission_deniedThe key acts as its creator, who lacks this permission in the workspace.
403scope_missingThe key was created without the scope this call needs (read, write or spend).
404not_foundUnknown tool, card, job or other id.
409conflictThe resource changed underneath you since you read it.
409idempotency_in_progressA request with the same Idempotency-Key is still running. Retry after it finishes.
422idempotency_key_reusedThe Idempotency-Key was used with different arguments. Use a new key.
429rate_limitedToo many calls. Wait Retry-After seconds.
500internal_errorFailed on our side. Retry with the same Idempotency-Key; quote request_id to support.
502upstream_errorA provider failed. Nothing was charged; retrying is safe.

Safe retries

Send an Idempotency-Key (a UUID) on every POST. A retry with the same key returns the first success for 24 hours instead of charging twice; failures stay retryable.

Long jobs

Video, long transcripts and long assistant turns answer 202 with a Location of /api/v1/jobs/<id>. Poll it every Retry-After seconds until data.done.

Rate limits

1,000 tool calls an hour per key, shared with MCP, and 120 an hour on the resource endpoints. A 429 carries Retry-After. Spend is capped by credits, never by surprise invoices.