Bearer key · JSON
POST /api/v1/dev
curl -s -X POST https://getattest.com.au/api/v1/dev \
-H "authorization: Bearer $ATTEST_API_KEY" \
-H "content-type: application/json" \
-d '{"operation":"slugify","text":"Attest Tools: one key, one balance"}'
Send the key as a bearer token in the authorization header. One key and one credit balance cover every service, including Attest Capture. A failed call is refunded automatically. No key yet? POST /api/v1/keys issues one with 25 free credits and no signup — see the key guide.
Captured 2026-09-21
Example
This request was run against the running service on 2026-09-21 and the response below is what came back, unedited.
Request JSON
{
"operation": "slugify",
"text": "Attest Tools: one key, one balance"
}
Captured response JSON
{
"call_id": "5a728f7c-b49b-4ce9-be77-f87b9fc6d800",
"operation": "slugify",
"slug": "attest-tools-one-key-one-balance",
"unicode_slug": "attest-tools-one-key-one-balance",
"separator": "-",
"max_length": 80,
"length": 32,
"truncated": false,
"source_length": 34,
"non_latin_scripts": [],
"limits": {
"max_text_length": 10000,
"max_slug_length": 1000
},
"source": "Unicode normalisation from this runtime's ICU (Unicode 16.0), plus the transliteration map in lib/dev_utils-slug.mjs.",
"notes": [
"Accents are folded with Unicode NFKD (é to e, ½ to 1-2); letters with no decomposition (ß, æ, ø, đ, þ, ł) use a small built-in map. Symbols are removed rather than spelled out, so \"Tom & Jerry\" becomes tom-jerry, not tom-and-jerry."
],
"notice": "General information only, computed from the caller's own input. Nothing sent here is stored.",
"checked_at": "2026-09-20T16:55:56.819Z",
"credits_charged": 0,
"credits_remaining": 9996
}
For agents
Use when
Use this when a task needs one of the small developer answers that would otherwise cost a round trip to a web tool: the next times a cron expression fires (in a named time zone and in UTC, with a plain-English reading and a note on which non-standard extensions it uses), what a regular expression matches in a piece of text (run on RE2, so no pattern can backtrack its way into exponential time, and a pattern whose compiled program is too large for the input it was given is refused rather than run), fresh UUIDs (version 4, or time-ordered version 7), a URL slug for a title, or JSON pretty-printed, minified or key-sorted with the line and column of a syntax error. Free, and no data is kept.
15 fields
Input
Scroll the table horizontally to see all fields.
Field / Type / Required / What it does| Field | Type | Required | What it does |
|---|
operation | string | Required | One of cron_next_runs, regex_test, uuid, slugify, json_format. Each one reads its own further fields. |
|---|
expression | string | Optional | The cron expression, for cron_next_runs. |
|---|
timezone | string | Optional | IANA time zone name for cron_next_runs, such as Europe/London. Defaults to UTC. |
|---|
start | string | Optional | ISO instant to start the cron walk from, for cron_next_runs. |
|---|
count | integer | Optional | How many cron runs, or how many UUIDs, to return. |
|---|
pattern | string | Optional | The regular expression, for regex_test. Run on RE2. |
|---|
flags | string | Optional | Distinct letters from i, m, s and u, for regex_test. |
|---|
input | string | Optional | The text to run the pattern over, for regex_test. |
|---|
limit | integer | Optional | Maximum matches to return, for regex_test. |
|---|
version | integer | Optional | 4 (random) or 7 (time-ordered), for uuid. Defaults to 4. |
|---|
text | string | Optional | The title to slugify, or the JSON document to format. |
|---|
max_length | integer | Optional | Cap on the slug length, for slugify. |
|---|
separator | string | Optional | The slug separator. Defaults to a hyphen. |
|---|
indent | integer | Optional | Spaces per level for json_format; 0 minifies. |
|---|
sort_keys | boolean | Optional | Sort object keys, for json_format. |
|---|
HTTP 200
Response
Every successful response also carries call_id (your receipt for the charge), credits_charged and credits_remaining.
Scroll the table horizontally to see all fields.
Field / What it holds| Field | What it holds |
|---|
operation | The operation that ran. |
|---|
next_runs | The next fire times, in the named zone and in UTC (cron_next_runs). |
|---|
normalized | The cron expression as the parser read it (cron_next_runs). |
|---|
matches | The matches found, with their groups and offsets (regex_test). |
|---|
engine | The regex engine and version that ran the pattern (regex_test). |
|---|
program_size | The compiled program size RE2 produced, which is what the cost guard measures (regex_test). |
|---|
uuids | The generated UUIDs (uuid). |
|---|
slug | The ASCII slug (slugify). |
|---|
unicode_slug | The slug with non-Latin scripts kept (slugify). |
|---|
text | The formatted JSON document (json_format). |
|---|
limits | The caps this operation applied. |
|---|
notice | That the answer is computed from the caller's own input and nothing is stored. |
|---|
Machine-readable failures
Errors
Errors return JSON such as {"error":"invalid_api_key"}. A failed call is refunded automatically.
Scroll the table horizontally to see all fields.
Code / Status / Meaning| Code | Status | Meaning |
|---|
operation_required | 400 | No operation was named; the response lists the supported ones. |
|---|
invalid_operation | 400 | operation is not one of the supported names. |
|---|
invalid_cron | 400 | expression is not a cron expression the parser accepts. |
|---|
invalid_timezone | 400 | timezone is not an IANA time zone name. |
|---|
invalid_start | 400 | start is not an ISO instant with a zone. |
|---|
invalid_pattern | 400 | pattern is not valid RE2 syntax. |
|---|
unsupported_regex | 400 | The pattern uses lookaround, backreferences, atomic groups or possessive quantifiers, which RE2 does not have. |
|---|
pattern_too_costly | 400 | The compiled program multiplied by the input length is past the work cap; the pattern is refused rather than run. |
|---|
invalid_flags | 400 | flags is not a string of distinct supported letters. |
|---|
invalid_version | 400 | version is not 4 or 7. |
|---|
invalid_json | 400 | text is not valid JSON; the response carries the line and column. |
|---|
json_too_deep | 400 | The JSON document nests deeper than the cap. |
|---|
output_too_large | 400 | The formatted document is larger than the response cap. |
|---|
On every service
Scroll the table horizontally to see all fields.
Code / Status / Meaning| Code | Status | Meaning |
|---|
invalid_api_key | 401 | The authorization header is missing or the key is unknown. |
|---|
insufficient_credits | 402 | The balance is below this call's cost. The response carries credits_required and credits_remaining. |
|---|
rate_limit_exceeded | 429 | Free keys share 10 calls a minute across every service. The response carries limit and window_seconds. |
|---|
services_unavailable | 503 | The credit store could not be reached. Retry once after 30 seconds. |
|---|
7 worked examples
Examples
Where the answer comes from
Source and scope
cron-parser 5.10.1 (MIT) over the IANA time zone database built into the runtime; RE2 via re2js 2.8.6 (MIT).
Attest reports what it read, with the source it read it from. It is general information, not advice, and not a legal record.
All Attest tools · Service list as JSON · OpenAPI