API Reference
The Try It base URL is https://api-tryit.plxi.us. Every endpoint accepts and returns JSON and is authenticated with your API key.
curl -X POST https://api-tryit.plxi.us/v1/example/analyze \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"text": "The quick brown fox jumps over the lazy dog. The dog sleeps.",
"top": 3
}'Authentication
Send an X-API-Key header with every request. Keys are created and revoked in the dashboard; a key is shown once, when it is created, so store it somewhere safe.
X-API-Key: sk_live_...
Plans & limits
Limits apply per account, not per key: every key on the account (and teammates working in it) shares them. There is a per-minute rate, a cap on requests in flight at once, and a monthly quota. On the Free plan the quota resets on the 1st of each month (UTC); on paid plans it resets on your billing-period anniversary. Requests that fail validation are never charged.
| Plan | Price | Requests / min | In flight | Requests / month |
|---|---|---|---|---|
| Free | Free | 10 | 1 | 100 |
| Starter | $10/mo | 60 | 3 | 2,000 |
| Pro | $50/mo | 300 | 6 | 20,000 |
Errors
Errors return JSON with a stable error code, an optional message, and, on rate-limit and quota 429s, reset_at.
{
"error": "rate_limit_exceeded",
"reset_at": "2026-07-22T18:04:00.000Z"
}| Status | Code | When |
|---|---|---|
| 400 | invalid_input | A body field failed validation; message says which one and why. Not charged. |
| 401 | invalid_api_key | The X-API-Key header is missing or not recognised. |
| 403 | account_blocked | The account is suspended. Contact [email protected]. |
| 404 | not_found | No such endpoint. |
| 429 | rate_limit_exceeded | Per-minute request limit reached (per account, across all its keys). reset_at is when the window resets. |
| 429 | concurrency_limit_exceeded | Too many requests in flight at once for your plan. Retry with backoff once one finishes. No reset_at. |
| 429 | monthly_quota_exceeded | Monthly quota used up. reset_at is when it resets: the 1st of next month (UTC) on Free, your billing-period anniversary on paid plans. |
| 500 | internal_error | Something failed on our side. Not charged; safe to retry. |
| 503 | service_unavailable | Temporarily overloaded. Retry with exponential backoff. |
POST/v1/example/analyze
Word, sentence and character counts, reading time and the most used words. Costs 1 request.
{
"text": "The quick brown fox jumps over the lazy dog. The dog sleeps.",
"top": 3
}{
"characters": 60,
"characters_no_spaces": 49,
"credits": 1,
"paragraphs": 1,
"reading_time_seconds": 4,
"sentences": 2,
"top_words": [
{
"count": 2,
"word": "dog"
},
{
"count": 1,
"word": "brown"
},
{
"count": 1,
"word": "fox"
}
],
"words": 12
}curl -X POST https://api-tryit.plxi.us/v1/example/analyze \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"text": "The quick brown fox jumps over the lazy dog. The dog sleeps.",
"top": 3
}'The response is the operation’s result plus credits, what the request was charged. Try it in the Playground.
POST/v1/example/slugify
Turn text into a URL-safe slug (accents removed, lowercase). Costs 1 request.
{
"max_length": 80,
"separator": "-",
"text": "Héllo Wörld: a new post!"
}{
"credits": 1,
"slug": "hello-world-a-new-post"
}curl -X POST https://api-tryit.plxi.us/v1/example/slugify \
-H "X-API-Key: sk_live_..." \
-H "Content-Type: application/json" \
-d '{
"max_length": 80,
"separator": "-",
"text": "Héllo Wörld: a new post!"
}'The response is the operation’s result plus credits, what the request was charged. Try it in the Playground.
GET/v1/usage
Your plan and usage this billing period, for alerting before you reach the quota.
curl https://api-tryit.plxi.us/v1/usage \
-H "X-API-Key: sk_live_..."{
"plan": "starter",
"used": 487,
"limit": 2000,
"period_start": "2026-07-18T09:12:44.000Z",
"period_end": "2026-08-18T09:12:44.000Z"
}Webhooks
Add an HTTPS endpoint under Webhooks in the dashboard and Try It POSTs a request.completed event to it after each charged request. Each endpoint gets its own signing secret (whsec_…), shown once when you add it.
POST /your/webhook HTTP/1.1
Content-Type: application/json
X-Tryit-Event: request.completed
X-Tryit-Signature: sha256=3b5f0c9e41d7…
{
"event": "request.completed",
"data": { "endpoint": "example.analyze", "credits": 1, "ms": 4 },
"created_at": "2026-09-29T14:03:11.482Z"
}X-Tryit-Signature is sha256=<hex>: the HMAC-SHA256 of the raw body, keyed with the endpoint’s full secret including whsec_. Compute it over the bytes you received, before parsing:
import crypto from 'node:crypto';
// rawBody: the request body exactly as received (Buffer or string). Verify it
// before parsing -- JSON that has been parsed and re-serialised won't match.
// secret: the endpoint's full signing secret, "whsec_" prefix included.
function verifySignature(rawBody, signatureHeader, secret) {
const expected =
'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
const given = Buffer.from(String(signatureHeader || ''));
const want = Buffer.from(expected);
return given.length === want.length && crypto.timingSafeEqual(given, want);
}
// Express: take this route's body raw, verify, then parse.
app.post('/your/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const ok = verifySignature(req.body, req.get('X-Tryit-Signature'), process.env.WEBHOOK_SECRET);
if (!ok) return res.sendStatus(401);
const { event, data } = JSON.parse(req.body);
res.sendStatus(200);
});