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 groupsfrom 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.