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
}'
New accounts include 100 free requests per month, no card required. Create an account and grab your key from the dashboard.

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_...
Keep keys on your server. Anyone with your key can spend your quota, so never put it in browser JavaScript or a public repository.

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.

PlanPriceRequests / minIn flightRequests / month
FreeFree101100
Starter$10/mo6032,000
Pro$50/mo300620,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"
}
StatusCodeWhen
400invalid_inputA body field failed validation; message says which one and why. Not charged.
401invalid_api_keyThe X-API-Key header is missing or not recognised.
403account_blockedThe account is suspended. Contact [email protected].
404not_foundNo such endpoint.
429rate_limit_exceededPer-minute request limit reached (per account, across all its keys). reset_at is when the window resets.
429concurrency_limit_exceededToo many requests in flight at once for your plan. Retry with backoff once one finishes. No reset_at.
429monthly_quota_exceededMonthly quota used up. reset_at is when it resets: the 1st of next month (UTC) on Free, your billing-period anniversary on paid plans.
500internal_errorSomething failed on our side. Not charged; safe to retry.
503service_unavailableTemporarily overloaded. Retry with exponential backoff.

POST/v1/example/analyze

Word, sentence and character counts, reading time and the most used words. Costs 1 request.

Example request body
{
  "text": "The quick brown fox jumps over the lazy dog. The dog sleeps.",
  "top": 3
}
Example response · 200
{
  "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.

Example request body
{
  "max_length": 80,
  "separator": "-",
  "text": "Héllo Wörld: a new post!"
}
Example response · 200
{
  "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_..."
Response 200
{
  "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"
}
Verify the signature

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);
});
Reply with any 2xx within 8 seconds. Each event is sent once (no retries); recent attempts are listed under Deliveries on the Webhooks page. Endpoints must be public HTTPS URLs.