API Documentation
Complete reference for Devsly Developer Tools API with interactive examples
DevSly MCP Server
DevSly runs a hosted MCP server (Model Context Protocol). Add it to Claude — or any AI client that supports remote MCP — and your assistant can call DevSly tools directly from the chat: DNS/IP/HTTP lookups, the webhook tester, the NotebookLM & Gemini video watermark remover, and a page design auditor that flags unedited-AI-template tells (stock gradients, glassmorphism, emoji icon grids, cliché copy) alongside accessibility issues.
https://devsly.io/mcp
No API key needed. MCP uses OAuth 2.1 — when you add the server, your client sends you to
DevSly to sign in and approve access, then receives a token automatically. This is separate from the REST
API keys documented below (those are only for /api/v1). Manage or revoke connected AI apps from
your dashboard under the AI / MCP tab.
Connect your AI assistant
Adding DevSly to Claude takes under a minute.
- Open Claude → Settings → Connectors (or “Add custom connector”).
- Paste
https://devsly.io/mcpas the server URL and continue. - You’ll be redirected to DevSly — sign in and click Approve.
- Ask the assistant to use a tool, e.g. “look up the DNS records for example.com.”
curl -X POST https://devsly.io/mcp \
-H "Authorization: Bearer <oauth-token>" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Without a token the endpoint returns 401 with a
WWW-Authenticate header pointing at the OAuth metadata, which is what starts the sign-in flow.
Available tools
Eleven tools are exposed over tools/call. They reuse the same validation and SSRF protections as the REST API. Every tool also carries standard MCP annotations — readOnlyHint, destructiveHint, idempotentHint, openWorldHint — so any MCP-compatible client (Claude or otherwise, not just tools/list's name/description text) can tell automatically which tools are safe to call freely and which change or delete something, without needing model-specific instructions.
| Tool | Arguments | Description |
|---|---|---|
ip_info | ip | Geolocation, ISP/ASN, reverse DNS, IPv4/IPv6 class for an IP. |
dns_lookup | domain | A / AAAA / MX / NS / TXT / CNAME / SOA records. |
http_headers | url | Final HTTP status & response headers (SSRF-guarded). |
webhook_create | — | Create a webhook test endpoint and capture URL. |
webhook_list | — | List your webhook endpoints with request counts. |
webhook_requests | webhook_id | Read requests captured by a webhook endpoint. |
webhook_delete | webhook_id | Delete a webhook endpoint and its captured requests. |
remove_video_watermark | service | Start a NotebookLM/Gemini video watermark-removal job. |
watermark_status | job_id | Poll a watermark job; returns the cleaned-video download link. |
discover_site_pages | url, limit | List up to 20 page URLs for a site (sitemap.xml, or homepage links). |
audit_page_design | url, page_type | Audit one page for AI-template tells, accessibility, and style-budget issues. |
{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{"name":"dns_lookup","arguments":{"domain":"example.com"}}}Video watermark remover
A remote MCP server can’t receive a local file from the chat, so remove_video_watermark returns a
one-time upload_url. The assistant can upload the video for you, or hand you the link to upload it
in your browser (up to 300 MB, 2 hours). Then watermark_status returns a single-use download
link for the cleaned video. Uploads and results are deleted right after processing.
remove_video_watermark({service:"gemini"}) → { job_id, upload_url }
POST the MP4 to upload_url (multipart/form-data, field "video")
watermark_status({job_id}) → { status:"done", download_url }Design audit
audit_page_design fetches one page (and up to 4 linked stylesheets, all SSRF-guarded) and
reports design issues an assistant can fix directly: signs the page is an unedited AI-generated template
(stock gradient heroes, gradient-filled headings, glassmorphism cards, decorative blobs, emoji feature
icons, fake "trusted by" logos, a blinking green "live"/"online" dot with no real signal behind it, cliché
copy, one generic font with no identity, every surface sharing an
identical corner-radius/shadow recipe), alignment bugs at the source level (a spacing class applied to only
some of an otherwise-identical repeated group, missing box-sizing: border-box combined with
width+padding, floats with no clearfix, columns mixing width units), plus baseline accessibility (contrast,
touch targets, missing alt text) and style-budget proliferation. Each finding carries a selector/property, what was measured, the
threshold, and a concrete fix. It audits one page per call — use
discover_site_pages first to get a page list, then call it once per URL.
discover_site_pages({url:"https://example.com/"}) → { source, pages: [...] }
audit_page_design({url: pages[0]}) → { page_type, findings: [...], summary }
// repeat audit_page_design for each page in the listResults are heuristic static analysis (no real browser layout or CSS cascade) — a good sanity check before shipping a fix, not a substitute for looking at the rendered page. Fetched page content is third-party data; treat it as such, not as instructions.
Results are cached per URL — 5 minutes for audit_page_design, 30 minutes for
discover_site_pages — so repeatedly checking the same page (an assistant re-verifying mid‑chat,
a retry, looping over a page list twice) doesn't refetch it every time; the response includes
cached and cache_age_seconds so you can tell live results from cached ones. Pass
fresh: true to force a live re-check, e.g. right after applying a fix.
OAuth & security
The server implements a full OAuth 2.1 authorization server with PKCE, dynamic client registration, exact redirect-URI matching, short-lived access tokens and refresh rotation. Clients discover everything from the standard metadata endpoints — you don’t configure them by hand.
| Endpoint | Purpose |
|---|---|
/.well-known/oauth-protected-resource | Resource metadata (RFC 9728) |
/.well-known/oauth-authorization-server | AS metadata (RFC 8414) |
/oauth/register | Dynamic client registration (RFC 7591) |
/oauth/authorize | Authorization + consent (PKCE S256) |
/oauth/token | Token exchange & refresh |
Network tools stay SSRF-guarded, uploads are validated by content signature and stored outside the web root, and any data captured by webhooks is treated as untrusted. You can revoke a connected app at any time from your dashboard.
Authentication
All API requests require authentication using an API key. Include your API key in the request header.
X-API-Key: YOUR_API_KEY_HERE
Authorization: Bearer YOUR_API_KEY_HERE
⚡ Rate Limits
API rate limits depend on your subscription plan:
| Plan | Daily Limit | Rate Limit |
|---|---|---|
| Free | 100 requests/day | 10 requests/minute |
| Pro | 10,000 requests/day | 100 requests/minute |
| Enterprise | 10,000 requests/day | 3,000 requests/minute |
⚠️ Error Handling
The API uses standard HTTP status codes and returns JSON error responses.
{
"error": "Invalid API key",
"code": 401,
"message": "The provided API key is invalid or has been revoked"
}
| Code | Status | Description |
|---|---|---|
400 |
Bad Request | Invalid or missing parameters |
401 |
Unauthorized | Invalid or missing API key |
429 |
Too Many Requests | Rate limit exceeded |
500 |
Internal Server Error | Server error occurred |
Perform WHOIS lookup to get domain registration information including registrar, creation date, expiration date, nameservers, and real-time pricing with premium domain detection.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Required | Domain name to lookup (e.g., example.com) |
| include_pricing | boolean | Optional | Include real-time pricing data from registrar (default: true) |
| currency | string | Optional | Currency for pricing: USD, EUR, GBP, CNY, INR, CAD, AUD, JPY, MXN, BRL (default: USD) |
| mode | string | Optional | Query mode: full (WHOIS + Pricing, default), fast (Pricing only, ~3x faster), availability_only (Fastest, just availability + price) |
mode=fast for domain sales/search pages. It skips WHOIS lookup and returns results in ~500ms instead of ~2-3 seconds. Results are cached for faster subsequent requests.
curl -X GET "https://devsly.io/api/v1/network/whois?domain=google.com" \ -H "X-API-Key: YOUR_API_KEY_HERE"
const response = await fetch('https://devsly.io/api/v1/network/whois?domain=google.com', {
method: 'GET',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE'
}
});
const data = await response.json();
console.log(data);
import requests
response = requests.get(
'https://devsly.io/api/v1/network/whois',
params={'domain': 'google.com'},
headers={'X-API-Key': 'YOUR_API_KEY_HERE'}
)
data = response.json()
print(data)
| Field | Type | Description |
|---|---|---|
| available | boolean|null | Whether the domain is available for registration (null if unknown) |
| is_registered | boolean|null | Whether the domain is currently registered (null if unknown) |
| is_premium | boolean | Whether the domain is listed as a premium domain |
| is_reserved | boolean | Whether the domain is reserved by the registry |
| premium_type | string|null | Type of premium: "registry_premium", "aftermarket", "reserved", "high_price" (null if not premium) |
| availability_confidence | string | Confidence level of availability check: "high", "medium", or "low" |
| whois_server | string | WHOIS server used for the lookup |
| parsed_data | object | Parsed WHOIS information (registrar, dates, nameservers, status) |
| raw_data | string | Raw WHOIS response from the server |
| pricing | object|null | Real-time pricing data (if include_pricing=true) |
| pricing.available | boolean | Availability status from registrar |
| pricing.is_premium | boolean | Whether domain is priced as premium at registrar |
| pricing.registration_price | number|null | Registration price (null if not available) |
| pricing.renewal_price | number|null | Renewal price (null if not available) |
| pricing.currency | string | Currency code (USD, EUR, etc.) |
| meta | object | Metadata about the query (present in fast/availability_only modes) |
| meta.cached | boolean | Whether the result was served from cache |
| meta.cache_expires | integer | Unix timestamp when the cache entry expires |
| meta.query_time_ms | integer | Query execution time in milliseconds |
{
"success": true,
"domain": "google.com",
"available": false,
"is_registered": true,
"is_premium": false,
"is_reserved": false,
"premium_type": null,
"availability_confidence": "high",
"whois_server": "whois.verisign-grs.com",
"raw_data": "...",
"parsed_data": {
"domain_name": "google.com",
"registrar": "MarkMonitor Inc.",
"creation_date": "1997-09-15T04:00:00Z",
"expiration_date": "2028-09-14T04:00:00Z",
"updated_date": "2024-02-08T08:08:00Z",
"status": ["clientDeleteProhibited", "clientTransferProhibited", "clientUpdateProhibited"],
"name_servers": ["ns1.google.com", "ns2.google.com", "ns3.google.com", "ns4.google.com"],
"registrant": null
},
"execution_time_ms": 1250
}
{
"success": true,
"domain": "xyzrandomdomain123456.com",
"available": true,
"is_registered": false,
"is_premium": false,
"is_reserved": false,
"premium_type": null,
"availability_confidence": "high",
"whois_server": "whois.verisign-grs.com",
"raw_data": "No match for domain \"XYZRANDOMDOMAIN123456.COM\"...",
"parsed_data": {
"domain_name": null,
"registrar": null,
"creation_date": null,
"expiration_date": null,
"updated_date": null,
"status": [],
"name_servers": [],
"registrant": null
},
"pricing": {
"available": true,
"is_premium": false,
"registration_price": 10.88,
"renewal_price": 10.88,
"currency": "USD"
},
"execution_time_ms": 850
}
{
"success": true,
"domain": "vwx.dev",
"available": true,
"is_registered": false,
"is_premium": true,
"is_reserved": false,
"premium_type": "registry_premium",
"availability_confidence": "high",
"whois_server": "whois.nic.google",
"raw_data": "...",
"parsed_data": {
"domain_name": null,
"registrar": null,
"creation_date": null,
"expiration_date": null,
"updated_date": null,
"status": [],
"name_servers": [],
"registrant": null
},
"pricing": {
"available": true,
"is_premium": true,
"registration_price": 97.90,
"renewal_price": 97.90,
"currency": "USD"
},
"execution_time_ms": 1250
}
Check availability and pricing for multiple domains in a single request. Ideal for domain search pages, bulk availability checks, and domain portfolio management.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domains | array | Required | Array of domain names to check (max 100) |
| mode | string | Optional | Query mode: fast (default, recommended), full |
| currency | string | Optional | Currency for pricing: USD, EUR, GBP, etc. (default: USD) |
/api/v1/network/domains/check?domains=a.com,b.net,c.org
curl -X POST "https://devsly.io/api/v1/network/domains/check" \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"domains": ["example.com", "mybrand.net", "startup.io", "cool.dev"],
"mode": "fast",
"currency": "USD"
}'
const response = await fetch('https://devsly.io/api/v1/network/domains/check', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
domains: ['example.com', 'mybrand.net', 'startup.io', 'cool.dev'],
mode: 'fast',
currency: 'USD'
})
});
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://devsly.io/api/v1/network/domains/check',
json={
'domains': ['example.com', 'mybrand.net', 'startup.io', 'cool.dev'],
'mode': 'fast',
'currency': 'USD'
},
headers={'X-API-Key': 'YOUR_API_KEY_HERE'}
)
data = response.json()
print(data)
| Field | Type | Description |
|---|---|---|
| success | boolean | Whether the bulk request succeeded |
| query_time_ms | integer | Total execution time in milliseconds |
| total | integer | Total number of domains checked |
| cached_count | integer | Number of results served from cache |
| checked_count | integer | Number of domains checked via API |
| results | object | Results keyed by domain name |
| results.{domain}.available | boolean|null | Whether the domain is available |
| results.{domain}.is_premium | boolean | Whether it's a premium domain |
| results.{domain}.pricing | object | Pricing information (registration, renewal, currency) |
| results.{domain}.cached | boolean | Whether result was from cache |
{
"success": true,
"query_time_ms": 1250,
"total": 4,
"cached_count": 1,
"checked_count": 3,
"mode": "fast",
"currency": "USD",
"results": {
"example.com": {
"success": true,
"available": false,
"is_registered": true,
"is_premium": false,
"availability_confidence": "high",
"cached": true
},
"mybrand.net": {
"success": true,
"available": true,
"is_registered": false,
"is_premium": false,
"availability_confidence": "high",
"pricing": {
"registration": 11.99,
"renewal": 11.99,
"currency": "USD",
"is_premium": false
},
"cached": false
},
"startup.io": {
"success": true,
"available": true,
"is_registered": false,
"is_premium": true,
"availability_confidence": "high",
"pricing": {
"registration": 59.99,
"renewal": 59.99,
"currency": "USD",
"is_premium": true
},
"cached": false
},
"cool.dev": {
"success": true,
"available": true,
"is_registered": false,
"is_premium": false,
"availability_confidence": "high",
"pricing": {
"registration": 14.99,
"renewal": 14.99,
"currency": "USD",
"is_premium": false
},
"cached": false
}
}
}
Retrieve DNS records for a domain including A, AAAA, MX, NS, TXT, CNAME, and SOA records.
| Parameter | Type | Required | Description |
|---|---|---|---|
| domain | string | Required | Domain name to lookup |
| type | string | Optional | Record type: ALL, A, AAAA, MX, NS, TXT, CNAME, SOA (default: ALL) |
curl -X GET "https://devsly.io/api/v1/network/dns-lookup?domain=google.com&type=A" \ -H "X-API-Key: YOUR_API_KEY_HERE"
{
"success": true,
"domain": "google.com",
"records": {
"A": ["142.250.185.46"],
"AAAA": ["2a00:1450:4001:830::200e"],
"MX": [
{"priority": 10, "host": "smtp.google.com"}
],
"NS": ["ns1.google.com", "ns2.google.com"],
"TXT": ["v=spf1 include:_spf.google.com ~all"]
}
}
Get detailed information about an IP address including geolocation, ISP, and organization data.
| Parameter | Type | Required | Description |
|---|---|---|---|
| ip | string | Optional | IP address to lookup (defaults to requester's IP) |
curl -X GET "https://devsly.io/api/v1/network/ip-info?ip=8.8.8.8" \ -H "X-API-Key: YOUR_API_KEY_HERE"
{
"success": true,
"ip": "8.8.8.8",
"data": {
"country": "United States",
"country_code": "US",
"region": "California",
"city": "Mountain View",
"latitude": 37.386,
"longitude": -122.0838,
"isp": "Google LLC",
"organization": "Google Public DNS",
"timezone": "America/Los_Angeles"
}
}
Comprehensive HTTP response header analyzer with advanced security scoring. Analyzes 40+ header types including security headers (HSTS, CSP, X-Frame-Options, etc.), SSL/TLS certificates, cache optimization, CORS configuration, CDN/WAF detection, cookie security, and performance features. Returns detailed analysis with recommendations, severity ratings, and an overall security grade from A+ to F.
| Parameter | Type | Required | Description |
|---|---|---|---|
| url | string | Required | Full URL to analyze (https://example.com) |
curl -X GET "https://devsly.io/api/v1/network/http-headers?url=https://google.com" \ -H "X-API-Key: YOUR_API_KEY_HERE"
{
"success": true,
"url": "https://wapi.com.tr",
"effective_url": "https://wapi.com.tr/",
"http_code": 200,
"http_version": 3,
"response_time": 96,
"execution_time_ms": 96,
"timings": {
"dns": 0.21,
"connect": 5.59,
"ssl": 0,
"ttfb": 94.87,
"total": 95.7
},
"network": {
"primary_ip": "2606:4700:3033::ac43:b8a4",
"primary_port": 443,
"redirect_count": 0
},
"size": {
"header": 1202,
"download": 14260,
"total": -1
},
"headers": {
"date": "Sat, 04 Oct 2025 09:14:07 GMT",
"content-type": "text/html; charset=UTF-8",
"server": "cloudflare",
"x-content-type-options": "nosniff",
"x-frame-options": "SAMEORIGIN",
"x-xss-protection": "1; mode=block",
"referrer-policy": "strict-origin-when-cross-origin",
"content-security-policy": "default-src 'self' https: data: 'unsafe-inline' 'unsafe-eval';",
"content-encoding": "br",
"set-cookie": "PHPSESSID=098b9fcb6d3970b81fb3349e7c3bdbdc; HttpOnly; SameSite=Lax"
},
"analysis": {
"security": {
"score": 49,
"max_score": 150,
"percentage": 32.7,
"grade": "F",
"summary": {
"critical": 2,
"high": 0,
"medium": 4,
"low": 1
},
"checks": [
{
"name": "Strict-Transport-Security (HSTS)",
"category": "critical",
"max_score": 20,
"score": 0,
"present": false,
"passed": false,
"description": "Forces HTTPS connections and prevents downgrade attacks",
"recommendation": "Strict-Transport-Security: max-age=31536000; includeSubDomains; preload",
"risk": "Man-in-the-middle attacks, SSL stripping, session hijacking",
"details": ["✗ HSTS header not found"]
},
{
"name": "X-Frame-Options",
"category": "high",
"max_score": 10,
"score": 10,
"present": true,
"value": "SAMEORIGIN",
"passed": true,
"description": "Prevents clickjacking attacks",
"details": ["✓ Valid directive: SAMEORIGIN"]
}
]
},
"ssl_tls": {
"enabled": true,
"grade": "A",
"certificate": {
"subject": "CN = wapi.com.tr",
"issuer": "C = US, O = Google Trust Services, CN = WE1",
"valid_from": "Sep 6 11:15:36 2025 GMT",
"valid_to": "Dec 5 12:13:57 2025 GMT"
},
"ssl_version": "OpenSSL/3.0.7"
},
"cache": {
"cacheable": false,
"score": 5,
"max_score": 20,
"details": [
"• No caching allowed (no-store)",
"✓ must-revalidate present"
]
},
"performance": {
"compression": "br",
"http2": false,
"http3": true,
"score": 10,
"max_score": 20,
"details": [
"✓ Brotli compression enabled (best)",
"✓ HTTP/3 (QUIC) advertised via Alt-Svc"
]
},
"cdn_waf": {
"cdn": "Cloudflare",
"waf": "CLOUDFLARE",
"details": [
"✓ CDN detected: Cloudflare (via Server header)",
"✓ WAF detected: CLOUDFLARE"
]
},
"cookies": {
"score": 9,
"max_score": 15,
"cookies": [
{
"name": "PHPSESSID",
"secure": false,
"httponly": true,
"samesite": "Lax",
"score": 3,
"issues": ["Missing Secure flag"]
}
]
}
},
"overall_score": {
"score": 31.7,
"max_score": 97.5,
"percentage": 32.5,
"grade": "F"
}
}
Create a new webhook endpoint for testing HTTP requests. Returns a unique webhook URL that can receive and log HTTP requests in real-time.
No request body parameters required.
curl -X POST "https://devsly.io/api/v1/network/my-webhook-create" \ -H "X-API-Key: YOUR_API_KEY_HERE"
const response = await fetch('https://devsly.io/api/v1/network/my-webhook-create', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE'
}
});
const data = await response.json();
console.log(data);
import requests
response = requests.post(
'https://devsly.io/api/v1/network/my-webhook-create',
headers={'X-API-Key': 'YOUR_API_KEY_HERE'}
)
data = response.json()
print(data)
{
"success": true,
"webhook_id": "a1b2c3d4e5f6g7h8",
"webhook_url": "https://devsly.io/webhook/a1b2c3d4e5f6g7h8",
"created_at": "2025-10-05T12:00:00Z",
"message": "Webhook created successfully"
}
List all webhooks created by the currently authenticated user. Returns webhook details including ID, URL, creation date, and request count.
No request parameters required.
curl -X GET "https://devsly.io/api/v1/network/my-webhooks" \ -H "X-API-Key: YOUR_API_KEY_HERE"
const response = await fetch('https://devsly.io/api/v1/network/my-webhooks', {
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE'
}
});
const data = await response.json();
console.log(data);
{
"success": true,
"data": {
"total": 3,
"webhooks": [
{
"id": 1,
"webhook_id": "a1b2c3d4e5f6g7h8",
"webhook_url": "https://devsly.io/webhook/a1b2c3d4e5f6g7h8",
"request_count": 15,
"created_at": "2025-10-05T10:30:00Z"
},
{
"id": 2,
"webhook_id": "x9y8z7w6v5u4t3s2",
"webhook_url": "https://devsly.io/webhook/x9y8z7w6v5u4t3s2",
"request_count": 5,
"created_at": "2025-10-05T11:15:00Z"
}
]
}
}
Retrieve all HTTP requests received by a specific webhook. Returns detailed information including headers, body, method, IP address, and timestamp. Only returns requests for webhooks owned by the authenticated user.
| Parameter | Type | Required | Description |
|---|---|---|---|
| webhook_id | string | Required | Webhook ID to retrieve requests for |
curl -X GET "https://devsly.io/api/v1/network/my-webhook-requests?webhook_id=a1b2c3d4e5f6g7h8" \ -H "X-API-Key: YOUR_API_KEY_HERE"
const response = await fetch('https://devsly.io/api/v1/network/my-webhook-requests?webhook_id=a1b2c3d4e5f6g7h8', {
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE'
}
});
const data = await response.json();
console.log(data);
{
"success": true,
"webhook_id": "a1b2c3d4e5f6g7h8",
"data": {
"total": 2,
"requests": [
{
"id": 45,
"method": "POST",
"headers": {
"Content-Type": "application/json",
"User-Agent": "curl/7.68.0",
"Accept": "*/*"
},
"body": "{\"event\":\"user.created\",\"user_id\":12345}",
"query_params": null,
"ip_address": "192.168.1.100",
"user_agent": "curl/7.68.0",
"created_at": "2025-10-05T12:30:45Z"
},
{
"id": 44,
"method": "GET",
"headers": {
"User-Agent": "Mozilla/5.0",
"Accept": "text/html"
},
"body": null,
"query_params": "{\"test\":\"true\"}",
"ip_address": "192.168.1.101",
"user_agent": "Mozilla/5.0",
"created_at": "2025-10-05T12:25:30Z"
}
]
}
}
Delete a webhook and all its associated requests. Requires authentication and ownership of the webhook.
| Parameter | Type | Required | Description |
|---|---|---|---|
| webhook_id | string | Required | Webhook ID to delete |
curl -X POST "https://devsly.io/api/v1/network/my-webhook-delete" \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"webhook_id": "a1b2c3d4e5f6g7h8"}'
const response = await fetch('https://devsly.io/api/v1/network/my-webhook-delete', {
method: 'POST',
headers: {
'X-API-Key': 'YOUR_API_KEY_HERE',
'Content-Type': 'application/json'
},
body: JSON.stringify({
webhook_id: 'a1b2c3d4e5f6g7h8'
})
});
const data = await response.json();
console.log(data);
{
"success": true,
"message": "Webhook deleted successfully",
"webhook_id": "a1b2c3d4e5f6g7h8"
}
Start a new load test to evaluate your application's performance under concurrent user load. Simulate real-world traffic patterns with customizable parameters.
| Parameter | Type | Required | Description |
|---|---|---|---|
| targetUrl | string | Required | Target URL to test |
| httpMethod | string | Required | HTTP method: GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS |
| concurrentUsers | integer | Required | Number of concurrent users (1-10000) |
| testDuration | integer | Required | Test duration in seconds (10-3600) |
| rampUpTime | integer | Optional | Ramp-up time in seconds (default: 10) |
| requestsPerSecond | integer | Optional | Target requests per second (default: 0 = unlimited) |
| authType | string | Optional | Authentication type: none, basic, bearer, apikey (default: none) |
curl -X POST "https://devsly.io/api/v1/load-testing/start" \
-H "X-API-Key: YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{
"targetUrl": "https://api.example.com/endpoint",
"httpMethod": "GET",
"concurrentUsers": 100,
"testDuration": 60,
"rampUpTime": 10
}'
{
"success": true,
"test_id": "load_test_abc123xyz",
"status": "pending",
"message": "Load test has been queued",
"config": {
"target_url": "https://api.example.com/endpoint",
"concurrent_users": 100,
"test_duration": 60
}
}
Get real-time status of a running or completed load test including progress, metrics, and current statistics.
| Parameter | Type | Required | Description |
|---|---|---|---|
| test_id | string | Required | Test ID returned from start endpoint |
curl -X GET "https://devsly.io/api/v1/load-testing/status/load_test_abc123xyz" \ -H "X-API-Key: YOUR_API_KEY_HERE"
{
"success": true,
"test_id": "load_test_abc123xyz",
"status": "running",
"progress": 45,
"metrics": {
"total_requests": 4500,
"successful_requests": 4450,
"failed_requests": 50,
"avg_response_time": 125.5,
"throughput": 75.2,
"error_rate": 1.1
},
"started_at": "2025-10-04T12:00:00Z",
"estimated_completion": "2025-10-04T12:01:00Z"
}
Stop a running load test immediately and retrieve partial results.
| Parameter | Type | Required | Description |
|---|---|---|---|
| test_id | string | Required | Test ID of the running test |
curl -X POST "https://devsly.io/api/v1/load-testing/stop/load_test_abc123xyz" \ -H "X-API-Key: YOUR_API_KEY_HERE"
{
"success": true,
"test_id": "load_test_abc123xyz",
"status": "stopped",
"message": "Load test has been stopped",
"partial_results": {
"total_requests": 2500,
"successful_requests": 2480,
"failed_requests": 20,
"avg_response_time": 130.2
}
}
Get complete results of a finished load test including detailed metrics, response time distribution, and performance analysis.
| Parameter | Type | Required | Description |
|---|---|---|---|
| test_id | string | Required | Test ID of the completed test |
curl -X GET "https://devsly.io/api/v1/load-testing/results/load_test_abc123xyz" \ -H "X-API-Key: YOUR_API_KEY_HERE"
{
"success": true,
"test_id": "load_test_abc123xyz",
"status": "completed",
"results": {
"total_requests": 10000,
"successful_requests": 9950,
"failed_requests": 50,
"avg_response_time": 125.5,
"min_response_time": 45.2,
"max_response_time": 850.3,
"p50_response_time": 120.1,
"p75_response_time": 145.8,
"p90_response_time": 185.2,
"p95_response_time": 225.5,
"p99_response_time": 385.7,
"throughput": 166.7,
"error_rate": 0.5,
"total_bytes_sent": 2048000,
"total_bytes_received": 10240000
},
"started_at": "2025-10-04T12:00:00Z",
"completed_at": "2025-10-04T12:01:00Z"
}
🚧 More Endpoints Coming Soon
We're continuously adding new endpoints. Check back soon for:
- API Tester endpoint
- WebSocket Testing endpoint
- Developer Tools endpoints (Dockerfile Scan, etc.)