Text statistics

FREE with proof-of-work · or $0.001 in USDC · POST /api/text-stats

Counts for any text in one call: characters (Unicode code points), words, sentences, paragraphs, avgWordLength, readingTimeMinutes (200 words a minute) and estimatedTokens, a rough LLM token estimate (about 4 characters a token, one per Chinese or Japanese character). Send POST /api/text-stats with the required field text and pay $0.001 per call over x402 or MPP, or call it free by solving a proof-of-work challenge. It returns a JSON object with characters, words, sentences, paragraphs, avgWordLength and 2 more.

Chinese and Japanese text, which has no spaces, is counted a character per word, and 。!? end sentences. Use it to budget a prompt or size a document before sending it; for an exact count on one model's tokenizer use a tokenizer tool.

Category: Text processing · Tags: text statistics tokens reading-time

TRY IN PLAYGROUND →

Parameters

NameTypeRequiredDescription
textstringyesText to analyze (max 500KB) Also accepted as content, str, string, input, body, data.

Example request

curl -i -X POST https://agent402.tools/api/text-stats \
  -H "Content-Type: application/json" \
  -d '{"text":"The x402 protocol lets an agent pay for a single request. A server answers with payment terms, the agent signs a stablecoin authorization, and the request is retried with the payment attached. Payment settles on chain, so the server needs no account and the agent needs no subscription. The x402 protocol prices each request on its own, and payment terms travel with the request itself."}'

Without payment this returns HTTP 402 Payment Required with the exact price for text-stats; any x402 v2 or MPP client pays it and retries.

Example response

{
  "characters": 386,
  "words": 65,
  "sentences": 4,
  "paragraphs": 1,
  "avgWordLength": 4.95,
  "readingTimeMinutes": 0.3,
  "estimatedTokens": 97
}
FieldTypeAlways presentIn the example
charactersnumberyes386
wordsnumberyes65
sentencesnumberyes4
paragraphsnumberyes1
avgWordLengthnumberyes4.95
readingTimeMinutesnumberyes0.3
estimatedTokensnumberyes97

From an MCP client

catalog.call {
  "slug": "text-stats",
  "params": {
    "text": "The x402 protocol lets an agent pay for a single request. A server answers with payment terms, the agent signs a stablecoin authorization, and the request is retried with the payment attached. Payment settles on chain, so the server needs no account and the agent needs no subscription. The x402 protocol prices each request on its own, and payment terms travel with the request itself."
  }
}

On the hosted connector at https://agent402.tools/mcp, catalog.call runs text-stats free (rate-limited, no wallet). Local install: npx -y agent402-mcp.

Errors and behavior

Paid call (JavaScript agent)

import { wrapFetchWithPayment } from "@x402/fetch";
import { x402Client } from "@x402/core/client";
import { registerExactEvmScheme } from "@x402/evm/exact/client";
import { privateKeyToAccount } from "viem/accounts";

const client = new x402Client();
client.setSpendControls?.(false); // keep your own spending ceiling in code
registerExactEvmScheme(client, { signer: privateKeyToAccount(KEY) });
const payFetch = wrapFetchWithPayment(fetch, client);

const res = await payFetch("https://agent402.tools/api/text-stats", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({
    "text": "The x402 protocol lets an agent pay for a single request. A server answers with payment terms, the agent signs a stablecoin authorization, and the request is retried with the payment attached. Payment settles on chain, so the server needs no account and the agent needs no subscription. The x402 protocol prices each request on its own, and payment terms travel with the request itself."
  }),
});

No wallet? Pay with compute

Fetch a challenge, solve the sha256 puzzle (16 leading zero bits, a fraction of a second of CPU), and resend with the X-Pow-Solution header:

import { createHash } from "node:crypto";
const lz = (b) => { let t = 0; for (const x of b) { if (!x) { t += 8; continue; } t += Math.clz32(x) - 24; break; } return t; };
const c = await (await fetch("https://agent402.tools/api/pow/challenge?slug=text-stats")).json();
let n = 0;
while (lz(createHash("sha256").update(c.challenge + ":" + n).digest()) < c.difficulty) n++;
await fetch("https://agent402.tools/api/text-stats", { method: "POST", headers: { "X-Pow-Solution": c.token + ":" + n, "Content-Type": "application/json" }, body: JSON.stringify({"text":"The x402 protocol lets an agent pay for a single request. A server answers with payment terms, the agent signs a stablecoin authorization, and the request is retried with the payment attached. Payment settles on chain, so the server needs no account and the agent needs no subscription. The x402 protocol prices each request on its own, and payment terms travel with the request itself."}) });

Part of these workflows

Text statistics is one step in these 4 skill packs, each sold as a single call:

Related tools

Case convert

FREE w/ compute · or $0.001 · POST /api/case

Convert text between camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, Title Case, lower, UPPER.

Count

FREE w/ compute · or $0.001 · POST /api/count

Count characters, words, lines, and (optionally) occurrences of a substring in text.

Dedupe lines

FREE w/ compute · or $0.001 · POST /api/dedupe-lines

Remove duplicate lines, preserving first-seen order. Returns the deduped text and how many were removed.

Keyword extraction

FREE w/ compute · or $0.002 · POST /api/keywords

Top keywords and two-word phrases by frequency (stopwords removed). Cheap, deterministic signal for routing, tagging, an…

Lorem ipsum

FREE w/ compute · or $0.001 · GET /api/lorem

Placeholder text. ?paragraphs=1..20 or ?words=1..2000.

Readability

FREE w/ compute · or $0.001 · POST /api/readability

Flesch Reading Ease score and Flesch–Kincaid grade level for English text, plus word/sentence/syllable counts.