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
Create a key
Settings > API > Create key. Pick its scopes; you see the secret once.
- 2
Store it
Put it in KLOUDBOARD_API_KEY (a .env file, your shell, or CI secrets).
- 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_herecurl
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.
read | Read | Boards, cards, Drive, Brain, jobs and balances. |
write | Write | Create and change cards, tasks, files; publish and invite. |
spend | Spend AI credits | Voice, 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.
| Job | Tool | Credits | Cost |
|---|---|---|---|
| Voiceover1,000 characters, about a minute of speech (ElevenLabs) | generate_audio | about 60 | $0.12 |
| Sound effectOne effect (ElevenLabs) | generate_audio | about 45 | $0.09 |
| Music30-second track (ElevenLabs) | generate_audio | about 55 | $0.11 |
| ImageNano Banana 2, per image | generate_image | about 55 | $0.11 |
| Image, sharperNano Banana Pro, per image | generate_image | about 105 | $0.21 |
| Video clip8 seconds, Veo 3.1 Lite | generate_video | about 302 | $0.60 |
| Video clip8 seconds, Veo 3.1 Fast | generate_video | about 905 | $1.81 |
| Video clip8 seconds, Veo 3.1 | generate_video | about 2,412 | $4.82 |
| YouTube thumbnailPikzels pkz_3 (the default model) | generate_thumbnail | about 130 | $0.26 |
| Title ideas3 to 5 titles (Pikzels) | generate_titles | about 60 | $0.12 |
| Thumbnail score0 to 100 grade with a suggestion (Pikzels) | score_thumbnail | about 25 | $0.05 |
| TranscriptOne YouTube video with captions | transcribe | about 15 | $0.03 |
| Transcript from audioPer minute: TikTok, Instagram, Facebook, Drive files, uncaptioned video | transcribe | about 30 | $0.06 |
| Web searchOne search, 5 sources | web_search | about 19 | $0.04 |
| Read a web pageOne page or captioned video | read_url | about 15 | $0.03 |
| Deep researchCited report from up to 12 sources | deep_research | about 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" } }| 400 | invalid_request | Bad JSON, a missing field, or arguments the tool refused. Fix the request; retrying as-is fails again. |
| 401 | unauthenticated | No key, a mistyped key, or a revoked one. |
| 402 | insufficient_credits | The workspace cannot cover the call. Nothing was charged; error.top_up_url is where the owner buys credits. |
| 403 | permission_denied | The key acts as its creator, who lacks this permission in the workspace. |
| 403 | scope_missing | The key was created without the scope this call needs (read, write or spend). |
| 404 | not_found | Unknown tool, card, job or other id. |
| 409 | conflict | The resource changed underneath you since you read it. |
| 409 | idempotency_in_progress | A request with the same Idempotency-Key is still running. Retry after it finishes. |
| 422 | idempotency_key_reused | The Idempotency-Key was used with different arguments. Use a new key. |
| 429 | rate_limited | Too many calls. Wait Retry-After seconds. |
| 500 | internal_error | Failed on our side. Retry with the same Idempotency-Key; quote request_id to support. |
| 502 | upstream_error | A 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.