Parsing & Analysis

15 endpoints for parsing and analysing developer inputs — regex patterns, cron expressions, timestamps, user-agents, IP/URL/HTTP structures, colours, number bases, semver strings, file permissions, and environment files.

Endpoints

Method Endpoint Purpose
POST /v1/regex-test Test a regex pattern against text
POST /v1/regex-extract Extract capture groups from text
GET /v1/cron-parse Parse a cron expression and return next run times
GET /v1/cron-next Get next execution times for a cron expression
GET /v1/timestamp Convert Unix timestamps ↔ ISO 8601
POST /v1/user-agent Parse a User-Agent string
GET /v1/ip-calc Calculate IP network details from CIDR
GET /v1/url-parse Decompose a URL into components
POST /v1/http-header-parse Parse raw HTTP headers
GET /v1/color-convert Convert a colour between hex, RGB, HSL, and more
GET /v1/base-convert Convert a number between bases (2–36)
POST /v1/semver-compare Compare and sort semantic version strings
GET /v1/chmod-calc Convert between octal and symbolic file permissions
POST /v1/env-parse Parse a .env file into key-value pairs

Examples

Test a regex pattern

curl -X POST "https://dev.toolkitapi.io/v1/regex-test" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"pattern": "^\\d{4}-\\d{2}-\\d{2}$", "text": "2024-06-15", "flags": ""}'
import requests

resp = requests.post(
    "https://dev.toolkitapi.io/v1/regex-test",
    headers={"X-API-Key": "YOUR_KEY"},
    json={"pattern": r"^\d{4}-\d{2}-\d{2}$", "text": "2024-06-15"},
)
data = resp.json()
print(f"Matched: {data['matched']}, Groups: {data.get('groups', [])}")
const resp = await fetch("https://dev.toolkitapi.io/v1/regex-test", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ pattern: "^\\d{4}-\\d{2}-\\d{2}$", text: "2024-06-15" }),
});
const data = await resp.json();
console.log(`Matched: ${data.matched}`);
Response
{
  "matched": true,
  "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
  "text": "2024-06-15",
  "matches": [{"match": "2024-06-15", "start": 0, "end": 10}],
  "groups": [],
  "flags_used": ""
}

Parse a cron expression

curl "https://dev.toolkitapi.io/v1/cron-parse?expression=0+9+*+*+MON-FRI&count=5&tz=America%2FNew_York" \
  -H "X-API-Key: YOUR_KEY"
import requests

resp = requests.get(
    "https://dev.toolkitapi.io/v1/cron-parse",
    params={"expression": "0 9 * * MON-FRI", "count": 5, "tz": "America/New_York"},
    headers={"X-API-Key": "YOUR_KEY"},
)
data = resp.json()
print(f"Description: {data['description']}")
print("Next runs:")
for run in data["next_runs"]:
    print(f"  {run}")
const params = new URLSearchParams({
  expression: "0 9 * * MON-FRI",
  count: "5",
  tz: "America/New_York",
});
const resp = await fetch(
  `https://dev.toolkitapi.io/v1/cron-parse?${params}`,
  { headers: { "X-API-Key": "YOUR_KEY" } }
);
const data = await resp.json();
console.log(`Cron: ${data.description}`);
console.log(data.next_runs);
Response
{
  "expression": "0 9 * * MON-FRI",
  "description": "At 09:00 AM, Monday through Friday",
  "timezone": "America/New_York",
  "next_runs": ["2026-05-11T09:00:00-04:00", "2026-05-12T09:00:00-04:00", "2026-05-13T09:00:00-04:00"],
  "valid": true
}

Convert a timestamp

curl "https://dev.toolkitapi.io/v1/timestamp?ts=1718438400" \
  -H "X-API-Key: YOUR_KEY"
import requests

resp = requests.get(
    "https://dev.toolkitapi.io/v1/timestamp",
    params={"ts": 1718438400},
    headers={"X-API-Key": "YOUR_KEY"},
)
data = resp.json()
print(f"ISO: {data['iso']}, Unix: {data['unix']}")
const params = new URLSearchParams({ ts: "1718438400" });
const resp = await fetch(
  `https://dev.toolkitapi.io/v1/timestamp?${params}`,
  { headers: { "X-API-Key": "YOUR_KEY" } }
);
const data = await resp.json();
console.log(data.iso);
Response
{
  "unix": 1718438400,
  "iso": "2024-06-15T08:00:00+00:00",
  "utc": "2024-06-15T08:00:00Z",
  "day_of_week": "Saturday",
  "relative": "about 2 days ago"
}

Parse a URL into components

curl "https://dns.toolkitapi.io/v1/url-parse?url=https%3A%2F%2Fapi.toolkitapi.io%2Fv1%2Fitems%3Fpage%3D2%26limit%3D10%23section" \
  -H "X-API-Key: YOUR_KEY"
import requests

resp = requests.get(
    "https://dns.toolkitapi.io/v1/url-parse",
    params={"url": "https://api.toolkitapi.io/v1/items?page=2&limit=10#section"},
    headers={"X-API-Key": "YOUR_KEY"},
)
data = resp.json()
print(f"Scheme: {data['scheme']}, Host: {data['host']}")
print(f"Path: {data['path']}, Query: {data['query']}")
const url = "https://api.toolkitapi.io/v1/items?page=2&limit=10#section";
const params = new URLSearchParams({ url });
const resp = await fetch(
  `https://dns.toolkitapi.io/v1/url-parse?${params}`,
  { headers: { "X-API-Key": "YOUR_KEY" } }
);
const data = await resp.json();
console.log(`${data.scheme}://${data.host}${data.path}`);
Response
{
  "url": "https://api.toolkitapi.io/v1/items?page=2&limit=10#section",
  "scheme": "https",
  "host": "api.toolkitapi.io",
  "port": null,
  "path": "/v1/items",
  "query": {"page": "2", "limit": "10"},
  "fragment": "section",
  "valid": true
}

Calculate IP network details

curl "https://dns.toolkitapi.io/v1/ip-calc?cidr=192.168.1.0%2F24" \
  -H "X-API-Key: YOUR_KEY"
import requests

resp = requests.get(
    "https://dns.toolkitapi.io/v1/ip-calc",
    params={"cidr": "192.168.1.0/24"},
    headers={"X-API-Key": "YOUR_KEY"},
)
data = resp.json()
print(f"Network: {data['network']}")
print(f"Subnet mask: {data['subnet_mask']}")
print(f"Host range: {data['first_host']} – {data['last_host']} ({data['host_count']} hosts)")
const params = new URLSearchParams({ cidr: "192.168.1.0/24" });
const resp = await fetch(
  `https://dns.toolkitapi.io/v1/ip-calc?${params}`,
  { headers: { "X-API-Key": "YOUR_KEY" } }
);
const data = await resp.json();
console.log(`${data.network}/${data.prefix_length}: ${data.host_count} hosts`);
Response
{
  "cidr": "192.168.1.0/24",
  "network": "192.168.1.0",
  "broadcast": "192.168.1.255",
  "subnet_mask": "255.255.255.0",
  "prefix_length": 24,
  "first_host": "192.168.1.1",
  "last_host": "192.168.1.254",
  "host_count": 254,
  "is_private": true,
  "ip_version": 4
}

Parse a User-Agent

curl -X POST "https://dev.toolkitapi.io/v1/user-agent" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"}'
import requests

ua = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36"
resp = requests.post(
    "https://dev.toolkitapi.io/v1/user-agent",
    headers={"X-API-Key": "YOUR_KEY"},
    json={"ua": ua},
)
data = resp.json()
print(f"Browser: {data['browser']['name']} {data['browser']['version']}")
print(f"OS: {data['os']['name']} {data['os']['version']}")
print(f"Device: {data['device']['type']}")
const resp = await fetch("https://dev.toolkitapi.io/v1/user-agent", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({
    ua: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/125.0.0.0",
  }),
});
const data = await resp.json();
console.log(`${data.browser.name} on ${data.os.name} (${data.device.type})`);

Compare semantic versions

curl -X POST "https://dev.toolkitapi.io/v1/semver-compare" \
  -H "X-API-Key: YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"versions": ["1.10.0", "1.9.0", "2.0.0-beta.1", "1.9.1"]}'
import requests

versions = ["1.10.0", "1.9.0", "2.0.0-beta.1", "1.9.1"]
resp = requests.post(
    "https://dev.toolkitapi.io/v1/semver-compare",
    headers={"X-API-Key": "YOUR_KEY"},
    json={"versions": versions},
)
data = resp.json()
print(f"Sorted: {data['sorted']}")
print(f"Latest: {data['latest']}, Oldest: {data['oldest']}")
const resp = await fetch("https://dev.toolkitapi.io/v1/semver-compare", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_KEY", "Content-Type": "application/json" },
  body: JSON.stringify({ versions: ["1.10.0", "1.9.0", "2.0.0-beta.1"] }),
});
const data = await resp.json();
console.log(`Latest: ${data.latest}`);

Python SDK examples for all endpoints

Expand for quick-reference Python examples ### Extract capture groups
from toolkitapi import DevTools

with DevTools(api_key="tk_...") as dt:
    result = dt.regex_extract(
        pattern=r"(\w+)@(\w+)\.(\w+)",
        text="Contact [email protected] or [email protected]",
    )
    print(result["captures"])  # [["alice", "toolkitapi", "io"], ["bob", "corp", "io"]]
### Parse HTTP headers
headers_raw = """GET / HTTP/1.1
Host: toolkitapi.io
Content-Type: application/json
Authorization: Bearer token123"""

with DevTools(api_key="tk_...") as dt:
    result = dt.http_header_parse(headers_raw)
    print(result["headers"])  # {"host": "toolkitapi.io", ...}
### Convert colours
with DevTools(api_key="tk_...") as dt:
    result = dt.color_convert("#FF5733")
    print(result["rgb"])   # "rgb(255, 87, 51)"
    print(result["hsl"])   # "hsl(11, 100%, 60%)"
### Convert number bases
with DevTools(api_key="tk_...") as dt:
    result = dt.base_convert(value="255", from_base=10, to_base=16)
    print(result["result"])  # "FF"
### Parse .env files
env = "DATABASE_URL=postgres://localhost/mydb\nDEBUG=true\nPORT=8000"

with DevTools(api_key="tk_...") as dt:
    result = dt.env_parse(env)
    print(result["variables"])  # {"DATABASE_URL": "postgres://...", "DEBUG": "true", ...}
### chmod calculator
with DevTools(api_key="tk_...") as dt:
    result = dt.chmod_calc("rwxr-xr-x")
    print(result["octal"])     # "755"
    print(result["symbolic"])  # "rwxr-xr-x"

Common parameters

Endpoint Key param Type Required
/v1/regex-test pattern, text string Yes
/v1/regex-extract pattern, text string Yes
/v1/cron-parse expression string Yes
/v1/cron-next expression string Yes
/v1/timestamp ts or iso integer/string One required
/v1/user-agent ua string Yes
/v1/ip-calc cidr string Yes
/v1/url-parse url string Yes
/v1/http-header-parse headers string Yes
/v1/color-convert color string Yes
/v1/base-convert value, from_base, to_base string/int Yes
/v1/semver-compare versions string[] Yes
/v1/chmod-calc mode string Yes
/v1/env-parse data string Yes

Tip

The cron-parse endpoint returns a human-readable description alongside next run times, making it useful for both documentation generation and scheduling UIs.