| name | send-request |
| description | Send HTTP requests with automatic configuration and authentication. Use when testing APIs, webhooks, or any HTTP endpoint. |
Send Request Skill
Sends HTTP requests with:
- Config-based: baseUrl, auth, headers (from
.pi-super-curl/config.json)
- Named endpoints: Quick access via
@endpoint-name
- Template variables:
{{uuid}}, {{uuidv7}}, {{env.VAR}}, {{timestamp}}
- JWT auth: Auto-generates tokens with configurable payload
- Env resolution:
$VAR syntax for secrets in config
Usage
Run the send-request.cjs script with request parameters:
SCRIPT=$(find -L ~/.pi/agent/skills -name "send-request.cjs" 2>/dev/null | head -1)
node "$SCRIPT" <METHOD> "<URL>" [options] 2>&1
Parameters:
METHOD: GET, POST, PUT, PATCH, DELETE
URL: Full URL or @endpoint-name from config
--body '{"key": "value"}': Request body (JSON, supports templates)
--header 'Name: Value': Custom header (repeatable)
--save: Save response to ~/Desktop/api-responses/
--stream: Stream SSE responses
Examples:
node "$SCRIPT" GET "https://httpbin.org/get" 2>&1
node "$SCRIPT" POST "@chat" --body '{"id": "{{uuidv7}}", "user": "{{env.USER_ID}}"}' 2>&1
node "$SCRIPT" GET "@health" 2>&1
node "$SCRIPT" GET "https://api.example.com/data" --header "X-Custom: value" 2>&1
Configuration
The script reads .pi-super-curl/config.json from the current directory (walking up) or home directory:
{
"baseUrl": "$API_BASE_URL",
"envFile": ".env",
"auth": {
"type": "jwt",
"secret": "$JWT_SECRET",
"algorithm": "HS256",
"expiresIn": 3600,
"payload": {
"user_id": "{{env.USER_ID}}",
"role": "authenticated"
}
},
"headers": {
"Content-Type": "application/json",
"X-Org-Id": "{{env.ORG_ID}}"
},
"endpoints": [
{
"name": "health",
"url": "/health",
"method": "GET"
},
{
"name": "chat",
"url": "/api/chat",
"method": "POST",
"defaultBody": {
"chat_id": "{{uuidv7}}",
"workspace_id": "{{env.WORKSPACE_ID}}"
}
}
]
}
Template Variables
| Template | Description |
|---|
{{uuid}}, {{uuidv4}} | Random UUID v4 |
{{uuidv7}} | Time-ordered UUID v7 |
{{timestamp}} | Unix timestamp (seconds) |
{{timestamp_ms}} | Unix timestamp (ms) |
{{date}} | ISO date string |
{{env.VAR}} or {{$VAR}} | Environment variables |
Environment Resolution
Two syntaxes for different contexts:
| Syntax | Use in | Example |
|---|
$VAR | baseUrl, auth.secret, auth.token | "baseUrl": "$API_URL" |
{{env.VAR}} | URLs, headers, body, JWT payload | "user_id": "{{env.USER_ID}}" |
Authentication Types
Bearer Token
{"type": "bearer", "token": "$MY_API_TOKEN"}
JWT (auto-generated)
{
"type": "jwt",
"secret": "$JWT_SECRET",
"algorithm": "HS256",
"expiresIn": 3600,
"payload": {
"user_id": "{{env.USER_ID}}",
"email": "{{env.EMAIL}}",
"role": "authenticated"
}
}
API Key
{"type": "api-key", "token": "$API_KEY", "header": "X-API-Key"}
Basic Auth
{"type": "basic", "username": "$USER", "password": "$PASS"}
Output
The script outputs:
[INFO] lines to stderr (method, URL, timing)
- Response body to stdout
- Raw response saved to
/tmp/generation-output.txt (for /scurl-log)
[INFO] Request completed successfully on success
[ERROR] on failure