Endpoint
Authentication
RequiresAgent-Key header with valid agent API key.
Request Headers
string
required
Agent API key for authentication
string
Idempotency key for request deduplication. Required for POST and PATCH requests. Header takes precedence over body field if both are provided.
Request Body
string
required
Target URL to forward the request to. Must match a registered service’s baseUrl and pass SSRF validation.Example:
https://api.github.com/repos/owner/repo/issuesstring
required
HTTP method for the request.Allowed values:
GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONSobject
default:"{}"
Request headers to forward to the target service. Do not include
Authorization or credential headers - these are injected automatically.Example: {"Content-Type": "application/json", "Accept": "application/json"}string
Request body as a JSON string. Nullable for methods that don’t require a body.Example:
"{\"title\": \"Bug report\", \"body\": \"Description\"}"string
required
Human-readable description of what this request is attempting to do. Used for risk assessment and audit logging.Constraints: 1-500 charactersExample:
"Create a new GitHub issue for bug report"string
Idempotency key for request deduplication. Required for POST and PATCH requests. Can be provided via header instead.Constraints: 1-255 charactersExample:
"issue-creation-20260303-001"Response
Success Response (200 OK)
Request was successfully forwarded and completed.number
HTTP status code from the target service
object
Response headers from the target service, including:
Content-Type: Preserved from target responseX-Proxy-Status: Always"forwarded"for successful requestsX-Idempotency-Status:"processed"if idempotency key was used
string
Response body from the target service (as received)
Risk-Blocked Response (428 Precondition Required)
Request was blocked due to high risk score and requires human approval.string
Error message:
"Request requires human approval"string
Unique identifier for the approval queue entry. Use this to poll status via
GET /status/:actionId.number
Risk assessment score (0-100) that triggered the block.
string
Human-readable explanation of why the request was flagged as risky.
string
URL to poll for approval status:
/status/:actionIdError Responses
Invalid or missing
Agent-Key header- Invalid request body schema
- Invalid URL format
- Missing required
idempotencyKeyfor POST/PATCH - Invalid HTTP method
- Target URL hostname doesn’t match service baseUrl (SSRF prevention)
- Target URL path doesn’t start with service baseUrl path
- Access to private IP ranges blocked
- Access to localhost blocked
No service found matching target URL, or agent doesn’t have access to the service
Request with this idempotency key is already being processed
Response size exceeds 10MB limit
Request blocked by risk assessment - see response body for action_id to track approval
- No credentials found for service
- Failed to decrypt credentials
- Unsupported authentication type
Failed to forward request to target service
Request timeout (30 second limit exceeded)
Examples
Request Flow
- Authentication - Validate
Agent-Keyheader - Schema Validation - Validate request body against schema
- Idempotency Check - Check for cached response (if key provided)
- Service Resolution - Find matching service and verify agent access
- SSRF Validation - Validate target URL against service baseUrl
- Risk Assessment - Evaluate request risk score
- Credential Injection - Inject service credentials based on auth type
- Forward Request - Send request to target service (30s timeout, 10MB limit)
- Cache Response - Store response for idempotency (if key provided)
- Return Response - Return target service response with proxy metadata
SSRF Protection
The gateway implements multiple layers of SSRF protection:- Hostname matching: Target hostname must match service baseUrl hostname
- Path prefix validation: Target path must start with service baseUrl path
- Private IP blocking: Blocks 127.x, 10.x, 172.16-31.x, 192.168.x, 169.254.x, ::1, fc00:, fe80:
- Localhost blocking: Blocks
localhosthostname - Protocol restriction: Only
http://andhttps://allowed
Idempotency Behavior
- Required for POST and PATCH methods
- Can be provided via
Idempotency-Keyheader oridempotencyKeybody field - Header takes precedence if both are provided
- Cached responses are returned immediately (status 200)
- Requests in-flight return 409 Conflict
- Cache is scoped to agent + key + request hash (method:url:body)