cURL Command Parser
network.parse_curl
Overview
Give us the cURL command someone pasted into a ticket and we return what it actually requests: the method, the URL, every header in order, the body, and whether it follows redirects or asks for compression. Credentials are replaced with a placeholder by default, and we tell you where each one was without keeping it. We read a published subset of cURL — one command, quoted arguments, and the common request options — and refuse everything else with a named error rather than guessing: shell operators, variables, command substitution, file reads such as -d @body.json, and options like --proxy. We never run the command and never send the request: no shell starts, no socket opens, no host is looked up, and -L is recorded rather than followed.
A cURL command is how people actually share a request, and reading one by eye is where mistakes happen: a quote in the wrong place, a header that is really two, a token nobody noticed was in the URL. Parsing it into fields makes the request reviewable, and refusing the parts a shell would interpret means a pasted string cannot do anything on the way through.
Reliability
Fully deterministic: the same command always parses the same way, and argument splitting follows POSIX quoting rules rather than a regular expression. Two known differences from a terminal, both stated in the output: repeated data options are joined with '&' as cURL does, and -G appends the data to the query string. An unquoted '?' is read literally with a warning, because a real shell would treat it as a filename pattern. Failures, none of which are worth retrying unchanged: CURL_SYNTAX_INVALID means the string is not one well-formed command — an unterminated quote, a missing option value, a second URL, or a grouped short option — so fix the command text. CURL_MULTIPLE_COMMANDS_FORBIDDEN means it chains requests with ';', '|', '&', a bare line break or --next, so send one request per call. CURL_SHELL_OPERATOR_FORBIDDEN means it relies on the shell: a variable, command substitution, redirect, subshell or filename pattern, so substitute the value yourself and quote the argument. CURL_FILE_REFERENCE_FORBIDDEN means it reads or writes a file, such as -d @body.json, -K, --cert or -o, so inline the data instead. CURL_OPTION_UNSUPPORTED means the option is outside the subset, such as --proxy, --resolve or an -X method we do not accept. CURL_HEADER_INVALID means a header has no colon, an illegal name, or a value carrying a line break that would split it into extra headers. CURL_REQUEST_INVALID and CURL_URL_UNSUPPORTED mean the URL is malformed or not http/https. CURL_TOKEN_LIMIT_EXCEEDED, CURL_BODY_TOO_LARGE and CURL_OUTPUT_TOO_LARGE mean the command passed a published limit: 256 arguments, a 1000000-byte body, or a 1048576-byte result.
Context footprint
The parsed request is about the size of the command itself; headers and body are returned once, never duplicated. A successful call costs 1 execution credit.
When to use it
When you have a cURL command as text and want the request it describes, or want to know that it uses something this subset refuses.
When you need the request performed, when the command is really a shell pipeline, or when it depends on files, proxies or client certificates.
Scope
Non-goals
- Never executes the command, opens a socket, or resolves a host
- Never runs a shell, expands a variable, or substitutes a command
- Never reads a file, cookie jar, netrc, certificate, or standard input
- Does not follow redirects; -L is recorded as followRedirects
- Does not claim full cURL or full Bash compatibility
Properties
Capabilities
Cost & billing
Flat rate per invocation
File handling
How we handle your data
What this means
This skill may receive sensitive content and may return submitted, transformed, extracted, or reformatted content.
Squillify guarantees
- Runs inside Squillify
- This skill runs inside Squillify.
- Payloads are not sent to an external service by this skill.
- Squillify does not permanently store submitted payloads.
- Telemetry records metadata only, not submitted content.
- Submitted payloads are not used for training.
- Submitted payloads are not reviewed by humans.
- This skill does not target sensitive data.
- The response may contain submitted or transformed content.
Your responsibility
Squillify does not determine whether submitted content is sensitive. Your application is responsible for deciding what data it is allowed to submit. Your application is responsible for securing the response.
Input schema
| Field | Type | Required | Description |
|---|---|---|---|
| curl | string | Yes | One cURL command of 1 to 65536 characters starting with the word curl. |
| redactSecrets | boolean | No | Whether credentials are replaced with <redacted>; omit it for true. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| request | object | Yes | Closed structured request the command describes: method, url, ordered headers, optional body, followRedirects and compressed. |
| warnings | array | Yes | Strings describing anything read differently from how it looks; empty when the command mapped cleanly. |
| redactions | array | Yes | One string per replaced credential naming the location, never the value, from 0 through 128 strings. |
| _meta | object | No | Always present on success, with tokenCount, restrictedGrammar, headerCount and redacted. |
API contract
POST /v1/executecurl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"network.parse_curl","input":{"curl":"curl -H \"Accept: application/json\" https://example.com/v1/ping"}}'import { Squillify } from "@squillify/sdk";
const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });
const { output } = await sq.execute("network.parse_curl", {"curl":"curl -X POST 'https://api.example.com/v1/orders' -H 'Authorization: Bearer sk-live-not-a-real-key' -H 'Content-Type: application/json' -d '{\"sku\":\"A-1\",\"qty\":2}'"});Errors
| Code | HTTP | Retryable | Description |
|---|---|---|---|
| VALIDATION_ERROR | 400 | No | The request payload failed schema validation. |
| UNAUTHORIZED | 401 | No | Missing or invalid API key. |
| SKILL_NOT_ACCESSIBLE | 403 | No | The API key is not granted access to this skill. |
| SKILL_NOT_AVAILABLE_FOR_PLAN | 403 | No | This skill is not included in your current plan. |
| PLAN_ELIGIBILITY_UNAVAILABLE | 503 | Yes | Plan eligibility could not be decided. Retry after backoff. |
| SKILL_NOT_FOUND | 404 | No | The requested skill or version does not exist. |
| TENANT_RATE_LIMITED | 429 | Yes | Request rate limit exceeded. Retry after backoff. |
| QUOTA_EXCEEDED | 429 | Yes | Plan quota exhausted. Retryable once the quota period resets. |
| EXECUTION_TIMEOUT | 504 | Yes | Execution exceeded the allowed time budget. |
| CURL_SYNTAX_INVALID | 400 | No | The request payload failed this skill's input validation. |
| CURL_MULTIPLE_COMMANDS_FORBIDDEN | 400 | No | The request payload failed this skill's input validation. |
| CURL_OPTION_UNSUPPORTED | 400 | No | The skill does not support the requested variant. |
| CURL_FILE_REFERENCE_FORBIDDEN | 400 | No | The request payload failed this skill's input validation. |
| CURL_SHELL_OPERATOR_FORBIDDEN | 400 | No | The request payload failed this skill's input validation. |
| CURL_TOKEN_LIMIT_EXCEEDED | 429 | No | A size, quota, rate, or time limit was exceeded. |
| CURL_HEADER_INVALID | 400 | No | The request payload failed this skill's input validation. |
| CURL_REQUEST_INVALID | 400 | No | The request payload failed this skill's input validation. |
| CURL_URL_UNSUPPORTED | 400 | No | The skill does not support the requested variant. |
| CURL_BODY_TOO_LARGE | 429 | No | A size, quota, rate, or time limit was exceeded. |
| CURL_OUTPUT_TOO_LARGE | 429 | No | A size, quota, rate, or time limit was exceeded. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 KiB |
Limitations
- Never executes the command, opens a socket, or resolves a host
- Never runs a shell, expands a variable, or substitutes a command
- Never reads a file, cookie jar, netrc, certificate, or standard input
- Does not follow redirects; -L is recorded as followRedirects
- Does not claim full cURL or full Bash compatibility
- Running the request — this skill has no network access at all
- Parsing arbitrary shell scripts or pipelines
- Recovering options outside the published subset, such as --proxy or --cert
How to call
POST /v1/execute (requires authentication)
{
"skillKey": "network.parse_curl",
"input": {
"curl": "curl -X POST 'https://api.example.com/v1/orders' -H 'Authorization: Bearer sk-live-not-a-real-key' -H 'Content-Type: application/json' -d '{\"sku\":\"A-1\",\"qty\":2}'"
}
}Examples
A POST with a bearer token, which is redacted by default
{
"curl": "curl -X POST 'https://api.example.com/v1/orders' -H 'Authorization: Bearer sk-live-not-a-real-key' -H 'Content-Type: application/json' -d '{\"sku\":\"A-1\",\"qty\":2}'"
}{
"redactions": [
"headers[0] Authorization"
],
"_meta": {
"restrictedGrammar": "curl-subset-v1",
"tokenCount": 10,
"redacted": true,
"headerCount": 2
},
"request": {
"method": "POST",
"url": "https://api.example.com/v1/orders",
"headers": [
{
"name": "Authorization",
"value": "<redacted>"
},
{
"name": "Content-Type",
"value": "application/json"
}
],
"body": "{\"sku\":\"A-1\",\"qty\":2}",
"followRedirects": false,
"compressed": false
},
"warnings": []
}A plain GET with a redirect flag and compression
{
"curl": "curl -L --compressed 'https://example.com/feed?page=2'"
}{
"redactions": [],
"_meta": {
"restrictedGrammar": "curl-subset-v1",
"tokenCount": 4,
"redacted": false,
"headerCount": 0
},
"request": {
"method": "GET",
"url": "https://example.com/feed?page=2",
"headers": [],
"followRedirects": true,
"compressed": true
},
"warnings": []
}Recommended use cases
- Turn a cURL command from a bug report into a request an agent can reason about
- Review what a pasted command would send before anyone runs it
- Move a request between tools by parsing it here and rendering it elsewhere
Avoid for
- Running the request — this skill has no network access at all
- Parsing arbitrary shell scripts or pipelines
- Recovering options outside the published subset, such as --proxy or --cert
Related skills
Composable with
Safety & privacy
- Runs without calling any external service.
- Your payloads are never stored permanently.
- Telemetry captures metadata only — never your payload contents.
- We never train models on your payloads.
- No human reviews your payloads.