Simple User Path
- Create or open your Wakatipu API account at
https://wakatipu-api.appcloud.cyou/account. - Use the 5 free API credits added after signup, or buy more API credits.
- Create an API key from the account page.
- Send
X-API-Key: <your key>with every/api/...request. - Start with document extraction, text cleaning, or article extraction.
Quick Links
Ethical And Safety Use
Use Wakatipu for content you own, are allowed to process, or are permitted to access. Do not use it to bypass paywalls, access controls, rate limits, robots policies, private networks, authentication, or copyright restrictions.
- URL tools are intended for public web URLs and include private-network protections.
- Archive tools inspect for unsafe paths before extraction-style workflows.
- PII helpers are best-effort detection aids, not a compliance guarantee.
- Review OCR, ML, entity, language, and similarity results before important decisions.
- Do not use extraction results for impersonation, credential theft, spam, surveillance, discriminatory decisions, or unauthorized scraping.
Authentication And Billing
All machine endpoints under /api/... require X-API-Key. New accounts receive 5 free API credits. Successful paid API calls consume one API credit; failed calls do not. Monthly credits are consumed before one-time/free credits. Background job submit endpoints consume a credit only when the submit request succeeds; polling a job does not debit another credit.
API keys are managed from the account page. You can create keys, rename them for easier tracking, and revoke old keys. Revoked keys become inactive and are not shown again as raw secrets.
curl -H "X-API-Key: $WAKATIPU_API_KEY" \
https://wakatipu-api.appcloud.cyou/api/tools/catalog
| Product | Use it for |
|---|---|
| Wakatipu API | Machine API calls with customer-owned API keys. |
Plans are Standard $2 for 50 uses, Pro $5 for 200 uses, and Ultimate $15 for 1200 uses. Monthly credits are added by an active subscription. One-time packs stack with monthly and free credits.
Ten High-Value Endpoints
| Method | Endpoint | Use |
|---|---|---|
| POST | /api/documents/extract-text | General text extraction. |
| POST | /api/pdf/extract-tables | Extract tables from PDFs. |
| POST | /api/ocr/image | OCR images and scans. |
| POST | /api/spreadsheets/read | Read CSV and Excel-style rows. |
| POST | /api/email/parse | Parse EML or MSG files. |
| POST | /api/archives/inspect | Inspect archives and flag unsafe entries. |
| POST | /api/web/extract-article | Extract readable article text from a public URL. |
| POST | /api/text/clean | Normalize and clean text. |
| POST | /api/text/pii-redact | Redact common email and phone patterns. |
| POST | /api/vectors/search | Rank supplied documents against a query. |
Examples
Extract Document Text
curl -H "X-API-Key: $WAKATIPU_API_KEY" \
-F "file=@sample.pdf" \
https://wakatipu-api.appcloud.cyou/api/documents/extract-text
Clean Text
curl -H "X-API-Key: $WAKATIPU_API_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"Messy text"}' \
https://wakatipu-api.appcloud.cyou/api/text/clean
Python Examples
import os
import requests
base_url = "https://wakatipu-api.appcloud.cyou"
headers = {"X-API-Key": os.environ["WAKATIPU_API_KEY"]}
with open("sample.pdf", "rb") as handle:
response = requests.post(
f"{base_url}/api/documents/extract-text",
headers=headers,
files={"file": ("sample.pdf", handle, "application/pdf")},
timeout=120,
)
response.raise_for_status()
print(response.json()["text"][:500])
Node.js Examples
import fs from "node:fs";
const baseUrl = "https://wakatipu-api.appcloud.cyou";
const form = new FormData();
form.append("file", new Blob([fs.readFileSync("sample.pdf")]), "sample.pdf");
const response = await fetch(`${baseUrl}/api/documents/extract-text`, {
method: "POST",
headers: {"X-API-Key": process.env.WAKATIPU_API_KEY},
body: form
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
const response = await fetch("https://wakatipu-api.appcloud.cyou/api/text/clean", {
method: "POST",
headers: {
"X-API-Key": process.env.WAKATIPU_API_KEY,
"Content-Type": "application/json"
},
body: JSON.stringify({text: "Messy text\n\nthat needs cleanup"})
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
Endpoint Groups
The complete list is maintained in the expanded endpoint catalog. It covers core Wakatipu file extraction, 70 expanded file endpoints, 30 generated Lucerne JSON endpoints, retained outputs, workflow jobs, billing, account, health, metrics, and admin routes.
- Core files: documents, PDFs, OCR/images, office files, spreadsheets, email, archives, media, URL metadata.
- Expanded files: PDF operations, file fingerprints, DOCX/PPTX/ODF/RTF, spreadsheet profiling, image conversion, OCR layout, archive safety, email intelligence, media transforms.
- Lucerne JSON: web extraction, text cleanup and NLP helpers, ML classification, vectors, workflows, retained JSON outputs.
Background Jobs
Use /api/jobs/pdf/render-pages, /api/jobs/ocr/image, or /api/jobs/media/transcribe for longer work, then poll /api/jobs/{job_id}.
curl -H "X-API-Key: $WAKATIPU_API_KEY" \
https://wakatipu-api.appcloud.cyou/api/jobs/<job_id>
import os
import time
import requests
base_url = "https://wakatipu-api.appcloud.cyou"
headers = {"X-API-Key": os.environ["WAKATIPU_API_KEY"]}
with open("sample.mp3", "rb") as handle:
submit = requests.post(f"{base_url}/api/jobs/media/transcribe", headers=headers, files={"file": handle}, timeout=60)
submit.raise_for_status()
job_id = submit.json()["job_id"]
while True:
status = requests.get(f"{base_url}/api/jobs/{job_id}", headers=headers, timeout=30)
status.raise_for_status()
payload = status.json()
if payload["status"] in {"succeeded", "failed", "cancelled"}:
print(payload)
break
time.sleep(2)
Operational Limits
Default max upload size is 25 MB, default timeout is 120 seconds, rate-limit responses return 429, and quota exhaustion returns 402.