devpack API Documentation
Use devpack’s most useful tools from your own code. The API is free, needs no sign-up and returns JSON. Every endpoint accepts GET with query parameters or POST with a JSON body.
All endpoints
Text and data
hashbase64url-encodeslugtext-statsjson-formatjwt-decodecase-converthtml-entitiescsv-to-jsonjson-to-csvMarketing
ab-testQuick start
The base URL is https://devpack.app/v1.
curl "https://devpack.app/v1/hash?text=hello"
JavaScript
const res = await fetch('https://devpack.app/v1/uuid?count=2');
const { ok, data, error } = await res.json();
if (!ok) throw new Error(error.message);
console.log(data.uuids);
Python
import requests
r = requests.post('https://devpack.app/v1/json-format', json={'json': '{"a":1}'})
print(r.json()['data']['formatted'])
Send secrets, such as tokens or passwords, in a POST body rather than the URL, because URLs can end up in logs. The API can be called directly from a browser (CORS is open). A machine-readable OpenAPI description is also available.
Responses
Successful calls return {"ok": true, "data": {…}}. Failed calls return an error with a stable code:
{
"ok": false,
"error": { "code": "invalid_request", "message": "Missing required parameter: text" }
}
| Status | Code | Meaning |
|---|---|---|
| 400 | invalid_request | A parameter is missing or invalid |
| 401 | invalid_key | The API key isn’t valid |
| 404 | not_found | Unknown endpoint |
| 429 | rate_limited | A limit was reached. Wait for Retry-After seconds |
| 502 | upstream_error | The site or service being checked failed |
| 503 | unavailable | The API is temporarily off |
Rate limits
No key is needed. Free use is counted per IP address:
| Type | Limit |
|---|---|
| Text, generators and conversion | 60 requests per minute |
| Network checks | 15 requests per minute |
| All requests together | 1,000 requests per day |
Each response includes X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset, X-RateLimit-Daily-Limit and X-RateLimit-Daily-Remaining headers.
API keys
Keys aren’t needed for free use. If you’ve been given one, send it in a header:
curl -H "X-API-Key: YOUR_KEY" "https://devpack.app/v1/uuid"
Need higher limits? Get in touch.
Fair use and privacy
The API is provided as is, under our Terms. Only check sites you’re allowed to test, and don’t use the API to overload any service. We don’t store the text you send. Network checks can only reach public addresses. Limits and endpoints may change; breaking changes will go in a new version.
Text and data
/v1/hash
GETPOSTHash text with MD5 or SHA.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The text to hash, up to 100 KB |
algorithm | string | No | md5, sha1, sha256 (default), sha384 or sha512 |
encoding | string | No | hex (default) or base64 |
Request
curl "https://devpack.app/v1/hash?text=hello&algorithm=sha256"
Response
{
"ok": true,
"data": {
"algorithm": "sha256",
"encoding": "hex",
"hash": "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824"
}
}/v1/base64
GETPOSTEncode or decode Base64.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The input, up to 100 KB |
action | string | No | encode (default) or decode |
url_safe | boolean | No | Use the URL-safe alphabet. Default false |
Request
curl "https://devpack.app/v1/base64?text=hello+world&action=encode"
Response
{
"ok": true,
"data": {
"action": "encode",
"result": "aGVsbG8gd29ybGQ="
}
}/v1/url-encode
GETPOSTPercent-encode or decode a string.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The input, up to 100 KB |
action | string | No | encode (default) or decode |
Request
curl "https://devpack.app/v1/url-encode?text=a+b%26c%3Dd&action=encode"
Response
{
"ok": true,
"data": {
"action": "encode",
"result": "a%20b%26c%3Dd"
}
}/v1/slug
GETPOSTTurn text into a URL slug.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The text to convert |
separator | string | No | - (default) or _ |
Request
curl "https://devpack.app/v1/slug?text=Hello%2C+W%C3%B6rld%21+It%E2%80%99s+2026"
Response
{
"ok": true,
"data": {
"slug": "hello-world-its-2026"
}
}/v1/text-stats
GETPOSTCount words, characters, lines and reading time.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The text, up to 100 KB |
Request
curl "https://devpack.app/v1/text-stats?text=One+two+three.+Four+five%21"
Response
{
"ok": true,
"data": {
"characters": 25,
"charactersNoSpaces": 21,
"words": 5,
"sentences": 2,
"lines": 1,
"readingTimeSeconds": 2
}
}/v1/json-format
GETPOSTValidate JSON, then pretty-print or minify it.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
json | string | Yes | The JSON text, up to 100 KB |
indent | integer | No | Spaces per level, 0–8. Default 2 |
minify | boolean | No | Remove all whitespace. Default false |
Request
curl "https://devpack.app/v1/json-format?json=%7B%22name%22%3A%22devpack%22%2C%22tools%22%3A500%7D&indent=2"
Response
{
"ok": true,
"data": {
"valid": true,
"formatted": "{\n \"name\": \"devpack\",\n \"tools\": 500\n}"
}
}/v1/jwt-decode
GETPOSTDecode a JWT without verifying its signature.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
token | string | Yes | The JWT |
Request
curl "https://devpack.app/v1/jwt-decode?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjMiLCJuYW1lIjoiQWRhIiwiZXhwIjo0MTAyNDQ0ODAwfQ.c2lnbmF0dXJl"
Response
{
"ok": true,
"data": {
"header": {
"alg": "HS256",
"typ": "JWT"
},
"payload": {
"sub": "123",
"name": "Ada",
"exp": 4102444800
},
"expired": false,
"signatureVerified": false
}
}/v1/case-convert
GETPOSTChange text case, such as camelCase or snake_case.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The text, up to 100 KB |
to | string | Yes | lower, upper, title, sentence, camel, pascal, snake, kebab or constant |
Request
curl "https://devpack.app/v1/case-convert?text=Hello+big+world&to=snake"
Response
{
"ok": true,
"data": {
"to": "snake",
"result": "hello_big_world"
}
}/v1/html-entities
GETPOSTEscape or unescape HTML entities.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
text | string | Yes | The text, up to 100 KB |
action | string | No | encode (default) or decode |
Request
curl "https://devpack.app/v1/html-entities?text=%3Ca+href%3D%22%2F%22%3ETom+%26+Jerry%3C%2Fa%3E&action=encode"
Response
{
"ok": true,
"data": {
"action": "encode",
"result": "<a href="/">Tom & Jerry</a>"
}
}/v1/csv-to-json
GETPOSTConvert CSV to JSON.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
csv | string | Yes | The CSV, up to 100 KB |
delimiter | string | No | comma (default), semicolon, tab or pipe |
header | boolean | No | First row holds column names. Default true |
Request
curl "https://devpack.app/v1/csv-to-json?csv=name%2Cage%0AAda%2C36%0AGrace%2C45"
Response
{
"ok": true,
"data": {
"rows": 2,
"columns": [
"name",
"age"
],
"data": [
{
"name": "Ada",
"age": "36"
},
{
"name": "Grace",
"age": "45"
}
]
}
}/v1/json-to-csv
GETPOSTConvert a JSON array of objects to CSV.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
json | string | Yes | A JSON array of objects, up to 100 KB |
Request
curl "https://devpack.app/v1/json-to-csv?json=%5B%7B%22name%22%3A%22Ada%22%2C%22age%22%3A36%7D%2C%7B%22name%22%3A%22Grace%22%2C%22age%22%3A45%7D%5D"
Response
{
"ok": true,
"data": {
"rows": 2,
"columns": [
"name",
"age"
],
"csv": "name,age\nAda,36\nGrace,45"
}
}Generators
/v1/uuid
GETPOSTGenerate random version 4 UUIDs.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
count | integer | No | 1–100. Default 1 |
Request
curl "https://devpack.app/v1/uuid?count=2"
Response
{
"ok": true,
"data": {
"uuids": [
"cd716365-f0d5-4557-9ae6-604e40723bf8",
"308241e6-2312-436a-83b6-4f8303fcd72e"
]
}
}/v1/password
GETPOSTGenerate strong random passwords.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
length | integer | No | 8–128. Default 20 |
count | integer | No | 1–50. Default 1 |
symbols | boolean | No | Include symbols. Default true |
numbers | boolean | No | Include digits. Default true |
uppercase | boolean | No | Include capitals. Default true |
Request
curl "https://devpack.app/v1/password?length=16&count=1"
Response
{
"ok": true,
"data": {
"passwords": [
"@LZ2wH47UpgY!iWK"
]
}
}/v1/lorem-ipsum
GETPOSTGenerate placeholder text.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
paragraphs | integer | No | 1–20. Default 1 |
words | integer | No | Words per paragraph, 5–200. Default 40 |
Request
curl "https://devpack.app/v1/lorem-ipsum?paragraphs=1&words=12"
Response
{
"ok": true,
"data": {
"paragraphs": [
"Lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor."
]
}
}/v1/random
GETPOSTGenerate secure random whole numbers.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
min | integer | No | Lowest value. Default 1 |
max | integer | No | Highest value. Default 100 |
count | integer | No | 1–100. Default 1 |
unique | boolean | No | No repeats. Default false |
Request
curl "https://devpack.app/v1/random?min=1&max=6&count=2"
Response
{
"ok": true,
"data": {
"numbers": [
2,
5
]
}
}Conversion
/v1/color
GETPOSTConvert a color between hex, RGB and HSL.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
value | string | Yes | For example #ff6600, rgb(255, 102, 0) or hsl(24, 100%, 50%) |
Request
curl "https://devpack.app/v1/color?value=%23ff6600"
Response
{
"ok": true,
"data": {
"hex": "#ff6600",
"rgb": {
"r": 255,
"g": 102,
"b": 0
},
"hsl": {
"h": 24,
"s": 100,
"l": 50
},
"css": {
"rgb": "rgb(255, 102, 0)",
"hsl": "hsl(24, 100%, 50%)"
}
}
}/v1/timestamp
GETPOSTConvert between Unix time and ISO 8601 dates.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
value | string | No | Unix seconds, Unix milliseconds or an ISO date. Default: now |
Request
curl "https://devpack.app/v1/timestamp?value=1798761600"
Response
{
"ok": true,
"data": {
"unix": 1798761600,
"unixMs": 1798761600000,
"iso": "2027-01-01T00:00:00.000Z",
"utc": "Fri, 01 Jan 2027 00:00:00 GMT"
}
}/v1/url-parse
GETPOSTSplit a URL into its parts.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to parse |
Request
curl "https://devpack.app/v1/url-parse?url=https%3A%2F%2Fdevpack.app%3A8443%2Ftools%3Fq%3Djson%26page%3D2%23top"
Response
{
"ok": true,
"data": {
"protocol": "https",
"host": "devpack.app",
"port": "8443",
"path": "/tools",
"query": {
"q": "json",
"page": "2"
},
"hash": "top",
"origin": "https://devpack.app:8443"
}
}/v1/number-base
GETPOSTConvert a whole number between bases 2 and 36.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
value | string | Yes | The number |
from | integer | No | Input base. Default 10 |
to | integer | No | Output base. Default 16 |
Request
curl "https://devpack.app/v1/number-base?value=255&from=10&to=16"
Response
{
"ok": true,
"data": {
"result": "ff",
"decimal": "255"
}
}/v1/unit-convert
GETPOSTConvert length, weight, temperature, data and time units.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
value | number | Yes | The amount |
from | string | Yes | m, km, cm, mm, in, ft, yd, mi, kg, g, mg, lb, oz, t, c, f, k, b, kb, mb, gb, tb, kib, mib, gib, ms, s, min, h, d, wk |
to | string | Yes | The target unit, from the same type |
Request
curl "https://devpack.app/v1/unit-convert?value=10&from=km&to=mi"
Response
{
"ok": true,
"data": {
"value": 10,
"from": "km",
"to": "mi",
"result": 6.21371192237
}
}/v1/date-diff
GETPOSTFind the time between two dates.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
from | string | Yes | Start date, in ISO format |
to | string | No | End date. Default: now |
Request
curl "https://devpack.app/v1/date-diff?from=2026-01-01&to=2026-10-30"
Response
{
"ok": true,
"data": {
"days": 302,
"weeks": 43.14,
"hours": 7248,
"minutes": 434880,
"seconds": 26092800
}
}/v1/cron-next
GETPOSTList the next run times of a cron expression, in UTC.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
expression | string | Yes | Five fields: minute hour day month weekday |
count | integer | No | 1–20. Default 5 |
from | string | No | Start date. Default: now |
Request
curl "https://devpack.app/v1/cron-next?expression=0+9+*+*+1&count=2&from=2026-10-30T00%3A00%3A00Z"
Response
{
"ok": true,
"data": {
"expression": "0 9 * * 1",
"runs": [
"2026-11-02T09:00:00.000Z",
"2026-11-09T09:00:00.000Z"
]
}
}/v1/http-status
GETPOSTLook up an HTTP status code.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
code | integer | Yes | 100–599 |
Request
curl "https://devpack.app/v1/http-status?code=404"
Response
{
"ok": true,
"data": {
"code": 404,
"name": "Not Found",
"class": "Client error",
"docs": "https://devpack.app/http-status-codes/404"
}
}/v1/user-agent
GETPOSTParse a user agent string. Defaults to the caller’s.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
ua | string | No | The user agent string |
Request
curl "https://devpack.app/v1/user-agent?ua=Mozilla%2F5.0+%28Windows+NT+10.0%3B+Win64%3B+x64%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F130.0.0.0+Safari%2F537.36"
Response
{
"ok": true,
"data": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36",
"browser": {
"name": "Chrome",
"version": "130.0.0.0"
},
"os": {
"name": "Windows",
"version": "10.0"
},
"device": "desktop",
"bot": false
}
}Marketing
/v1/ab-test
GETPOSTCheck whether an A/B test result is statistically significant.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
visitors_a | integer | Yes | Visitors to version A |
conversions_a | integer | Yes | Conversions for version A |
visitors_b | integer | Yes | Visitors to version B |
conversions_b | integer | Yes | Conversions for version B |
confidence | integer | No | 90, 95 (default) or 99 |
Request
curl "https://devpack.app/v1/ab-test?visitors_a=1000&conversions_a=100&visitors_b=1000&conversions_b=130"
Response
{
"ok": true,
"data": {
"rateA": 0.1,
"rateB": 0.13,
"uplift": 0.3,
"zScore": 2.1027,
"pValue": 0.035488,
"confidence": 95,
"significant": true,
"winner": "B"
}
}Network
/v1/ip
GETPOSTReturn the IP address of the caller.
Request
curl "https://devpack.app/v1/ip"
Response
{
"ok": true,
"data": {
"ip": "203.0.113.42",
"version": "IPv4"
}
}/v1/dns
GETPOSTLook up DNS records. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The domain or IPv4 address |
types | string | No | Comma-separated: A, AAAA, CNAME, MX, TXT, NS, SOA, CAA, SRV, PTR. Default: the common set |
Request
curl "https://devpack.app/v1/dns?domain=example.com&types=A%2CMX"
Response
{
"ok": true,
"data": {
"domain": "example.com",
"results": [
{
"type": "A",
"status": 0,
"records": [
{
"name": "example.com",
"ttl": 300,
"type": "A",
"data": "93.184.215.14"
}
]
},
{
"type": "MX",
"status": 0,
"records": [
{
"name": "example.com",
"ttl": 3600,
"type": "MX",
"data": "0 mail.example.com."
}
]
}
],
"resolver": "Cloudflare 1.1.1.1 (DNS over HTTPS)"
}
}/v1/ssl
GETPOSTCheck a site’s SSL certificate. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The host name |
Request
curl "https://devpack.app/v1/ssl?domain=example.com"
Response
{
"ok": true,
"data": {
"host": "example.com",
"valid": true,
"protocol": "TLSv1.3",
"daysLeft": 74,
"hostnameMatches": true,
"sans": [
"example.com",
"www.example.com"
],
"issuer": {
"C": "US",
"O": "Example CA",
"CN": "Example CA R1"
},
"validFrom": "Oct 1 00:00:00 2026 GMT",
"validTo": "Jan 12 23:59:59 2027 GMT"
}
}/v1/status
GETPOSTCheck whether a website is up. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The page to check |
Request
curl "https://devpack.app/v1/status?url=https%3A%2F%2Fexample.com"
Response
{
"ok": true,
"data": {
"url": "https://example.com/",
"finalUrl": "https://example.com/",
"up": true,
"status": 200,
"time": 182,
"ttfb": 96,
"title": "Example Domain",
"server": "cloudflare",
"checkedAt": "2026-10-30T12:00:00.000Z"
}
}/v1/headers
GETPOSTRead HTTP headers and grade security headers. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The page to check |
Request
curl "https://devpack.app/v1/headers?url=https%3A%2F%2Fexample.com"
Response
{
"ok": true,
"data": {
"url": "https://example.com/",
"status": 200,
"headers": {
"content-type": "text/html",
"server": "cloudflare"
},
"security": {
"score": 25,
"grade": "E",
"https": true,
"missing": [
"Content-Security-Policy",
"X-Frame-Options"
]
}
}
}/v1/redirects
GETPOSTFollow a URL’s redirect chain. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The URL to follow |
Request
curl "https://devpack.app/v1/redirects?url=http%3A%2F%2Fexample.com"
Response
{
"ok": true,
"data": {
"requested": "http://example.com/",
"final": "https://example.com/",
"status": 200,
"chain": [
{
"url": "http://example.com/",
"status": 301,
"time": 88
},
{
"url": "https://example.com/",
"status": 200,
"time": 126
}
],
"totalTime": 214
}
}/v1/whois
GETPOSTLook up domain or IP registration data (RDAP). Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
query | string | Yes | The domain or IP address |
Request
curl "https://devpack.app/v1/whois?query=example.com"
Response
{
"ok": true,
"data": {
"kind": "domain",
"query": "example.com",
"domain": "EXAMPLE.COM",
"source": "https://rdap.verisign.com/com/v1/domain/example.com",
"status": [
"client delete prohibited"
],
"registrar": "Example Registrar",
"ianaId": "376",
"created": "1995-08-14T04:00:00Z",
"updated": "2026-08-14T08:01:43Z",
"expires": "2027-08-13T04:00:00Z",
"dnssec": true,
"nameservers": [
"ns1.example.net",
"ns2.example.net"
],
"entities": []
}
}/v1/meta
GETPOSTRead a page’s title, description and social tags. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The page to read |
Request
curl "https://devpack.app/v1/meta?url=https%3A%2F%2Fexample.com"
Response
{
"ok": true,
"data": {
"url": "https://example.com/",
"status": 200,
"title": "Example Domain",
"description": "An example page.",
"canonical": "https://example.com/",
"robots": null,
"openGraph": {
"title": "Example Domain",
"description": "An example page.",
"image": "https://example.com/og.png"
},
"twitter": {
"card": "summary_large_image",
"image": "https://example.com/og.png"
}
}
}/v1/robots
GETPOSTRead a site’s robots.txt and test whether a path is allowed. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The page or site |
user_agent | string | No | Crawler to test. Default Googlebot |
Request
curl "https://devpack.app/v1/robots?url=https%3A%2F%2Fexample.com%2F&user_agent=Googlebot"
Response
{
"ok": true,
"data": {
"exists": true,
"test": {
"path": "/",
"ua": "Googlebot",
"allowed": true,
"rule": null,
"group": "*"
},
"bots": [
{
"bot": "Googlebot",
"allowed": true,
"rule": null,
"group": "*"
},
{
"bot": "GPTBot",
"allowed": false,
"rule": "/",
"group": "gptbot"
}
]
}
}/v1/email-dns
GETPOSTCheck a domain’s MX, SPF and DMARC email setup. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
domain | string | Yes | The domain |
Request
curl "https://devpack.app/v1/email-dns?domain=example.com"
Response
{
"ok": true,
"data": {
"domain": "example.com",
"checks": [
{
"id": "spf",
"status": "ok",
"title": "SPF valid · 0/10 lookups · -all",
"detail": "v=spf1 -all"
},
{
"id": "dmarc",
"status": "ok",
"title": "DMARC enforced · p=reject",
"detail": "v=DMARC1;p=reject"
}
]
}
}/v1/tech
GETPOSTDetect the technologies a website uses. Network check
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
url | string | Yes | The site to check |
Request
curl "https://devpack.app/v1/tech?url=https%3A%2F%2Fexample.com"
Response
{
"ok": true,
"data": {}
}