{ "openapi": "3.1.0", "info": { "title": "OpenZeppelin Relayer API", "description": "OpenZeppelin Relayer API", "termsOfService": "https://www.openzeppelin.com/tos", "contact": { "name": "OpenZeppelin", "url": "https://www.openzeppelin.com" }, "license": { "name": "AGPL-3.0 license", "url": "https://github.com/OpenZeppelin/openzeppelin-relayer/blob/main/LICENSE" }, "version": "1.3.0" }, "paths": { "/api/v1/health": { "get": { "tags": [ "Health" ], "summary": "Health routes implementation", "description": "Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file\n\nHandles the `/health` endpoint.\n\nReturns an `HttpResponse` with a status of `200 OK` and a body of `\"OK\"`.\nThis endpoint is used for liveness probes in container orchestration platforms.", "operationId": "health", "responses": { "200": { "description": "Service is alive", "content": { "text/plain": { "schema": { "type": "string" }, "example": "OK" } } }, "500": { "description": "Internal server error", "content": { "text/plain": { "schema": { "type": "string" } } } } } } }, "/api/v1/networks": { "get": { "tags": [ "Networks" ], "summary": "Network routes implementation", "description": "Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file\n\nLists all networks with pagination support.", "operationId": "listNetworks", "parameters": [ { "name": "page", "in": "query", "description": "Page number for pagination (starts at 1)", "required": false, "schema": { "type": "integer", "minimum": 0 } }, { "name": "per_page", "in": "query", "description": "Number of items per page (default: 10)", "required": false, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Network list retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Vec_NetworkResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/networks/{network_id}": { "get": { "tags": [ "Networks" ], "summary": "Retrieves details of a specific network by ID.", "operationId": "getNetwork", "parameters": [ { "name": "network_id", "in": "path", "description": "Network ID (e.g., evm:sepolia, solana:mainnet)", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Network retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_NetworkResponse" } } } }, "400": { "description": "Bad Request - invalid network type", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Network with ID 'evm:sepolia' not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "patch": { "tags": [ "Networks" ], "summary": "Updates a network's configuration.\nCurrently supports updating RPC URLs only. Can be extended to support other fields.", "operationId": "updateNetwork", "parameters": [ { "name": "network_id", "in": "path", "description": "Network ID (e.g., evm:sepolia, solana:mainnet)", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateNetworkRequest" } } }, "required": true }, "responses": { "200": { "description": "Network updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_NetworkResponse" } } } }, "400": { "description": "Bad Request - invalid network type or request data", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Network with ID 'evm:sepolia' not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/notifications": { "get": { "tags": [ "Notifications" ], "summary": "Notification routes implementation", "description": "Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file\n\nLists all notifications with pagination support.", "operationId": "listNotifications", "parameters": [ { "name": "page", "in": "query", "description": "Page number for pagination (starts at 1)", "required": false, "schema": { "type": "integer", "minimum": 0 } }, { "name": "per_page", "in": "query", "description": "Number of items per page (default: 10)", "required": false, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Notification list retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Vec_NotificationResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "post": { "tags": [ "Notifications" ], "summary": "Creates a new notification.", "operationId": "createNotification", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationCreateRequest" } } }, "required": true }, "responses": { "201": { "description": "Notification created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_NotificationResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "409": { "description": "Notification with this ID already exists", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Notification with this ID already exists", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/notifications/{notification_id}": { "get": { "tags": [ "Notifications" ], "summary": "Retrieves details of a specific notification by ID.", "operationId": "getNotification", "parameters": [ { "name": "notification_id", "in": "path", "description": "Notification ID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Notification retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_NotificationResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Notification not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Notification not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "delete": { "tags": [ "Notifications" ], "summary": "Deletes a notification by ID.", "operationId": "deleteNotification", "parameters": [ { "name": "notification_id", "in": "path", "description": "Notification ID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Notification deleted successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": "Notification deleted successfully", "message": "Notification deleted successfully", "success": true } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Notification not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Notification not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "patch": { "tags": [ "Notifications" ], "summary": "Updates an existing notification.", "operationId": "updateNotification", "parameters": [ { "name": "notification_id", "in": "path", "description": "Notification ID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NotificationUpdateRequest" } } }, "required": true }, "responses": { "200": { "description": "Notification updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_NotificationResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Notification not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Notification not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/plugins": { "get": { "tags": [ "Plugins" ], "summary": "List plugins.", "operationId": "listPlugins", "parameters": [ { "name": "page", "in": "query", "description": "Page number for pagination (starts at 1)", "required": false, "schema": { "type": "integer", "minimum": 0 } }, { "name": "per_page", "in": "query", "description": "Number of items per page (default: 10)", "required": false, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Plugins listed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_PaginatedResult_PluginModel" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Plugin with ID plugin_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/plugins/{plugin_id}": { "get": { "tags": [ "Plugins" ], "summary": "Get plugin by ID", "operationId": "getPlugin", "parameters": [ { "name": "plugin_id", "in": "path", "description": "The unique identifier of the plugin", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Plugin retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_PluginModel" }, "example": { "data": { "allow_get_invocation": false, "config": { "featureFlag": true }, "emit_logs": false, "emit_traces": false, "forward_logs": false, "id": "my-plugin", "path": "plugins/my-plugin.ts", "raw_response": false, "timeout": 30 }, "error": null, "success": true } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Unauthorized", "success": false } } } }, "404": { "description": "Plugin not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Plugin with id my-plugin not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "patch": { "tags": [ "Plugins" ], "summary": "Update plugin configuration", "description": "Updates mutable plugin fields such as timeout, emit_logs, emit_traces,\nraw_response, allow_get_invocation, config, and forward_logs.\nThe plugin id and path cannot be changed after creation.\n\nAll fields are optional - only the provided fields will be updated.\nTo clear the `config` field, pass `\"config\": null`.", "operationId": "updatePlugin", "parameters": [ { "name": "plugin_id", "in": "path", "description": "The unique identifier of the plugin", "required": true, "schema": { "type": "string" } } ], "requestBody": { "description": "Plugin configuration update. All fields are optional.", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdatePluginRequest" }, "example": { "config": { "apiKey": "xyz123", "featureFlag": true }, "emit_logs": true, "forward_logs": true, "timeout": 60 } } }, "required": true }, "responses": { "200": { "description": "Plugin updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_PluginModel" }, "example": { "data": { "allow_get_invocation": false, "config": { "apiKey": "xyz123", "featureFlag": true }, "emit_logs": true, "emit_traces": false, "forward_logs": true, "id": "my-plugin", "path": "plugins/my-plugin.ts", "raw_response": false, "timeout": 60 }, "error": null, "success": true } } } }, "400": { "description": "Bad Request (invalid timeout or other validation error)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Timeout must be greater than 0", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Unauthorized", "success": false } } } }, "404": { "description": "Plugin not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Plugin with id my-plugin not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/plugins/{plugin_id}/call": { "get": { "tags": [ "Plugins" ], "summary": "Execute a plugin via GET (must be enabled per plugin)", "description": "This endpoint is disabled by default. To enable it for a given plugin, set\n`allow_get_invocation: true` in the plugin configuration.\n\nWhen invoked via GET:\n- `params` is an empty object (`{}`)\n- query parameters are passed to the plugin handler via `context.query`\n- wildcard route routing is supported the same way as POST (see `doc_call_plugin`)\n- Use the `route` query parameter or append the route to the URL path", "operationId": "callPluginGet", "parameters": [ { "name": "plugin_id", "in": "path", "description": "The unique identifier of the plugin", "required": true, "schema": { "type": "string" } }, { "name": "route", "in": "query", "description": "Optional route suffix for custom routing (e.g., '/verify'). Alternative to appending the route to the URL path.", "required": false, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Plugin call successful", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Value" } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Plugin with ID plugin_id not found", "success": false } } } }, "405": { "description": "Method Not Allowed (GET invocation disabled for this plugin)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "GET requests are not enabled for this plugin. Set 'allow_get_invocation: true' in plugin configuration to enable.", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "post": { "tags": [ "Plugins" ], "summary": "Execute a plugin with optional wildcard route routing", "description": "Logs and traces are only returned when the plugin is configured with `emit_logs` / `emit_traces`.\nPlugin-provided errors are normalized into a consistent payload (`code`, `details`) and a derived\nmessage so downstream clients receive a stable shape regardless of how the handler threw.\n\nThe endpoint supports wildcard route routing, allowing plugins to implement custom routing logic:\n- `/api/v1/plugins/{plugin_id}/call` - Default endpoint (route = \"\")\n- `/api/v1/plugins/{plugin_id}/call?route=/verify` - Custom route via query parameter\n- `/api/v1/plugins/{plugin_id}/call/verify` - Custom route via URL path (route = \"/verify\")\n\nThe route is passed to the plugin handler via the `context.route` field.\nYou can specify a custom route either by appending it to the URL path or by using the `route` query parameter.", "operationId": "callPlugin", "parameters": [ { "name": "plugin_id", "in": "path", "description": "The unique identifier of the plugin", "required": true, "schema": { "type": "string" } }, { "name": "route", "in": "query", "description": "Optional route suffix for custom routing (e.g., '/verify'). Alternative to appending the route to the URL path.", "required": false, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/PluginCallRequest" } } }, "required": true }, "responses": { "200": { "description": "Plugin call successful", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Value" }, "example": { "data": "done!", "error": null, "metadata": { "logs": [ { "level": "info", "message": "Plugin started..." } ], "traces": [ { "method": "sendTransaction", "relayerId": "sepolia-example", "requestId": "6c1f336f-3030-4f90-bd99-ada190a1235b" } ] }, "success": true } } } }, "400": { "description": "BadRequest (plugin-provided)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_PluginHandlerError" }, "example": { "data": { "code": "VALIDATION_FAILED", "details": { "field": "email" } }, "error": "Validation failed", "metadata": { "logs": [ { "level": "error", "message": "Validation failed for field: email" } ] }, "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Plugin with ID plugin_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "error": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/ready": { "get": { "tags": [ "Health" ], "summary": "Readiness endpoint that checks system resources, Redis, Queue, and plugins.", "description": "Returns 200 OK if the service is ready to accept traffic, or 503 Service Unavailable if not.\nThis endpoint is used for readiness probes in container orchestration platforms like\nAWS ECS or Kubernetes.\n\n## Health Check Components\n\n- **System**: File descriptor usage, CLOSE_WAIT socket count\n- **Redis**: Primary and reader pool connectivity\n- **Queue**: Queue's Redis connections (separate from app's Redis)\n- **Plugins**: Plugin pool health, circuit breaker state, and connection metrics (if enabled)\n\n## Status Levels\n\n- `healthy`: All components operational\n- `degraded`: Some components degraded but service can function (e.g., reader pool down)\n- `unhealthy`: Critical components failed, service unavailable\n\n## Plugin Connection Metrics\n\nWhen plugins are enabled, the following connection metrics are exposed:\n\n- `shared_socket_available_slots`: Number of additional concurrent plugin executions that can start\n- `shared_socket_active_connections`: Current number of active plugin execution connections\n- `shared_socket_registered_executions`: Number of plugin executions currently registered (awaiting response)\n- `connection_pool_available_slots`: Available connections to the pool server\n- `connection_pool_active_connections`: Active connections to the pool server\n\nThese metrics help diagnose connection pool exhaustion and plugin capacity issues.\n\n## Caching\n\nHealth check results are cached for 10 seconds to prevent excessive load from frequent\nhealth checks. Multiple requests within the TTL return the same cached response.", "operationId": "readiness", "responses": { "200": { "description": "Service is ready (healthy or degraded)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReadinessResponse" }, "example": { "components": { "plugins": { "avg_response_time_ms": 120, "circuit_state": "closed", "connection_pool_active_connections": 2, "connection_pool_available_slots": 8, "enabled": true, "memory": 52428800, "pool_completed": 1000, "pool_queued": 2, "recovering": false, "shared_socket_active_connections": 2, "shared_socket_available_slots": 48, "shared_socket_registered_executions": 2, "status": "healthy", "success_rate": 99.5, "uptime_ms": 3600000 }, "queue": { "status": "healthy" }, "redis": { "primary_pool": { "available": 8, "connected": true, "max_size": 16 }, "reader_pool": { "available": 8, "connected": true, "max_size": 16 }, "status": "healthy" }, "system": { "close_wait_count": 0, "fd_count": 42, "fd_limit": 1024, "fd_usage_percent": 4, "status": "healthy" } }, "ready": true, "status": "healthy", "timestamp": "2026-01-30T12:00:00Z" } } } }, "503": { "description": "Service is not ready (unhealthy)", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReadinessResponse" }, "example": { "components": { "plugins": { "avg_response_time_ms": 150, "circuit_state": "open", "connection_pool_active_connections": 4, "connection_pool_available_slots": 6, "enabled": true, "error": "Plugin pool health check failed", "memory": 52428800, "pool_completed": 1000, "pool_queued": 5, "recovering": true, "recovery_percent": 10, "shared_socket_active_connections": 5, "shared_socket_available_slots": 45, "shared_socket_registered_executions": 5, "status": "degraded", "success_rate": 95.5, "uptime_ms": 3600000 }, "queue": { "error": "Queue connection: Stats check timed out", "status": "unhealthy" }, "redis": { "error": "Redis primary pool: PING timed out", "primary_pool": { "available": 0, "connected": false, "error": "PING timed out", "max_size": 16 }, "reader_pool": { "available": 0, "connected": false, "error": "PING timed out", "max_size": 16 }, "status": "unhealthy" }, "system": { "close_wait_count": 0, "fd_count": 42, "fd_limit": 1024, "fd_usage_percent": 4, "status": "healthy" } }, "ready": false, "reason": "Redis primary pool: PING timed out", "status": "unhealthy", "timestamp": "2026-01-30T12:00:00Z" } } } } } } }, "/api/v1/relayers": { "get": { "tags": [ "Relayers" ], "summary": "Relayer routes implementation", "description": "Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file\n\nLists all relayers with pagination support.", "operationId": "listRelayers", "parameters": [ { "name": "page", "in": "query", "description": "Page number for pagination (starts at 1)", "required": false, "schema": { "type": "integer", "minimum": 0 } }, { "name": "per_page", "in": "query", "description": "Number of items per page (default: 10)", "required": false, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Relayer list retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Vec_RelayerResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "post": { "tags": [ "Relayers" ], "summary": "Creates a new relayer.", "operationId": "createRelayer", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CreateRelayerRequest" } } }, "required": true }, "responses": { "201": { "description": "Relayer created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_RelayerResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "409": { "description": "Relayer with this ID already exists", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with this ID already exists", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}": { "get": { "tags": [ "Relayers" ], "summary": "Retrieves details of a specific relayer by ID.", "operationId": "getRelayer", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer details retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_RelayerResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "delete": { "tags": [ "Relayers" ], "summary": "Deletes a relayer by ID.", "operationId": "deleteRelayer", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer deleted successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" } } } }, "400": { "description": "Bad Request - Cannot delete relayer with active transactions", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Cannot delete relayer 'relayer_id' because it has N transaction(s). Please wait for all transactions to complete or cancel them before deleting the relayer.", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "patch": { "tags": [ "Relayers" ], "summary": "Updates a relayer's information based on the provided update request.", "operationId": "updateRelayer", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UpdateRelayerRequest" } } }, "required": true }, "responses": { "200": { "description": "Relayer updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_RelayerResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/balance": { "get": { "tags": [ "Relayers" ], "summary": "Retrieves the balance of a specific relayer.", "operationId": "getRelayerBalance", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer balance retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_BalanceResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/rpc": { "post": { "tags": [ "Relayers" ], "summary": "Performs a JSON-RPC call using the specified relayer.", "operationId": "rpc", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "description": "JSON-RPC request with method and parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JsonRpcRequest_NetworkRpcRequest" }, "example": { "id": 1, "jsonrpc": "2.0", "method": "feeEstimate", "params": { "fee_token": "SOL", "network": "solana", "transaction": "base64_encoded_transaction" } } } }, "required": true }, "responses": { "200": { "description": "RPC method executed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/JsonRpcResponse_NetworkRpcResult" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/sign": { "post": { "tags": [ "Relayers" ], "summary": "Signs data using the specified relayer.", "operationId": "sign", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignDataRequest" } } }, "required": true }, "responses": { "200": { "description": "Relayer signed data successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SignDataResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/sign-transaction": { "post": { "tags": [ "Relayers" ], "summary": "Signs a transaction using the specified relayer (Stellar only).", "operationId": "signTransaction", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignTransactionRequest" } } }, "required": true }, "responses": { "200": { "description": "Transaction signed successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SignTransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/sign-typed-data": { "post": { "tags": [ "Relayers" ], "summary": "Signs typed data using the specified relayer.", "operationId": "signTypedData", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignTypedDataRequest" } } }, "required": true }, "responses": { "200": { "description": "Relayer signed typed data successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SignDataResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/status": { "get": { "tags": [ "Relayers" ], "summary": "Fetches the current status of a specific relayer.", "operationId": "getRelayerStatus", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer status retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_RelayerStatus" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions": { "post": { "tags": [ "Relayers" ], "summary": "Sends a transaction through the specified relayer.", "operationId": "sendTransaction", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NetworkTransactionRequest" } } }, "required": true }, "responses": { "200": { "description": "Relayer transactions sent successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_TransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions/": { "get": { "tags": [ "Relayers" ], "summary": "Lists all transactions for a specific relayer with pagination.", "operationId": "listTransactions", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } }, { "name": "page", "in": "query", "description": "Page number for pagination (starts at 1)", "required": false, "schema": { "type": "integer", "minimum": 0 } }, { "name": "per_page", "in": "query", "description": "Number of items per page (default: 10)", "required": false, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Relayer transactions retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Vec_TransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions/by-nonce/{nonce}": { "get": { "tags": [ "Relayers" ], "summary": "Retrieves a transaction by its nonce value.", "operationId": "getTransactionByNonce", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } }, { "name": "nonce", "in": "path", "description": "The nonce of the transaction", "required": true, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Relayer transaction retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_TransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions/pending": { "delete": { "tags": [ "Relayers" ], "summary": "Deletes all pending transactions for a specific relayer.", "operationId": "deletePendingTransactions", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer pending transactions successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_DeletePendingTransactionsResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions/sponsored/build": { "post": { "tags": [ "Relayers" ], "summary": "Prepares a sponsored (gasless) transaction with fee payments.", "description": "This endpoint builds a transaction where the relayer will pay the network fees on behalf of the user.\nThe user pays fees in a token of their choice (e.g., USDC) instead of the native network currency.\n\nThe endpoint accepts either a pre-built transaction XDR or a set of operations to build a transaction from.\nIt returns a prepared transaction that includes:\n- The transaction XDR (base64 encoded) ready for signing\n- The fee amount in both the fee token and native currency (stroops for Stellar)\n- The fee token identifier\n- The transaction validity timestamp\n\nAfter receiving the prepared transaction, the user must sign it and submit it through the standard\ntransaction submission endpoint. For Stellar, the transaction will be wrapped in a fee-bump transaction\nwhere the relayer pays the network fees.", "operationId": "buildSponsoredTransaction", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SponsoredTransactionBuildRequest" } } }, "required": true }, "responses": { "200": { "description": "Sponsored transaction built successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SponsoredTransactionBuildResponse" }, "example": { "data": { "fee_in_stroops": "100000", "fee_in_token": "1.5", "fee_token": "USDC:GA5ZSEJYB37JRC5AVCIA5MOP4RHTM335X2KGX3IHOJAPP5RE34K4KZVN", "transaction": "AAAAAgAAAAD...", "valid_until": "2024-01-01T00:00:00Z" }, "message": "Sponsored transaction built successfully", "success": true } } } }, "400": { "description": "Bad Request - Invalid request parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions/sponsored/quote": { "post": { "tags": [ "Relayers" ], "summary": "Estimates fees for a sponsored (gasless) transaction.", "description": "This endpoint provides fee estimation for transactions where the relayer will pay the network fees\non behalf of the user. The user pays fees in a token of their choice (e.g., USDC) instead of the\nnative network currency (e.g., XLM for Stellar).\n\nThe endpoint accepts either a pre-built transaction XDR or a set of operations to build a transaction from.\nIt returns the estimated fee amount in the specified fee token and the conversion rate from the native currency.", "operationId": "quoteSponsoredTransaction", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SponsoredTransactionQuoteRequest" } } }, "required": true }, "responses": { "200": { "description": "Fee estimate retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SponsoredTransactionQuoteResponse" }, "example": { "data": { "conversion_rate": "0.15", "estimated_fee": "1.5" }, "message": "Fee estimate retrieved successfully", "success": true } } } }, "400": { "description": "Bad Request - Invalid request parameters", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Relayer with ID relayer_id not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/relayers/{relayer_id}/transactions/{transaction_id}": { "get": { "tags": [ "Relayers" ], "summary": "Retrieves a specific transaction by its ID.", "operationId": "getTransactionById", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } }, { "name": "transaction_id", "in": "path", "description": "The unique identifier of the transaction", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer transaction retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_TransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Not Found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "put": { "tags": [ "Relayers" ], "summary": "Replaces a specific transaction with a new one.", "operationId": "replaceTransaction", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } }, { "name": "transaction_id", "in": "path", "description": "The unique identifier of the transaction", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NetworkTransactionRequest" } } }, "required": true }, "responses": { "200": { "description": "Relayer transaction replaced successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_TransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "delete": { "tags": [ "Relayers" ], "summary": "Cancels a specific transaction by its ID.", "operationId": "cancelTransaction", "parameters": [ { "name": "relayer_id", "in": "path", "description": "The unique identifier of the relayer", "required": true, "schema": { "type": "string" } }, { "name": "transaction_id", "in": "path", "description": "The unique identifier of the transaction", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Relayer transaction canceled successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_TransactionResponse" } } } }, "400": { "description": "BadRequest", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Not Found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Not found", "success": false } } } }, "429": { "description": "Too Many Requests", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Too Many Requests", "success": false } } } }, "500": { "description": "Internal server error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/signers": { "get": { "tags": [ "Signers" ], "summary": "Signer routes implementation", "description": "Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file\n\nLists all signers with pagination support.", "operationId": "listSigners", "parameters": [ { "name": "page", "in": "query", "description": "Page number for pagination (starts at 1)", "required": false, "schema": { "type": "integer", "minimum": 0 } }, { "name": "per_page", "in": "query", "description": "Number of items per page (default: 10)", "required": false, "schema": { "type": "integer", "minimum": 0 } } ], "responses": { "200": { "description": "Signer list retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_Vec_SignerResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "post": { "tags": [ "Signers" ], "summary": "Creates a new signer.", "operationId": "createSigner", "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignerCreateRequest" } } }, "required": true }, "responses": { "201": { "description": "Signer created successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SignerResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "409": { "description": "Signer with this ID already exists", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Signer with this ID already exists", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/api/v1/signers/{signer_id}": { "get": { "tags": [ "Signers" ], "summary": "Retrieves details of a specific signer by ID.", "operationId": "getSigner", "parameters": [ { "name": "signer_id", "in": "path", "description": "Signer ID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Signer retrieved successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SignerResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Signer not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Signer not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "delete": { "tags": [ "Signers" ], "summary": "Deletes a signer by ID.", "operationId": "deleteSigner", "parameters": [ { "name": "signer_id", "in": "path", "description": "Signer ID", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Signer deleted successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": "Signer deleted successfully", "message": "Signer deleted successfully", "success": true } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Signer not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Signer not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] }, "patch": { "tags": [ "Signers" ], "summary": "Updates an existing signer.", "operationId": "updateSigner", "parameters": [ { "name": "signer_id", "in": "path", "description": "Signer ID", "required": true, "schema": { "type": "string" } } ], "requestBody": { "content": { "application/json": { "schema": { "$ref": "#/components/schemas/SignerUpdateRequest" } } }, "required": true }, "responses": { "200": { "description": "Signer updated successfully", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_SignerResponse" } } } }, "400": { "description": "Bad Request", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Bad Request", "success": false } } } }, "401": { "description": "Unauthorized", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Unauthorized", "success": false } } } }, "404": { "description": "Signer not found", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Signer not found", "success": false } } } }, "500": { "description": "Internal Server Error", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ApiResponse_String" }, "example": { "data": null, "message": "Internal Server Error", "success": false } } } } }, "security": [ { "bearer_auth": [] } ] } }, "/debug/metrics/scrape": { "get": { "tags": [ "Metrics" ], "summary": "Triggers an update of system metrics and returns the result in plain text format.", "description": "# Returns\n\nAn `HttpResponse` containing the updated metrics in plain text, or an error message if the\nupdate fails.", "operationId": "scrape_metrics", "responses": { "200": { "description": "Complete metrics in Prometheus exposition format", "content": { "text/plain": { "schema": { "type": "string" } } } }, "401": { "description": "Unauthorized" } } } }, "/metrics": { "get": { "tags": [ "Metrics" ], "summary": "Metrics routes implementation", "description": "Note: OpenAPI documentation for these endpoints can be found in the `openapi.rs` file\nReturns a list of all available metric names in JSON format.\n\n# Returns\n\nAn `HttpResponse` containing a JSON array of metric names.", "operationId": "list_metrics", "responses": { "200": { "description": "Metric names list", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } } }, "401": { "description": "Unauthorized" } } } }, "/metrics/{metric_name}": { "get": { "tags": [ "Metrics" ], "summary": "Returns the details of a specific metric in plain text format.", "description": "# Parameters\n\n- `path`: The name of the metric to retrieve details for.\n\n# Returns\n\nAn `HttpResponse` containing the metric details in plain text, or a 404 error if the metric is\nnot found.", "operationId": "metric_detail", "parameters": [ { "name": "metric_name", "in": "path", "description": "Name of the metric to retrieve, e.g. utopia_transactions_total", "required": true, "schema": { "type": "string" } } ], "responses": { "200": { "description": "Metric details in Prometheus text format", "content": { "text/plain": { "schema": { "type": "string" } } } }, "401": { "description": "Unauthorized - missing or invalid API key" }, "403": { "description": "Forbidden - insufficient permissions to access this metric" }, "404": { "description": "Metric not found" }, "429": { "description": "Too many requests - rate limit for metrics access exceeded" } }, "security": [ { "bearer_auth": [ "metrics:read" ] } ] } } }, "components": { "schemas": { "ApiResponse_BalanceResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "required": [ "balance", "unit" ], "properties": { "balance": { "type": "integer", "minimum": 0 }, "unit": { "type": "string", "example": "wei" } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_DeletePendingTransactionsResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "description": "Response for delete pending transactions operation", "required": [ "queued_for_cancellation_transaction_ids", "failed_to_queue_transaction_ids", "total_processed" ], "properties": { "failed_to_queue_transaction_ids": { "type": "array", "items": { "type": "string" } }, "queued_for_cancellation_transaction_ids": { "type": "array", "items": { "type": "string" } }, "total_processed": { "type": "integer", "format": "int32", "minimum": 0 } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_NetworkResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "description": "Network response model for API endpoints.\n\nThis flattens the internal NetworkRepoModel structure for API responses,\nmaking network-type-specific fields available at the top level.", "required": [ "id", "name", "network_type" ], "properties": { "average_blocktime_ms": { "type": "integer", "format": "int64", "description": "Estimated average time between blocks in milliseconds", "minimum": 0 }, "chain_id": { "type": "integer", "format": "int64", "description": "EVM-specific: Chain ID", "minimum": 0 }, "explorer_urls": { "type": "array", "items": { "type": "string" }, "description": "List of Explorer endpoint URLs" }, "features": { "type": "array", "items": { "type": "string" }, "description": "EVM-specific: Network features (e.g., \"eip1559\")" }, "horizon_url": { "type": "string", "description": "Stellar-specific: Horizon URL" }, "id": { "type": "string", "description": "Unique identifier composed of network_type and name, e.g., \"evm:mainnet\"" }, "is_testnet": { "type": "boolean", "description": "Flag indicating if the network is a testnet" }, "name": { "type": "string", "description": "Name of the network (e.g., \"mainnet\", \"sepolia\")" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType", "description": "Type of the network (EVM, Solana, Stellar)" }, "passphrase": { "type": "string", "description": "Stellar-specific: Network passphrase" }, "required_confirmations": { "type": "integer", "format": "int64", "description": "EVM-specific: Required confirmations", "minimum": 0 }, "rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/RpcConfig" }, "description": "List of RPC endpoint configurations" }, "symbol": { "type": "string", "description": "EVM-specific: Native token symbol" }, "tags": { "type": "array", "items": { "type": "string" }, "description": "List of arbitrary tags for categorizing or filtering networks" } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_NotificationResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "description": "Response structure for notification API endpoints", "required": [ "id", "type", "url", "has_signing_key" ], "properties": { "has_signing_key": { "type": "boolean", "description": "Signing key is hidden in responses for security" }, "id": { "type": "string" }, "type": { "$ref": "#/components/schemas/NotificationType" }, "url": { "type": "string" } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_PaginatedResult_PluginModel": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "required": [ "items", "total", "page", "per_page" ], "properties": { "items": { "type": "array", "items": { "type": "object", "required": [ "id", "path", "timeout" ], "properties": { "allow_get_invocation": { "type": "boolean", "description": "Whether to allow GET requests to invoke plugin logic" }, "config": { "type": [ "object", "null" ], "description": "User-defined configuration accessible to the plugin (must be a JSON object)", "additionalProperties": {}, "propertyNames": { "type": "string" } }, "emit_logs": { "type": "boolean", "description": "Whether to include logs in the HTTP response" }, "emit_traces": { "type": "boolean", "description": "Whether to include traces in the HTTP response" }, "forward_logs": { "type": "boolean", "description": "Whether to forward plugin logs into the relayer's tracing output" }, "id": { "type": "string", "description": "Plugin ID" }, "path": { "type": "string", "description": "Plugin path" }, "raw_response": { "type": "boolean", "description": "Whether to return raw plugin response without ApiResponse wrapper" }, "timeout": { "type": "integer", "format": "int64", "description": "Plugin timeout", "minimum": 0 } } } }, "page": { "type": "integer", "format": "int32", "minimum": 0 }, "per_page": { "type": "integer", "format": "int32", "minimum": 0 }, "total": { "type": "integer", "format": "int64", "minimum": 0 } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_PluginHandlerError": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "properties": { "code": { "type": [ "string", "null" ] }, "details": {} } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_PluginModel": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "required": [ "id", "path", "timeout" ], "properties": { "allow_get_invocation": { "type": "boolean", "description": "Whether to allow GET requests to invoke plugin logic" }, "config": { "type": [ "object", "null" ], "description": "User-defined configuration accessible to the plugin (must be a JSON object)", "additionalProperties": {}, "propertyNames": { "type": "string" } }, "emit_logs": { "type": "boolean", "description": "Whether to include logs in the HTTP response" }, "emit_traces": { "type": "boolean", "description": "Whether to include traces in the HTTP response" }, "forward_logs": { "type": "boolean", "description": "Whether to forward plugin logs into the relayer's tracing output" }, "id": { "type": "string", "description": "Plugin ID" }, "path": { "type": "string", "description": "Plugin path" }, "raw_response": { "type": "boolean", "description": "Whether to return raw plugin response without ApiResponse wrapper" }, "timeout": { "type": "integer", "format": "int64", "description": "Plugin timeout", "minimum": 0 } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_RelayerResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "description": "Relayer response model for API endpoints", "required": [ "id", "name", "network", "network_type", "paused", "signer_id" ], "properties": { "address": { "type": "string" }, "custom_rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/MaskedRpcConfig" }, "description": "Custom RPC URLs with sensitive path/query parameters masked for security.\nThe domain is visible to identify providers (e.g., Alchemy, Infura) but\nAPI keys embedded in paths are hidden." }, "disabled_reason": { "$ref": "#/components/schemas/DisabledReason" }, "id": { "type": "string" }, "name": { "type": "string" }, "network": { "type": "string" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType" }, "notification_id": { "type": "string" }, "paused": { "type": "boolean" }, "policies": { "$ref": "#/components/schemas/RelayerNetworkPolicyResponse", "description": "Policies without redundant network_type tag - network type is available at top level\nOnly included if user explicitly provided policies (not shown for empty/default policies)" }, "signer_id": { "type": "string" }, "system_disabled": { "type": "boolean" } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_RelayerStatus": { "type": "object", "required": [ "success" ], "properties": { "data": { "oneOf": [ { "type": "object", "required": [ "balance", "pending_transactions_count", "system_disabled", "paused", "nonce", "network_type" ], "properties": { "balance": { "type": "string" }, "last_confirmed_transaction_timestamp": { "type": [ "string", "null" ] }, "network_type": { "type": "string", "enum": [ "evm" ] }, "nonce": { "type": "string" }, "paused": { "type": "boolean" }, "pending_transactions_count": { "type": "integer", "format": "int64", "minimum": 0 }, "system_disabled": { "type": "boolean" } } }, { "type": "object", "required": [ "balance", "pending_transactions_count", "system_disabled", "paused", "sequence_number", "network_type" ], "properties": { "balance": { "type": "string" }, "last_confirmed_transaction_timestamp": { "type": [ "string", "null" ] }, "network_type": { "type": "string", "enum": [ "stellar" ] }, "paused": { "type": "boolean" }, "pending_transactions_count": { "type": "integer", "format": "int64", "minimum": 0 }, "sequence_number": { "type": "string" }, "system_disabled": { "type": "boolean" } } }, { "type": "object", "required": [ "balance", "pending_transactions_count", "system_disabled", "paused", "network_type" ], "properties": { "balance": { "type": "string" }, "last_confirmed_transaction_timestamp": { "type": [ "string", "null" ] }, "network_type": { "type": "string", "enum": [ "solana" ] }, "paused": { "type": "boolean" }, "pending_transactions_count": { "type": "integer", "format": "int64", "minimum": 0 }, "system_disabled": { "type": "boolean" } } } ], "description": "Relayer status with runtime information" }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_SignDataResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "oneOf": [ { "$ref": "#/components/schemas/SignDataResponseEvm" }, { "$ref": "#/components/schemas/SignDataResponseSolana" } ] }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_SignTransactionResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "oneOf": [ { "$ref": "#/components/schemas/SignTransactionResponseStellar" }, { "type": "array", "items": { "type": "integer", "format": "int32", "minimum": 0 } }, { "$ref": "#/components/schemas/SignTransactionResponseSolana" } ] }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_SignerResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "object", "required": [ "id", "type", "config" ], "properties": { "config": { "$ref": "#/components/schemas/SignerConfigResponse", "description": "Non-secret configuration details" }, "id": { "type": "string", "description": "The unique identifier of the signer" }, "type": { "$ref": "#/components/schemas/SignerType", "description": "The type of signer (local, aws_kms, google_cloud_kms, vault, etc.)" } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_SponsoredTransactionBuildResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "oneOf": [ { "$ref": "#/components/schemas/SolanaPrepareTransactionResult", "description": "Solana-specific prepare transaction result" }, { "$ref": "#/components/schemas/StellarPrepareTransactionResult", "description": "Stellar-specific prepare transaction result (classic and Soroban)\nFor Soroban: includes optional user_auth_entry, expiration_ledger" } ], "description": "Network-agnostic prepare transaction response for gasless transactions.\nContains network-specific prepare transaction results." }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_SponsoredTransactionQuoteResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "oneOf": [ { "$ref": "#/components/schemas/SolanaFeeEstimateResult", "description": "Solana-specific fee estimate result" }, { "$ref": "#/components/schemas/StellarFeeEstimateResult", "description": "Stellar-specific fee estimate result (classic and Soroban)" } ], "description": "Network-agnostic fee estimate response for gasless transactions.\nContains network-specific fee estimate results." }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_String": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "string" }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_TransactionResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "oneOf": [ { "$ref": "#/components/schemas/EvmTransactionResponse" }, { "$ref": "#/components/schemas/SolanaTransactionResponse" }, { "$ref": "#/components/schemas/StellarTransactionResponse" } ] }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_Value": { "type": "object", "required": [ "success" ], "properties": { "data": {}, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_Vec_NetworkResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "array", "items": { "type": "object", "description": "Network response model for API endpoints.\n\nThis flattens the internal NetworkRepoModel structure for API responses,\nmaking network-type-specific fields available at the top level.", "required": [ "id", "name", "network_type" ], "properties": { "average_blocktime_ms": { "type": "integer", "format": "int64", "description": "Estimated average time between blocks in milliseconds", "minimum": 0 }, "chain_id": { "type": "integer", "format": "int64", "description": "EVM-specific: Chain ID", "minimum": 0 }, "explorer_urls": { "type": "array", "items": { "type": "string" }, "description": "List of Explorer endpoint URLs" }, "features": { "type": "array", "items": { "type": "string" }, "description": "EVM-specific: Network features (e.g., \"eip1559\")" }, "horizon_url": { "type": "string", "description": "Stellar-specific: Horizon URL" }, "id": { "type": "string", "description": "Unique identifier composed of network_type and name, e.g., \"evm:mainnet\"" }, "is_testnet": { "type": "boolean", "description": "Flag indicating if the network is a testnet" }, "name": { "type": "string", "description": "Name of the network (e.g., \"mainnet\", \"sepolia\")" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType", "description": "Type of the network (EVM, Solana, Stellar)" }, "passphrase": { "type": "string", "description": "Stellar-specific: Network passphrase" }, "required_confirmations": { "type": "integer", "format": "int64", "description": "EVM-specific: Required confirmations", "minimum": 0 }, "rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/RpcConfig" }, "description": "List of RPC endpoint configurations" }, "symbol": { "type": "string", "description": "EVM-specific: Native token symbol" }, "tags": { "type": "array", "items": { "type": "string" }, "description": "List of arbitrary tags for categorizing or filtering networks" } } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_Vec_NotificationResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "array", "items": { "type": "object", "description": "Response structure for notification API endpoints", "required": [ "id", "type", "url", "has_signing_key" ], "properties": { "has_signing_key": { "type": "boolean", "description": "Signing key is hidden in responses for security" }, "id": { "type": "string" }, "type": { "$ref": "#/components/schemas/NotificationType" }, "url": { "type": "string" } } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_Vec_RelayerResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "array", "items": { "type": "object", "description": "Relayer response model for API endpoints", "required": [ "id", "name", "network", "network_type", "paused", "signer_id" ], "properties": { "address": { "type": "string" }, "custom_rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/MaskedRpcConfig" }, "description": "Custom RPC URLs with sensitive path/query parameters masked for security.\nThe domain is visible to identify providers (e.g., Alchemy, Infura) but\nAPI keys embedded in paths are hidden." }, "disabled_reason": { "$ref": "#/components/schemas/DisabledReason" }, "id": { "type": "string" }, "name": { "type": "string" }, "network": { "type": "string" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType" }, "notification_id": { "type": "string" }, "paused": { "type": "boolean" }, "policies": { "$ref": "#/components/schemas/RelayerNetworkPolicyResponse", "description": "Policies without redundant network_type tag - network type is available at top level\nOnly included if user explicitly provided policies (not shown for empty/default policies)" }, "signer_id": { "type": "string" }, "system_disabled": { "type": "boolean" } } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_Vec_SignerResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "array", "items": { "type": "object", "required": [ "id", "type", "config" ], "properties": { "config": { "$ref": "#/components/schemas/SignerConfigResponse", "description": "Non-secret configuration details" }, "id": { "type": "string", "description": "The unique identifier of the signer" }, "type": { "$ref": "#/components/schemas/SignerType", "description": "The type of signer (local, aws_kms, google_cloud_kms, vault, etc.)" } } } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "ApiResponse_Vec_TransactionResponse": { "type": "object", "required": [ "success" ], "properties": { "data": { "type": "array", "items": { "oneOf": [ { "$ref": "#/components/schemas/EvmTransactionResponse" }, { "$ref": "#/components/schemas/SolanaTransactionResponse" }, { "$ref": "#/components/schemas/StellarTransactionResponse" } ] } }, "error": { "type": "string" }, "metadata": { "$ref": "#/components/schemas/PluginMetadata" }, "pagination": { "$ref": "#/components/schemas/PaginationMeta" }, "success": { "type": "boolean" } } }, "AssetSpec": { "oneOf": [ { "type": "object", "required": [ "type" ], "properties": { "type": { "type": "string", "enum": [ "native" ] } } }, { "type": "object", "required": [ "code", "issuer", "type" ], "properties": { "code": { "type": "string" }, "issuer": { "type": "string" }, "type": { "type": "string", "enum": [ "credit4" ] } } }, { "type": "object", "required": [ "code", "issuer", "type" ], "properties": { "code": { "type": "string" }, "issuer": { "type": "string" }, "type": { "type": "string", "enum": [ "credit12" ] } } } ] }, "AuthSpec": { "oneOf": [ { "type": "object", "description": "No authorization required", "required": [ "type" ], "properties": { "type": { "type": "string", "enum": [ "none" ] } } }, { "type": "object", "description": "Use the transaction source account for authorization", "required": [ "type" ], "properties": { "type": { "type": "string", "enum": [ "source_account" ] } } }, { "type": "object", "description": "Use specific addresses for authorization", "required": [ "signers", "type" ], "properties": { "signers": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string", "enum": [ "addresses" ] } } }, { "type": "object", "description": "Advanced format - provide complete XDR auth entries as base64-encoded strings", "required": [ "entries", "type" ], "properties": { "entries": { "type": "array", "items": { "type": "string" } }, "type": { "type": "string", "enum": [ "xdr" ] } } } ], "description": "Authorization specification for Soroban operations" }, "AwsKmsSignerRequestConfig": { "type": "object", "description": "AWS KMS signer configuration for API requests", "required": [ "region", "key_id" ], "properties": { "key_id": { "type": "string" }, "region": { "type": "string" } }, "additionalProperties": false }, "BalanceResponse": { "type": "object", "required": [ "balance", "unit" ], "properties": { "balance": { "type": "integer", "minimum": 0 }, "unit": { "type": "string", "example": "wei" } } }, "CdpSignerRequestConfig": { "type": "object", "description": "CDP signer configuration for API requests", "required": [ "api_key_id", "api_key_secret", "wallet_secret", "account_address" ], "properties": { "account_address": { "type": "string" }, "api_key_id": { "type": "string" }, "api_key_secret": { "type": "string" }, "wallet_secret": { "type": "string" } }, "additionalProperties": false }, "ComponentStatus": { "type": "string", "description": "Component health status levels.", "enum": [ "healthy", "degraded", "unhealthy" ] }, "Components": { "type": "object", "description": "All health check components.", "required": [ "system", "redis", "queue" ], "properties": { "plugins": { "$ref": "#/components/schemas/PluginHealth" }, "queue": { "$ref": "#/components/schemas/QueueHealth" }, "redis": { "$ref": "#/components/schemas/RedisHealth" }, "system": { "$ref": "#/components/schemas/SystemHealth" } } }, "ContractSource": { "oneOf": [ { "type": "object", "required": [ "address", "from" ], "properties": { "address": { "type": "string" }, "from": { "type": "string", "enum": [ "address" ] } } }, { "type": "object", "required": [ "contract", "from" ], "properties": { "contract": { "type": "string" }, "from": { "type": "string", "enum": [ "contract" ] } } } ], "description": "Represents the source for contract creation" }, "CreateRelayerPolicyRequest": { "oneOf": [ { "$ref": "#/components/schemas/RelayerEvmPolicy" }, { "$ref": "#/components/schemas/RelayerSolanaPolicy" }, { "$ref": "#/components/schemas/RelayerStellarPolicy" } ], "description": "Policy types for create requests - deserialized based on network_type from parent request" }, "CreateRelayerRequest": { "type": "object", "description": "Request model for creating a new relayer", "required": [ "name", "network", "paused", "network_type", "signer_id" ], "properties": { "custom_rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/RpcConfig" } }, "id": { "type": "string" }, "name": { "type": "string" }, "network": { "type": "string" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType" }, "notification_id": { "type": "string" }, "paused": { "type": "boolean" }, "policies": { "$ref": "#/components/schemas/CreateRelayerPolicyRequest", "description": "Policies - will be deserialized based on the network_type field" }, "signer_id": { "type": "string" } }, "additionalProperties": false }, "DeletePendingTransactionsResponse": { "type": "object", "description": "Response for delete pending transactions operation", "required": [ "queued_for_cancellation_transaction_ids", "failed_to_queue_transaction_ids", "total_processed" ], "properties": { "failed_to_queue_transaction_ids": { "type": "array", "items": { "type": "string" } }, "queued_for_cancellation_transaction_ids": { "type": "array", "items": { "type": "string" } }, "total_processed": { "type": "integer", "format": "int32", "minimum": 0 } } }, "DisabledReason": { "oneOf": [ { "type": "object", "description": "Nonce synchronization failed during initialization", "required": [ "details", "type" ], "properties": { "details": { "type": "string", "description": "Nonce synchronization failed during initialization" }, "type": { "type": "string", "enum": [ "NonceSyncFailed" ] } } }, { "type": "object", "description": "RPC endpoint validation failed", "required": [ "details", "type" ], "properties": { "details": { "type": "string", "description": "RPC endpoint validation failed" }, "type": { "type": "string", "enum": [ "RpcValidationFailed" ] } } }, { "type": "object", "description": "Balance check failed (below minimum threshold)", "required": [ "details", "type" ], "properties": { "details": { "type": "string", "description": "Balance check failed (below minimum threshold)" }, "type": { "type": "string", "enum": [ "BalanceCheckFailed" ] } } }, { "type": "object", "description": "Sequence number synchronization failed (Stellar)", "required": [ "details", "type" ], "properties": { "details": { "type": "string", "description": "Sequence number synchronization failed (Stellar)" }, "type": { "type": "string", "enum": [ "SequenceSyncFailed" ] } } }, { "type": "object", "description": "Multiple failures occurred simultaneously", "required": [ "details", "type" ], "properties": { "details": { "type": "array", "items": { "type": "string" }, "description": "Multiple failures occurred simultaneously" }, "type": { "type": "string", "enum": [ "Multiple" ] } } } ], "description": "Reason for a relayer being disabled by the system\nThis represents persistent state, converted from HealthCheckFailure when disabling" }, "EncodedSerializedTransaction": { "type": "string" }, "EvmPolicyResponse": { "type": "object", "description": "EVM policy response model for OpenAPI documentation", "properties": { "eip1559_pricing": { "type": "boolean" }, "gas_limit_estimation": { "type": "boolean" }, "gas_price_cap": { "type": "integer", "minimum": 0 }, "min_balance": { "type": "integer", "minimum": 0 }, "private_transactions": { "type": "boolean" }, "whitelist_receivers": { "type": "array", "items": { "type": "string" } } }, "additionalProperties": false }, "EvmRpcRequest": { "oneOf": [ { "type": "object", "description": "Unified raw request variant where params may be a JSON string or structured JSON value.", "required": [ "method", "params" ], "properties": { "method": { "type": "string" }, "params": {} } } ] }, "EvmRpcResult": { "oneOf": [ { "description": "Raw JSON-RPC response value. Covers string, array or object results." } ] }, "EvmTransactionDataSignature": { "type": "object", "required": [ "r", "s", "v", "sig" ], "properties": { "r": { "type": "string" }, "s": { "type": "string" }, "sig": { "type": "string" }, "v": { "type": "integer", "format": "int32", "minimum": 0 } } }, "EvmTransactionRequest": { "type": "object", "required": [ "value" ], "properties": { "data": { "type": "string" }, "gas_limit": { "type": [ "integer", "null" ], "format": "int64", "minimum": 0 }, "gas_price": { "type": "integer", "minimum": 0 }, "max_fee_per_gas": { "type": "integer", "minimum": 0 }, "max_priority_fee_per_gas": { "type": "integer", "minimum": 0 }, "speed": { "$ref": "#/components/schemas/Speed" }, "to": { "type": "string" }, "valid_until": { "type": "string" }, "value": { "type": "integer", "format": "u128", "minimum": 0 } } }, "EvmTransactionResponse": { "type": "object", "required": [ "id", "status", "created_at", "value", "from", "relayer_id" ], "properties": { "confirmed_at": { "type": "string" }, "created_at": { "type": "string" }, "data": { "type": "string" }, "from": { "type": "string" }, "gas_limit": { "type": [ "integer", "null" ], "format": "int64", "minimum": 0 }, "gas_price": { "type": "string" }, "hash": { "type": "string" }, "id": { "type": "string" }, "max_fee_per_gas": { "type": "string" }, "max_priority_fee_per_gas": { "type": "string" }, "nonce": { "type": "integer", "format": "int64", "minimum": 0 }, "relayer_id": { "type": "string" }, "sent_at": { "type": "string" }, "signature": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/EvmTransactionDataSignature" } ] }, "speed": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/Speed" } ] }, "status": { "$ref": "#/components/schemas/TransactionStatus" }, "status_reason": { "type": [ "string", "null" ] }, "to": { "type": "string" }, "value": { "type": "string" } } }, "GetFeaturesEnabledRequestParams": { "type": "object", "additionalProperties": false }, "GetFeaturesEnabledResult": { "type": "object", "required": [ "features" ], "properties": { "features": { "type": "array", "items": { "type": "string" } } } }, "GetSupportedTokensItem": { "type": "object", "required": [ "mint", "symbol", "decimals" ], "properties": { "conversion_slippage_percentage": { "type": "number", "format": "float" }, "decimals": { "type": "integer", "format": "int32", "minimum": 0 }, "max_allowed_fee": { "type": "integer", "format": "int64", "minimum": 0 }, "mint": { "type": "string" }, "symbol": { "type": "string" } } }, "GetSupportedTokensRequestParams": { "type": "object", "additionalProperties": false }, "GetSupportedTokensResult": { "type": "object", "required": [ "tokens" ], "properties": { "tokens": { "type": "array", "items": { "$ref": "#/components/schemas/GetSupportedTokensItem" } } } }, "GoogleCloudKmsSignerKeyRequestConfig": { "type": "object", "description": "Google Cloud KMS key configuration for API requests", "required": [ "location", "key_ring_id", "key_id", "key_version" ], "properties": { "key_id": { "type": "string" }, "key_ring_id": { "type": "string" }, "key_version": { "type": "integer", "format": "int32", "minimum": 0 }, "location": { "type": "string" } }, "additionalProperties": false }, "GoogleCloudKmsSignerKeyResponseConfig": { "type": "object", "required": [ "location", "key_ring_id", "key_id", "key_version" ], "properties": { "key_id": { "type": "string" }, "key_ring_id": { "type": "string" }, "key_version": { "type": "integer", "format": "int32", "minimum": 0 }, "location": { "type": "string" } } }, "GoogleCloudKmsSignerRequestConfig": { "type": "object", "description": "Google Cloud KMS signer configuration for API requests", "required": [ "service_account", "key" ], "properties": { "key": { "$ref": "#/components/schemas/GoogleCloudKmsSignerKeyRequestConfig" }, "service_account": { "$ref": "#/components/schemas/GoogleCloudKmsSignerServiceAccountRequestConfig" } }, "additionalProperties": false }, "GoogleCloudKmsSignerServiceAccountRequestConfig": { "type": "object", "description": "Google Cloud KMS service account configuration for API requests", "required": [ "private_key", "private_key_id", "project_id", "client_email", "client_id", "auth_uri", "token_uri", "auth_provider_x509_cert_url", "client_x509_cert_url", "universe_domain" ], "properties": { "auth_provider_x509_cert_url": { "type": "string" }, "auth_uri": { "type": "string" }, "client_email": { "type": "string" }, "client_id": { "type": "string" }, "client_x509_cert_url": { "type": "string" }, "private_key": { "type": "string" }, "private_key_id": { "type": "string" }, "project_id": { "type": "string" }, "token_uri": { "type": "string" }, "universe_domain": { "type": "string" } }, "additionalProperties": false }, "GoogleCloudKmsSignerServiceAccountResponseConfig": { "type": "object", "required": [ "project_id", "client_id", "auth_uri", "token_uri", "auth_provider_x509_cert_url", "client_x509_cert_url", "universe_domain" ], "properties": { "auth_provider_x509_cert_url": { "type": "string" }, "auth_uri": { "type": "string" }, "client_id": { "type": "string" }, "client_x509_cert_url": { "type": "string" }, "project_id": { "type": "string" }, "token_uri": { "type": "string" }, "universe_domain": { "type": "string" } } }, "JsonRpcError": { "type": "object", "description": "JSON-RPC 2.0 Error structure.\n\nRepresents an error in a JSON-RPC response.", "required": [ "code", "message", "description" ], "properties": { "code": { "type": "integer", "format": "int32" }, "description": { "type": "string" }, "message": { "type": "string" } } }, "JsonRpcId": { "oneOf": [ { "type": "string", "description": "String identifier" }, { "type": "integer", "format": "int64", "description": "Numeric identifier (should not contain fractional parts per spec)" } ], "description": "Represents a JSON-RPC 2.0 ID value.\nAccording to the spec, the ID can be a String or Number.\nWhen used in `Option`: Some(id) = actual ID, None = explicit null." }, "JsonRpcRequest_NetworkRpcRequest": { "allOf": [ { "oneOf": [ { "$ref": "#/components/schemas/SolanaRpcRequest" }, { "$ref": "#/components/schemas/StellarRpcRequest" }, { "$ref": "#/components/schemas/EvmRpcRequest" } ] }, { "type": "object", "required": [ "jsonrpc" ], "properties": { "id": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/JsonRpcId" } ] }, "jsonrpc": { "type": "string" } } } ], "description": "JSON-RPC 2.0 Request structure.\n\nRepresents a JSON-RPC request with proper ID handling:\n- `Some(JsonRpcId)` = request with ID\n- `None` = explicit null ID or notification" }, "JsonRpcResponse_NetworkRpcResult": { "type": "object", "description": "JSON-RPC 2.0 Response structure.\n\nRepresents a JSON-RPC response that can contain either a result or an error.", "required": [ "jsonrpc" ], "properties": { "error": { "$ref": "#/components/schemas/JsonRpcError" }, "id": { "$ref": "#/components/schemas/JsonRpcId" }, "jsonrpc": { "type": "string" }, "result": { "oneOf": [ { "$ref": "#/components/schemas/SolanaRpcResult" }, { "$ref": "#/components/schemas/StellarRpcResult" }, { "$ref": "#/components/schemas/EvmRpcResult" } ] } } }, "JupiterSwapOptions": { "type": "object", "description": "Jupiter swap options", "properties": { "dynamic_compute_unit_limit": { "type": "boolean" }, "priority_fee_max_lamports": { "type": "integer", "format": "int64", "description": "Maximum priority fee (in lamports) for a transaction. Optional.", "minimum": 0 }, "priority_level": { "type": "string", "description": "Priority. Optional." } }, "additionalProperties": false }, "LocalSignerRequestConfig": { "type": "object", "description": "Local signer configuration for API requests", "required": [ "key" ], "properties": { "key": { "type": "string" } }, "additionalProperties": false }, "LogEntry": { "type": "object", "required": [ "level", "message" ], "properties": { "level": { "$ref": "#/components/schemas/LogLevel" }, "message": { "type": "string" } } }, "LogLevel": { "type": "string", "enum": [ "log", "info", "error", "warn", "debug", "result" ] }, "MaskedRpcConfig": { "type": "object", "description": "RPC configuration with masked URL for API responses.\n\nThis type is used in API responses to prevent exposing sensitive API keys\nthat are often embedded in RPC endpoint URLs (e.g., Alchemy, Infura, QuickNode).\nThe URL path and query parameters are masked while keeping the host visible,\nallowing users to identify which provider is configured.", "required": [ "url", "weight" ], "properties": { "url": { "type": "string", "description": "The RPC endpoint URL with path/query masked." }, "weight": { "type": "integer", "format": "int32", "description": "The weight of this endpoint in the weighted round-robin selection.", "maximum": 100, "minimum": 0 } }, "example": { "url": "https://eth-mainnet.g.alchemy.com/***", "weight": 100 } }, "MemoSpec": { "oneOf": [ { "type": "object", "required": [ "type" ], "properties": { "type": { "type": "string", "enum": [ "none" ] } } }, { "type": "object", "required": [ "value", "type" ], "properties": { "type": { "type": "string", "enum": [ "text" ] }, "value": { "type": "string" } } }, { "type": "object", "required": [ "value", "type" ], "properties": { "type": { "type": "string", "enum": [ "id" ] }, "value": { "type": "integer", "format": "int64", "minimum": 0 } } }, { "type": "object", "required": [ "value", "type" ], "properties": { "type": { "type": "string", "enum": [ "hash" ] }, "value": { "type": "array", "items": { "type": "integer", "format": "int32", "minimum": 0 } } } }, { "type": "object", "required": [ "value", "type" ], "properties": { "type": { "type": "string", "enum": [ "return" ] }, "value": { "type": "array", "items": { "type": "integer", "format": "int32", "minimum": 0 } } } } ] }, "NetworkPolicyResponse": { "allOf": [ { "$ref": "#/components/schemas/RelayerNetworkPolicy" } ], "description": "Network policy response models for OpenAPI documentation" }, "NetworkResponse": { "type": "object", "description": "Network response model for API endpoints.\n\nThis flattens the internal NetworkRepoModel structure for API responses,\nmaking network-type-specific fields available at the top level.", "required": [ "id", "name", "network_type" ], "properties": { "average_blocktime_ms": { "type": "integer", "format": "int64", "description": "Estimated average time between blocks in milliseconds", "minimum": 0 }, "chain_id": { "type": "integer", "format": "int64", "description": "EVM-specific: Chain ID", "minimum": 0 }, "explorer_urls": { "type": "array", "items": { "type": "string" }, "description": "List of Explorer endpoint URLs" }, "features": { "type": "array", "items": { "type": "string" }, "description": "EVM-specific: Network features (e.g., \"eip1559\")" }, "horizon_url": { "type": "string", "description": "Stellar-specific: Horizon URL" }, "id": { "type": "string", "description": "Unique identifier composed of network_type and name, e.g., \"evm:mainnet\"" }, "is_testnet": { "type": "boolean", "description": "Flag indicating if the network is a testnet" }, "name": { "type": "string", "description": "Name of the network (e.g., \"mainnet\", \"sepolia\")" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType", "description": "Type of the network (EVM, Solana, Stellar)" }, "passphrase": { "type": "string", "description": "Stellar-specific: Network passphrase" }, "required_confirmations": { "type": "integer", "format": "int64", "description": "EVM-specific: Required confirmations", "minimum": 0 }, "rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/RpcConfig" }, "description": "List of RPC endpoint configurations" }, "symbol": { "type": "string", "description": "EVM-specific: Native token symbol" }, "tags": { "type": "array", "items": { "type": "string" }, "description": "List of arbitrary tags for categorizing or filtering networks" } } }, "NetworkRpcRequest": { "oneOf": [ { "$ref": "#/components/schemas/SolanaRpcRequest" }, { "$ref": "#/components/schemas/StellarRpcRequest" }, { "$ref": "#/components/schemas/EvmRpcRequest" } ] }, "NetworkRpcResult": { "oneOf": [ { "$ref": "#/components/schemas/SolanaRpcResult" }, { "$ref": "#/components/schemas/StellarRpcResult" }, { "$ref": "#/components/schemas/EvmRpcResult" } ] }, "NetworkTransactionRequest": { "oneOf": [ { "$ref": "#/components/schemas/EvmTransactionRequest" }, { "$ref": "#/components/schemas/SolanaTransactionRequest" }, { "$ref": "#/components/schemas/StellarTransactionRequest" } ] }, "NotificationCreateRequest": { "type": "object", "description": "Request structure for creating a new notification", "required": [ "url" ], "properties": { "id": { "type": "string" }, "signing_key": { "type": "string", "description": "Optional signing key for securing webhook notifications" }, "type": { "$ref": "#/components/schemas/NotificationType" }, "url": { "type": "string" } }, "additionalProperties": false }, "NotificationResponse": { "type": "object", "description": "Response structure for notification API endpoints", "required": [ "id", "type", "url", "has_signing_key" ], "properties": { "has_signing_key": { "type": "boolean", "description": "Signing key is hidden in responses for security" }, "id": { "type": "string" }, "type": { "$ref": "#/components/schemas/NotificationType" }, "url": { "type": "string" } } }, "NotificationType": { "type": "string", "description": "Notification type enum used by both config file and API", "enum": [ "webhook" ] }, "NotificationUpdateRequest": { "type": "object", "description": "Request structure for updating an existing notification", "properties": { "signing_key": { "type": [ "string", "null" ], "description": "Optional signing key for securing webhook notifications.\n- None: don't change the existing signing key\n- Some(\"\"): remove the signing key\n- Some(\"key\"): set the signing key to the provided value" }, "type": { "$ref": "#/components/schemas/NotificationType" }, "url": { "type": "string" } }, "additionalProperties": false }, "OperationSpec": { "oneOf": [ { "type": "object", "required": [ "destination", "amount", "asset", "type" ], "properties": { "amount": { "type": "integer", "format": "int64" }, "asset": { "$ref": "#/components/schemas/AssetSpec" }, "destination": { "type": "string" }, "type": { "type": "string", "enum": [ "payment" ] } } }, { "type": "object", "required": [ "contract_address", "function_name", "args", "type" ], "properties": { "args": { "type": "array", "items": {} }, "auth": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AuthSpec" } ] }, "contract_address": { "type": "string" }, "function_name": { "type": "string" }, "type": { "type": "string", "enum": [ "invoke_contract" ] } } }, { "type": "object", "required": [ "source", "wasm_hash", "type" ], "properties": { "auth": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AuthSpec" } ] }, "constructor_args": { "type": [ "array", "null" ], "items": {} }, "salt": { "type": [ "string", "null" ] }, "source": { "$ref": "#/components/schemas/ContractSource" }, "type": { "type": "string", "enum": [ "create_contract" ] }, "wasm_hash": { "type": "string" } } }, { "type": "object", "required": [ "wasm", "type" ], "properties": { "auth": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/AuthSpec" } ] }, "type": { "type": "string", "enum": [ "upload_wasm" ] }, "wasm": { "$ref": "#/components/schemas/WasmSource" } } } ] }, "PaginationMeta": { "type": "object", "required": [ "current_page", "per_page", "total_items" ], "properties": { "current_page": { "type": "integer", "format": "int32", "minimum": 0 }, "per_page": { "type": "integer", "format": "int32", "minimum": 0 }, "total_items": { "type": "integer", "format": "int64", "minimum": 0 } } }, "PluginCallRequest": { "type": "object", "properties": { "params": { "description": "Plugin parameters. If not provided, the entire request body will be used as params." } } }, "PluginHandlerError": { "type": "object", "properties": { "code": { "type": [ "string", "null" ] }, "details": {} } }, "PluginHealth": { "type": "object", "description": "Plugin health information.", "required": [ "status", "enabled" ], "properties": { "avg_response_time_ms": { "type": "integer", "format": "int32", "description": "Average response time in milliseconds", "minimum": 0 }, "circuit_state": { "type": "string" }, "connection_pool_active_connections": { "type": "integer", "description": "Connection pool active connections (for pool server connections)", "minimum": 0 }, "connection_pool_available_slots": { "type": "integer", "description": "Connection pool available slots (for pool server connections)", "minimum": 0 }, "enabled": { "type": "boolean" }, "error": { "type": "string" }, "memory": { "type": "integer", "format": "int64", "description": "Memory usage in bytes", "minimum": 0 }, "pool_completed": { "type": "integer", "format": "int64", "description": "Number of completed tasks in the pool", "minimum": 0 }, "pool_queued": { "type": "integer", "format": "int64", "description": "Number of queued tasks in the pool", "minimum": 0 }, "recovering": { "type": "boolean", "description": "Whether recovery mode is active" }, "recovery_percent": { "type": "integer", "format": "int32", "description": "Current recovery allowance percentage", "minimum": 0 }, "shared_socket_active_connections": { "type": "integer", "description": "Shared socket active connection count", "minimum": 0 }, "shared_socket_available_slots": { "type": "integer", "description": "Shared socket available connection slots", "minimum": 0 }, "shared_socket_registered_executions": { "type": "integer", "description": "Shared socket registered execution count", "minimum": 0 }, "status": { "$ref": "#/components/schemas/ComponentStatus" }, "success_rate": { "type": "number", "format": "double", "description": "Success rate as a percentage (0.0-100.0)" }, "uptime_ms": { "type": "integer", "format": "int64", "description": "Plugin uptime in milliseconds", "minimum": 0 } } }, "PluginMetadata": { "type": "object", "properties": { "logs": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/LogEntry" } }, "traces": { "type": [ "array", "null" ], "items": {} } } }, "PluginModel": { "type": "object", "required": [ "id", "path", "timeout" ], "properties": { "allow_get_invocation": { "type": "boolean", "description": "Whether to allow GET requests to invoke plugin logic" }, "config": { "type": [ "object", "null" ], "description": "User-defined configuration accessible to the plugin (must be a JSON object)", "additionalProperties": {}, "propertyNames": { "type": "string" } }, "emit_logs": { "type": "boolean", "description": "Whether to include logs in the HTTP response" }, "emit_traces": { "type": "boolean", "description": "Whether to include traces in the HTTP response" }, "forward_logs": { "type": "boolean", "description": "Whether to forward plugin logs into the relayer's tracing output" }, "id": { "type": "string", "description": "Plugin ID" }, "path": { "type": "string", "description": "Plugin path" }, "raw_response": { "type": "boolean", "description": "Whether to return raw plugin response without ApiResponse wrapper" }, "timeout": { "type": "integer", "format": "int64", "description": "Plugin timeout", "minimum": 0 } } }, "PoolStatus": { "type": "object", "description": "Status of an individual Redis connection pool.", "required": [ "connected", "available", "max_size" ], "properties": { "available": { "type": "integer", "description": "Number of available connections in the pool.", "minimum": 0 }, "connected": { "type": "boolean", "description": "Whether the pool is connected and responding to PING." }, "error": { "type": "string", "description": "Error message if the pool is not healthy." }, "max_size": { "type": "integer", "description": "Maximum configured pool size.", "minimum": 0 } } }, "QueueHealth": { "type": "object", "description": "Queue health information.", "required": [ "status" ], "properties": { "error": { "type": "string" }, "status": { "$ref": "#/components/schemas/ComponentStatus" } } }, "ReadinessResponse": { "type": "object", "description": "Complete readiness response.", "required": [ "ready", "status", "components", "timestamp" ], "properties": { "components": { "$ref": "#/components/schemas/Components" }, "ready": { "type": "boolean" }, "reason": { "type": "string" }, "status": { "$ref": "#/components/schemas/ComponentStatus" }, "timestamp": { "type": "string" } } }, "RedisHealth": { "type": "object", "description": "Redis health information.", "required": [ "status", "primary_pool", "reader_pool" ], "properties": { "error": { "type": "string" }, "primary_pool": { "$ref": "#/components/schemas/PoolStatus" }, "reader_pool": { "$ref": "#/components/schemas/PoolStatus" }, "status": { "$ref": "#/components/schemas/ComponentStatus" } } }, "RelayerEvmPolicy": { "type": "object", "description": "EVM-specific relayer policy configuration", "properties": { "eip1559_pricing": { "type": [ "boolean", "null" ] }, "gas_limit_estimation": { "type": [ "boolean", "null" ] }, "gas_price_cap": { "type": [ "integer", "null" ], "minimum": 0 }, "min_balance": { "type": [ "integer", "null" ], "minimum": 0 }, "private_transactions": { "type": [ "boolean", "null" ] }, "whitelist_receivers": { "type": [ "array", "null" ], "items": { "type": "string" } } }, "additionalProperties": false }, "RelayerNetworkPolicy": { "oneOf": [ { "allOf": [ { "$ref": "#/components/schemas/RelayerEvmPolicy" }, { "type": "object", "required": [ "network_type" ], "properties": { "network_type": { "type": "string", "enum": [ "evm" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/RelayerSolanaPolicy" }, { "type": "object", "required": [ "network_type" ], "properties": { "network_type": { "type": "string", "enum": [ "solana" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/RelayerStellarPolicy" }, { "type": "object", "required": [ "network_type" ], "properties": { "network_type": { "type": "string", "enum": [ "stellar" ] } } } ] } ], "description": "Network-specific policy for relayers" }, "RelayerNetworkPolicyResponse": { "oneOf": [ { "$ref": "#/components/schemas/EvmPolicyResponse" }, { "$ref": "#/components/schemas/StellarPolicyResponse" }, { "$ref": "#/components/schemas/SolanaPolicyResponse" } ], "description": "Policy types for responses - these don't include network_type tags\nsince the network_type is already available at the top level of RelayerResponse" }, "RelayerNetworkType": { "type": "string", "description": "Network type enum for relayers", "enum": [ "evm", "solana", "stellar" ] }, "RelayerResponse": { "type": "object", "description": "Relayer response model for API endpoints", "required": [ "id", "name", "network", "network_type", "paused", "signer_id" ], "properties": { "address": { "type": "string" }, "custom_rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/MaskedRpcConfig" }, "description": "Custom RPC URLs with sensitive path/query parameters masked for security.\nThe domain is visible to identify providers (e.g., Alchemy, Infura) but\nAPI keys embedded in paths are hidden." }, "disabled_reason": { "$ref": "#/components/schemas/DisabledReason" }, "id": { "type": "string" }, "name": { "type": "string" }, "network": { "type": "string" }, "network_type": { "$ref": "#/components/schemas/RelayerNetworkType" }, "notification_id": { "type": "string" }, "paused": { "type": "boolean" }, "policies": { "$ref": "#/components/schemas/RelayerNetworkPolicyResponse", "description": "Policies without redundant network_type tag - network type is available at top level\nOnly included if user explicitly provided policies (not shown for empty/default policies)" }, "signer_id": { "type": "string" }, "system_disabled": { "type": "boolean" } } }, "RelayerSolanaPolicy": { "type": "object", "description": "Solana-specific relayer policy configuration", "properties": { "allowed_accounts": { "type": [ "array", "null" ], "items": { "type": "string" } }, "allowed_programs": { "type": [ "array", "null" ], "items": { "type": "string" } }, "allowed_tokens": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/SolanaAllowedTokensPolicy" } }, "disallowed_accounts": { "type": [ "array", "null" ], "items": { "type": "string" } }, "fee_margin_percentage": { "type": [ "number", "null" ], "format": "float" }, "fee_payment_strategy": { "$ref": "#/components/schemas/SolanaFeePaymentStrategy" }, "max_allowed_fee_lamports": { "type": [ "integer", "null" ], "format": "int64", "minimum": 0 }, "max_signatures": { "type": [ "integer", "null" ], "format": "int32", "minimum": 0 }, "max_tx_data_size": { "type": [ "integer", "null" ], "format": "int32", "minimum": 0 }, "min_balance": { "type": [ "integer", "null" ], "format": "int64", "minimum": 0 }, "swap_config": { "$ref": "#/components/schemas/RelayerSolanaSwapConfig" } }, "additionalProperties": false }, "RelayerSolanaSwapConfig": { "type": "object", "description": "Solana swap policy configuration", "properties": { "cron_schedule": { "type": "string", "description": "Cron schedule for executing token swap logic to keep relayer funded. Optional." }, "jupiter_swap_options": { "$ref": "#/components/schemas/JupiterSwapOptions", "description": "Swap options for JupiterSwap strategy. Optional." }, "min_balance_threshold": { "type": "integer", "format": "int64", "description": "Min sol balance to execute token swap logic to keep relayer funded. Optional.", "minimum": 0 }, "strategy": { "$ref": "#/components/schemas/SolanaSwapStrategy", "description": "DEX strategy to use for token swaps." } }, "additionalProperties": false }, "RelayerStatus": { "oneOf": [ { "type": "object", "required": [ "balance", "pending_transactions_count", "system_disabled", "paused", "nonce", "network_type" ], "properties": { "balance": { "type": "string" }, "last_confirmed_transaction_timestamp": { "type": [ "string", "null" ] }, "network_type": { "type": "string", "enum": [ "evm" ] }, "nonce": { "type": "string" }, "paused": { "type": "boolean" }, "pending_transactions_count": { "type": "integer", "format": "int64", "minimum": 0 }, "system_disabled": { "type": "boolean" } } }, { "type": "object", "required": [ "balance", "pending_transactions_count", "system_disabled", "paused", "sequence_number", "network_type" ], "properties": { "balance": { "type": "string" }, "last_confirmed_transaction_timestamp": { "type": [ "string", "null" ] }, "network_type": { "type": "string", "enum": [ "stellar" ] }, "paused": { "type": "boolean" }, "pending_transactions_count": { "type": "integer", "format": "int64", "minimum": 0 }, "sequence_number": { "type": "string" }, "system_disabled": { "type": "boolean" } } }, { "type": "object", "required": [ "balance", "pending_transactions_count", "system_disabled", "paused", "network_type" ], "properties": { "balance": { "type": "string" }, "last_confirmed_transaction_timestamp": { "type": [ "string", "null" ] }, "network_type": { "type": "string", "enum": [ "solana" ] }, "paused": { "type": "boolean" }, "pending_transactions_count": { "type": "integer", "format": "int64", "minimum": 0 }, "system_disabled": { "type": "boolean" } } } ], "description": "Relayer status with runtime information" }, "RelayerStellarPolicy": { "type": "object", "description": "Stellar-specific relayer policy configuration", "properties": { "allowed_tokens": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/StellarAllowedTokensPolicy" } }, "concurrent_transactions": { "type": [ "boolean", "null" ] }, "fee_margin_percentage": { "type": [ "number", "null" ], "format": "float" }, "fee_payment_strategy": { "$ref": "#/components/schemas/StellarFeePaymentStrategy", "description": "Fee payment strategy - determines who pays transaction fees (optional)" }, "max_fee": { "type": [ "integer", "null" ], "format": "int32", "minimum": 0 }, "min_balance": { "type": [ "integer", "null" ], "format": "int64", "minimum": 0 }, "slippage_percentage": { "type": [ "number", "null" ], "format": "float" }, "swap_config": { "$ref": "#/components/schemas/RelayerStellarSwapConfig" }, "timeout_seconds": { "type": [ "integer", "null" ], "format": "int64", "minimum": 0 } }, "additionalProperties": false }, "RelayerStellarSwapConfig": { "type": "object", "description": "Stellar swap policy configuration", "properties": { "cron_schedule": { "type": "string", "description": "Cron schedule for executing token swap logic to keep relayer funded. Optional." }, "min_balance_threshold": { "type": "integer", "format": "int64", "description": "Min XLM balance (in stroops) to execute token swap logic to keep relayer funded. Optional.", "minimum": 0 }, "strategies": { "type": "array", "items": { "$ref": "#/components/schemas/StellarSwapStrategy" }, "description": "DEX strategies to use for token swaps, in priority order.\nStrategies are tried sequentially until one can handle the asset." } }, "additionalProperties": false }, "RpcConfig": { "type": "object", "description": "Configuration for an RPC endpoint.\n\nThis struct contains only persistent configuration (URL and weight).\nHealth metadata (failures, pause state) is managed separately via `RpcHealthStore`.", "required": [ "url", "weight" ], "properties": { "url": { "type": "string", "description": "The RPC endpoint URL." }, "weight": { "type": "integer", "format": "int32", "description": "The weight of this endpoint in the weighted round-robin selection.\nDefaults to [`DEFAULT_RPC_WEIGHT`]. Should be between 0 and 100.", "default": 100, "maximum": 100, "minimum": 0 } }, "example": { "url": "https://rpc.example.com", "weight": 100 } }, "RpcUrlEntry": { "oneOf": [ { "type": "string", "description": "Simple string format (e.g., \"https://rpc.example.com\")\nDefaults to weight 100." }, { "$ref": "#/components/schemas/RpcConfig", "description": "Extended object format with explicit weight" } ], "description": "Schema-only type representing a flexible RPC URL entry.\nUsed for OpenAPI documentation to show that rpc_urls can accept\neither strings or RpcConfig objects.\n\nThis is NOT used for actual deserialization - the custom deserializer\nhandles the conversion. This type exists solely for schema generation." }, "SignAndSendTransactionRequestParams": { "type": "object", "required": [ "transaction" ], "properties": { "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } }, "additionalProperties": false }, "SignAndSendTransactionResult": { "type": "object", "required": [ "transaction", "signature", "id" ], "properties": { "id": { "type": "string" }, "signature": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } } }, "SignDataRequest": { "type": "object", "required": [ "message" ], "properties": { "message": { "type": "string" } } }, "SignDataResponse": { "oneOf": [ { "$ref": "#/components/schemas/SignDataResponseEvm" }, { "$ref": "#/components/schemas/SignDataResponseSolana" } ] }, "SignDataResponseEvm": { "type": "object", "required": [ "r", "s", "v", "sig" ], "properties": { "r": { "type": "string" }, "s": { "type": "string" }, "sig": { "type": "string" }, "v": { "type": "integer", "format": "int32", "minimum": 0 } } }, "SignDataResponseSolana": { "type": "object", "required": [ "signature", "public_key" ], "properties": { "public_key": { "type": "string" }, "signature": { "type": "string" } } }, "SignTransactionRequest": { "oneOf": [ { "$ref": "#/components/schemas/SignTransactionRequestStellar" }, { "type": "array", "items": { "type": "integer", "format": "int32", "minimum": 0 } }, { "$ref": "#/components/schemas/SignTransactionRequestSolana" } ] }, "SignTransactionRequestParams": { "type": "object", "required": [ "transaction" ], "properties": { "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } }, "additionalProperties": false }, "SignTransactionRequestSolana": { "type": "object", "required": [ "transaction" ], "properties": { "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } } }, "SignTransactionRequestStellar": { "type": "object", "required": [ "unsigned_xdr" ], "properties": { "unsigned_xdr": { "type": "string" } } }, "SignTransactionResponse": { "oneOf": [ { "$ref": "#/components/schemas/SignTransactionResponseStellar" }, { "type": "array", "items": { "type": "integer", "format": "int32", "minimum": 0 } }, { "$ref": "#/components/schemas/SignTransactionResponseSolana" } ] }, "SignTransactionResponseSolana": { "type": "object", "required": [ "transaction", "signature" ], "properties": { "signature": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } } }, "SignTransactionResponseStellar": { "type": "object", "required": [ "signedXdr", "signature" ], "properties": { "signature": { "type": "string" }, "signedXdr": { "type": "string" } } }, "SignTransactionResult": { "type": "object", "required": [ "transaction", "signature" ], "properties": { "signature": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } } }, "SignTypedDataRequest": { "type": "object", "required": [ "domain_separator", "hash_struct_message" ], "properties": { "domain_separator": { "type": "string" }, "hash_struct_message": { "type": "string" } } }, "SignerConfigRequest": { "oneOf": [ { "$ref": "#/components/schemas/LocalSignerRequestConfig" }, { "$ref": "#/components/schemas/AwsKmsSignerRequestConfig" }, { "$ref": "#/components/schemas/VaultSignerRequestConfig" }, { "$ref": "#/components/schemas/VaultTransitSignerRequestConfig" }, { "$ref": "#/components/schemas/TurnkeySignerRequestConfig" }, { "$ref": "#/components/schemas/CdpSignerRequestConfig" }, { "$ref": "#/components/schemas/GoogleCloudKmsSignerRequestConfig" } ], "description": "Signer configuration enum for API requests (without type discriminator)" }, "SignerConfigResponse": { "oneOf": [ { "type": "object", "required": [ "address", "key_name" ], "properties": { "address": { "type": "string" }, "key_name": { "type": "string" }, "mount_point": { "type": [ "string", "null" ] }, "namespace": { "type": [ "string", "null" ] } } }, { "type": "object", "required": [ "key_name", "address", "pubkey" ], "properties": { "address": { "type": "string" }, "key_name": { "type": "string" }, "mount_point": { "type": [ "string", "null" ] }, "namespace": { "type": [ "string", "null" ] }, "pubkey": { "type": "string" } } }, { "type": "object", "required": [ "key_id" ], "properties": { "key_id": { "type": "string" }, "region": { "type": [ "string", "null" ] } } }, { "type": "object", "required": [ "api_public_key", "organization_id", "private_key_id", "public_key" ], "properties": { "api_public_key": { "type": "string" }, "organization_id": { "type": "string" }, "private_key_id": { "type": "string" }, "public_key": { "type": "string" } } }, { "type": "object", "required": [ "api_key_id", "account_address" ], "properties": { "account_address": { "type": "string" }, "api_key_id": { "type": "string" } } }, { "type": "object", "required": [ "service_account", "key" ], "properties": { "key": { "$ref": "#/components/schemas/GoogleCloudKmsSignerKeyResponseConfig" }, "service_account": { "$ref": "#/components/schemas/GoogleCloudKmsSignerServiceAccountResponseConfig" } } }, { "type": "object" } ], "description": "Signer configuration response\nDoes not include sensitive information like private keys" }, "SignerCreateRequest": { "type": "object", "description": "Request model for creating a new signer", "required": [ "type", "config" ], "properties": { "config": { "$ref": "#/components/schemas/SignerConfigRequest", "description": "The signer configuration" }, "id": { "type": "string", "description": "Optional ID - if not provided, a UUID will be generated" }, "type": { "$ref": "#/components/schemas/SignerTypeRequest", "description": "The type of signer" } }, "additionalProperties": false }, "SignerResponse": { "type": "object", "required": [ "id", "type", "config" ], "properties": { "config": { "$ref": "#/components/schemas/SignerConfigResponse", "description": "Non-secret configuration details" }, "id": { "type": "string", "description": "The unique identifier of the signer" }, "type": { "$ref": "#/components/schemas/SignerType", "description": "The type of signer (local, aws_kms, google_cloud_kms, vault, etc.)" } } }, "SignerType": { "type": "string", "description": "Signer type enum used for validation and API responses", "enum": [ "local", "aws_kms", "google_cloud_kms", "vault", "vault_transit", "turnkey", "cdp" ] }, "SignerTypeRequest": { "type": "string", "description": "Signer type enum for API requests", "enum": [ "plain", "aws_kms", "vault", "vault_transit", "turnkey", "cdp", "google_cloud_kms" ] }, "SignerUpdateRequest": { "type": "object", "description": "Request model for updating an existing signer\nAt the moment, we don't allow updating signers", "additionalProperties": false }, "SolanaAccountMeta": { "type": "object", "description": "Account metadata for a Solana instruction", "required": [ "pubkey", "is_signer", "is_writable" ], "properties": { "is_signer": { "type": "boolean", "description": "Whether the account is a signer" }, "is_writable": { "type": "boolean", "description": "Whether the account is writable" }, "pubkey": { "type": "string", "description": "Account public key (base58-encoded)" } } }, "SolanaAllowedTokensPolicy": { "type": "object", "description": "Configuration for allowed token handling on Solana", "required": [ "mint" ], "properties": { "decimals": { "type": "integer", "format": "int32", "minimum": 0 }, "max_allowed_fee": { "type": "integer", "format": "int64", "minimum": 0 }, "mint": { "type": "string" }, "swap_config": { "$ref": "#/components/schemas/SolanaAllowedTokensSwapConfig" }, "symbol": { "type": "string" } }, "additionalProperties": false }, "SolanaAllowedTokensSwapConfig": { "type": "object", "description": "Solana token swap configuration", "properties": { "max_amount": { "type": "integer", "format": "int64", "description": "Maximum amount of tokens to swap. Optional.", "minimum": 0 }, "min_amount": { "type": "integer", "format": "int64", "description": "Minimum amount of tokens to swap. Optional.", "minimum": 0 }, "retain_min_amount": { "type": "integer", "format": "int64", "description": "Minimum amount of tokens to retain after swap. Optional.", "minimum": 0 }, "slippage_percentage": { "type": "number", "format": "float", "description": "Conversion slippage percentage for token. Optional." } }, "additionalProperties": false }, "SolanaFeeEstimateRequestParams": { "type": "object", "required": [ "transaction", "fee_token" ], "properties": { "fee_token": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } }, "additionalProperties": false }, "SolanaFeeEstimateResult": { "type": "object", "required": [ "estimated_fee", "conversion_rate" ], "properties": { "conversion_rate": { "type": "string" }, "estimated_fee": { "type": "string" } } }, "SolanaFeePaymentStrategy": { "type": "string", "description": "Solana fee payment strategy\n\nDetermines who pays transaction fees:\n- `User`: User must include fee payment to relayer in transaction (for custom RPC methods)\n- `Relayer`: Relayer pays all transaction fees (recommended for send transaction endpoint)\n\nDefault is `User`.", "enum": [ "user", "relayer" ] }, "SolanaInstructionSpec": { "type": "object", "description": "Specification for a Solana instruction", "required": [ "program_id", "accounts", "data" ], "properties": { "accounts": { "type": "array", "items": { "$ref": "#/components/schemas/SolanaAccountMeta" }, "description": "Account metadata for the instruction" }, "data": { "type": "string", "description": "Instruction data (base64-encoded)" }, "program_id": { "type": "string", "description": "Program ID (base58-encoded pubkey)" } } }, "SolanaPolicyResponse": { "type": "object", "description": "Solana policy response model for OpenAPI documentation", "properties": { "allowed_accounts": { "type": "array", "items": { "type": "string" } }, "allowed_programs": { "type": "array", "items": { "type": "string" } }, "allowed_tokens": { "type": "array", "items": { "$ref": "#/components/schemas/SolanaAllowedTokensPolicy" } }, "disallowed_accounts": { "type": "array", "items": { "type": "string" } }, "fee_margin_percentage": { "type": "number", "format": "float" }, "fee_payment_strategy": { "$ref": "#/components/schemas/SolanaFeePaymentStrategy" }, "max_allowed_fee_lamports": { "type": "integer", "format": "int64", "minimum": 0 }, "max_signatures": { "type": "integer", "format": "int32", "minimum": 0 }, "max_tx_data_size": { "type": "integer", "format": "int32", "minimum": 0 }, "min_balance": { "type": "integer", "format": "int64", "minimum": 0 }, "swap_config": { "$ref": "#/components/schemas/RelayerSolanaSwapConfig" } }, "additionalProperties": false }, "SolanaPrepareTransactionRequestParams": { "type": "object", "required": [ "transaction", "fee_token" ], "properties": { "fee_token": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" } }, "additionalProperties": false }, "SolanaPrepareTransactionResult": { "type": "object", "required": [ "transaction", "fee_in_spl", "fee_in_lamports", "fee_token", "valid_until_blockheight" ], "properties": { "fee_in_lamports": { "type": "string" }, "fee_in_spl": { "type": "string" }, "fee_token": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" }, "valid_until_blockheight": { "type": "integer", "format": "int64", "minimum": 0 } } }, "SolanaRpcRequest": { "oneOf": [ { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "feeEstimate" ] }, "params": { "$ref": "#/components/schemas/SolanaFeeEstimateRequestParams" } }, "example": "feeEstimate" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "transferTransaction" ] }, "params": { "$ref": "#/components/schemas/TransferTransactionRequestParams" } }, "example": "transferTransaction" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "prepareTransaction" ] }, "params": { "$ref": "#/components/schemas/SolanaPrepareTransactionRequestParams" } }, "example": "prepareTransaction" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "signTransaction" ] }, "params": { "$ref": "#/components/schemas/SignTransactionRequestParams" } }, "example": "signTransaction" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "signAndSendTransaction" ] }, "params": { "$ref": "#/components/schemas/SignAndSendTransactionRequestParams" } }, "example": "signAndSendTransaction" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "getSupportedTokens" ] }, "params": { "$ref": "#/components/schemas/GetSupportedTokensRequestParams" } }, "example": "getSupportedTokens" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "getFeaturesEnabled" ] }, "params": { "$ref": "#/components/schemas/GetFeaturesEnabledRequestParams" } }, "example": "getFeaturesEnabled" }, { "type": "object", "required": [ "params", "method" ], "properties": { "method": { "type": "string", "enum": [ "rawRpcRequest" ] }, "params": { "type": "object", "required": [ "method", "params" ], "properties": { "method": { "type": "string" }, "params": {} } } }, "example": "rawRpcRequest" } ] }, "SolanaRpcResult": { "oneOf": [ { "allOf": [ { "$ref": "#/components/schemas/SolanaFeeEstimateResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "feeEstimate" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/TransferTransactionResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "transferTransaction" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/SolanaPrepareTransactionResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "prepareTransaction" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/SignTransactionResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "signTransaction" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/SignAndSendTransactionResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "signAndSendTransaction" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/GetSupportedTokensResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "getSupportedTokens" ] } } } ] }, { "allOf": [ { "$ref": "#/components/schemas/GetFeaturesEnabledResult" }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "getFeaturesEnabled" ] } } } ] }, { "type": "object", "required": [ "method" ], "properties": { "method": { "type": "string", "enum": [ "rawRpc" ] } } } ] }, "SolanaSwapStrategy": { "type": "string", "description": "Solana swap strategy", "enum": [ "jupiter-swap", "jupiter-ultra", "noop" ] }, "SolanaTransactionRequest": { "type": "object", "properties": { "instructions": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/SolanaInstructionSpec" }, "description": "Instructions to build transaction from (mutually exclusive with transaction)" }, "transaction": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/EncodedSerializedTransaction", "description": "Pre-built base64-encoded transaction (mutually exclusive with instructions)" } ] }, "valid_until": { "type": [ "string", "null" ], "description": "Optional RFC3339 timestamp when transaction should expire" } } }, "SolanaTransactionResponse": { "type": "object", "required": [ "id", "status", "created_at", "transaction" ], "properties": { "confirmed_at": { "type": "string" }, "created_at": { "type": "string" }, "id": { "type": "string" }, "instructions": { "type": "array", "items": { "$ref": "#/components/schemas/SolanaInstructionSpec" } }, "sent_at": { "type": "string" }, "signature": { "type": "string" }, "status": { "$ref": "#/components/schemas/TransactionStatus" }, "status_reason": { "type": "string" }, "transaction": { "type": "string" } } }, "Speed": { "type": "string", "enum": [ "fastest", "fast", "average", "safeLow" ] }, "SponsoredTransactionBuildRequest": { "oneOf": [ { "$ref": "#/components/schemas/SolanaPrepareTransactionRequestParams", "description": "Solana-specific prepare transaction request parameters" }, { "$ref": "#/components/schemas/StellarPrepareTransactionRequestParams", "description": "Stellar-specific prepare transaction request parameters (classic and Soroban)" } ], "description": "Network-agnostic prepare transaction request parameters for gasless transactions.\nContains network-specific request parameters for preparing transactions with fee payments.\nThe network type is inferred from the relayer's network configuration.\n\nFor Stellar, supports both classic and Soroban gas abstraction:\n- Classic: Pass operations or transaction_xdr with classic fee token\n- Soroban: Pass transaction_xdr containing InvokeHostFunction, user_address, and contract fee token" }, "SponsoredTransactionBuildResponse": { "oneOf": [ { "$ref": "#/components/schemas/SolanaPrepareTransactionResult", "description": "Solana-specific prepare transaction result" }, { "$ref": "#/components/schemas/StellarPrepareTransactionResult", "description": "Stellar-specific prepare transaction result (classic and Soroban)\nFor Soroban: includes optional user_auth_entry, expiration_ledger" } ], "description": "Network-agnostic prepare transaction response for gasless transactions.\nContains network-specific prepare transaction results." }, "SponsoredTransactionQuoteRequest": { "oneOf": [ { "$ref": "#/components/schemas/SolanaFeeEstimateRequestParams", "description": "Solana-specific fee estimate request parameters" }, { "$ref": "#/components/schemas/StellarFeeEstimateRequestParams", "description": "Stellar-specific fee estimate request parameters (classic and Soroban)" } ], "description": "Network-agnostic fee estimate request parameters for gasless transactions.\nContains network-specific request parameters for fee estimation.\nThe network type is inferred from the relayer's network configuration.\n\nFor Stellar, supports both classic and Soroban gas abstraction:\n- Classic: Pass operations or transaction_xdr with classic fee token (native/USDC:GA...)\n- Soroban: Pass transaction_xdr containing InvokeHostFunction, user_address, and contract fee token (C...)" }, "SponsoredTransactionQuoteResponse": { "oneOf": [ { "$ref": "#/components/schemas/SolanaFeeEstimateResult", "description": "Solana-specific fee estimate result" }, { "$ref": "#/components/schemas/StellarFeeEstimateResult", "description": "Stellar-specific fee estimate result (classic and Soroban)" } ], "description": "Network-agnostic fee estimate response for gasless transactions.\nContains network-specific fee estimate results." }, "StellarAllowedTokensPolicy": { "type": "object", "description": "Configuration for allowed token handling on Stellar", "required": [ "asset" ], "properties": { "asset": { "type": "string" }, "max_allowed_fee": { "type": "integer", "format": "int64", "minimum": 0 }, "metadata": { "$ref": "#/components/schemas/StellarTokenMetadata" }, "swap_config": { "$ref": "#/components/schemas/StellarAllowedTokensSwapConfig" } }, "additionalProperties": false }, "StellarAllowedTokensSwapConfig": { "type": "object", "description": "Stellar token swap configuration", "properties": { "max_amount": { "type": "integer", "format": "int64", "description": "Maximum amount of tokens to swap. Optional.", "minimum": 0 }, "min_amount": { "type": "integer", "format": "int64", "description": "Minimum amount of tokens to swap. Optional.", "minimum": 0 }, "retain_min_amount": { "type": "integer", "format": "int64", "description": "Minimum amount of tokens to retain after swap. Optional.", "minimum": 0 }, "slippage_percentage": { "type": "number", "format": "float", "description": "Conversion slippage percentage for token. Optional." } }, "additionalProperties": false }, "StellarFeeEstimateRequestParams": { "type": "object", "required": [ "fee_token" ], "properties": { "fee_token": { "type": "string", "description": "Asset identifier for fee token.\nFor classic: \"native\" or \"USDC:GA5Z...\" format.\nFor Soroban: contract address (C...) format." }, "operations": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/OperationSpec" }, "description": "Operations array to build transaction from\nMutually exclusive with transaction_xdr field" }, "source_account": { "type": [ "string", "null" ], "description": "Source account address (required when operations are provided)\nFor sponsored transactions, this should be the user's account address" }, "transaction_xdr": { "type": [ "string", "null" ], "description": "Pre-built transaction XDR (base64 encoded, signed or unsigned)\nMutually exclusive with operations field.\nFor Soroban gas abstraction: pass XDR containing InvokeHostFunction operation." } }, "additionalProperties": false }, "StellarFeeEstimateResult": { "type": "object", "required": [ "fee_in_token_ui", "fee_in_token", "conversion_rate" ], "properties": { "conversion_rate": { "type": "string", "description": "Conversion rate from XLM to token (as string)" }, "fee_in_token": { "type": "string", "description": "Estimated fee in token amount (raw units as string)" }, "fee_in_token_ui": { "type": "string", "description": "Estimated fee in token amount (decimal UI representation as string)" }, "max_fee_in_token": { "type": [ "string", "null" ], "description": "Maximum fee in token amount (raw units as string).\nOnly present for Soroban gas abstraction - includes slippage buffer." }, "max_fee_in_token_ui": { "type": [ "string", "null" ], "description": "Maximum fee in token amount (decimal UI representation as string).\nOnly present for Soroban gas abstraction - includes slippage buffer." } } }, "StellarFeePaymentStrategy": { "type": "string", "description": "Stellar fee payment strategy\n\nDetermines who pays transaction fees:\n- `User`: User must include fee payment to relayer in transaction (for custom RPC methods)\n- `Relayer`: Relayer pays all transaction fees (recommended for send transaction endpoint)", "enum": [ "user", "relayer" ] }, "StellarPolicyResponse": { "type": "object", "description": "Stellar policy response model for OpenAPI documentation", "properties": { "allowed_tokens": { "type": "array", "items": { "$ref": "#/components/schemas/StellarAllowedTokensPolicy" } }, "concurrent_transactions": { "type": "boolean" }, "fee_margin_percentage": { "type": "number", "format": "float" }, "fee_payment_strategy": { "$ref": "#/components/schemas/StellarFeePaymentStrategy" }, "max_fee": { "type": "integer", "format": "int32", "minimum": 0 }, "min_balance": { "type": "integer", "format": "int64", "minimum": 0 }, "slippage_percentage": { "type": "number", "format": "float" }, "swap_config": { "$ref": "#/components/schemas/RelayerStellarSwapConfig" }, "timeout_seconds": { "type": "integer", "format": "int64", "minimum": 0 } }, "additionalProperties": false }, "StellarPrepareTransactionRequestParams": { "type": "object", "required": [ "fee_token" ], "properties": { "fee_token": { "type": "string", "description": "Asset identifier for fee token.\nFor classic: \"native\" or \"USDC:GA5Z...\" format.\nFor Soroban: contract address (C...) format." }, "operations": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/OperationSpec" }, "description": "Operations array to build transaction from\nMutually exclusive with transaction_xdr field" }, "source_account": { "type": [ "string", "null" ], "description": "Source account address (required when operations are provided)\nFor gasless transactions, this should be the user's account address" }, "transaction_xdr": { "type": [ "string", "null" ], "description": "Pre-built transaction XDR (base64 encoded, signed or unsigned)\nMutually exclusive with operations field.\nFor Soroban gas abstraction: pass XDR containing InvokeHostFunction operation." } }, "additionalProperties": false }, "StellarPrepareTransactionResult": { "type": "object", "required": [ "transaction", "fee_in_token", "fee_in_token_ui", "fee_in_stroops", "fee_token", "valid_until" ], "properties": { "fee_in_stroops": { "type": "string", "description": "Fee amount in stroops (as string)" }, "fee_in_token": { "type": "string", "description": "Fee amount in token (raw units as string)" }, "fee_in_token_ui": { "type": "string", "description": "Fee amount in token (decimal UI representation as string)" }, "fee_token": { "type": "string", "description": "Asset identifier for fee token" }, "max_fee_in_token": { "type": [ "string", "null" ], "description": "Maximum fee in token amount (raw units as string).\nOnly present for Soroban gas abstraction - includes slippage buffer." }, "max_fee_in_token_ui": { "type": [ "string", "null" ], "description": "Maximum fee in token amount (decimal UI representation as string).\nOnly present for Soroban gas abstraction - includes slippage buffer." }, "transaction": { "type": "string", "description": "Extended transaction XDR (base64 encoded)" }, "user_auth_entry": { "type": [ "string", "null" ], "description": "User authorization entry XDR (base64 encoded).\nPresent for Soroban gas abstraction - user must sign this auth entry." }, "valid_until": { "type": "string", "description": "Transaction validity timestamp (ISO 8601 format)" } } }, "StellarRpcRequest": { "oneOf": [ { "type": "object", "required": [ "method", "params" ], "properties": { "method": { "type": "string" }, "params": {} }, "example": "rawRpcRequest" } ] }, "StellarRpcResult": { "oneOf": [ { "description": "Raw JSON-RPC response value. Covers string or structured JSON values." } ] }, "StellarSwapStrategy": { "type": "string", "description": "Stellar swap strategy", "enum": [ "order-book", "soroswap" ] }, "StellarTokenKind": { "oneOf": [ { "type": "string", "enum": [ "native" ] }, { "type": "object", "required": [ "classic" ], "properties": { "classic": { "type": "object", "required": [ "code", "issuer" ], "properties": { "code": { "type": "string" }, "issuer": { "type": "string" } } } } }, { "type": "object", "required": [ "contract" ], "properties": { "contract": { "type": "object", "required": [ "contract_id" ], "properties": { "contract_id": { "type": "string" } } } } } ] }, "StellarTokenMetadata": { "type": "object", "required": [ "kind", "decimals", "canonical_asset_id" ], "properties": { "canonical_asset_id": { "type": "string" }, "decimals": { "type": "integer", "format": "int32", "minimum": 0 }, "kind": { "$ref": "#/components/schemas/StellarTokenKind" } }, "additionalProperties": false }, "StellarTransactionRequest": { "type": "object", "required": [ "network" ], "properties": { "fee_bump": { "type": [ "boolean", "null" ], "description": "Explicitly request fee-bump wrapper\nOnly valid when transaction_xdr contains a signed transaction" }, "max_fee": { "type": [ "integer", "null" ], "format": "int64", "description": "Maximum fee in stroops (defaults to 0.1 XLM = 1,000,000 stroops)" }, "memo": { "oneOf": [ { "type": "null" }, { "$ref": "#/components/schemas/MemoSpec" } ] }, "network": { "type": "string" }, "operations": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/OperationSpec" } }, "signed_auth_entry": { "type": [ "string", "null" ], "description": "Signed Soroban authorization entry (base64 encoded SorobanAuthorizationEntry XDR)\nUsed for Soroban gas abstraction: contains the user's signed auth entry from /build response.\nWhen provided, transaction_xdr must also be provided (the FeeForwarder transaction from /build).\nThe relayer will inject this signed auth entry into the transaction before submitting." }, "source_account": { "type": [ "string", "null" ] }, "transaction_xdr": { "type": [ "string", "null" ], "description": "Pre-built transaction XDR (base64 encoded, signed or unsigned)\nMutually exclusive with operations field.\nFor Soroban gas abstraction: submit the transaction XDR from sponsored/build response\nwith the user's signed auth entry updated inside." }, "valid_until": { "type": [ "string", "null" ] } } }, "StellarTransactionResponse": { "type": "object", "required": [ "id", "status", "created_at", "source_account", "fee", "sequence_number", "relayer_id" ], "properties": { "confirmed_at": { "type": "string" }, "created_at": { "type": "string" }, "fee": { "type": "integer", "format": "int32", "minimum": 0 }, "hash": { "type": "string" }, "id": { "type": "string" }, "relayer_id": { "type": "string" }, "sent_at": { "type": "string" }, "sequence_number": { "type": "integer", "format": "int64" }, "source_account": { "type": "string" }, "status": { "$ref": "#/components/schemas/TransactionStatus" }, "status_reason": { "type": [ "string", "null" ] }, "transaction_result_xdr": { "type": "string" } } }, "SystemHealth": { "type": "object", "description": "System health information (file descriptors, sockets).", "required": [ "status", "fd_count", "fd_limit", "fd_usage_percent", "close_wait_count" ], "properties": { "close_wait_count": { "type": "integer", "minimum": 0 }, "error": { "type": "string" }, "fd_count": { "type": "integer", "minimum": 0 }, "fd_limit": { "type": "integer", "minimum": 0 }, "fd_usage_percent": { "type": "integer", "format": "int32", "minimum": 0 }, "status": { "$ref": "#/components/schemas/ComponentStatus" } } }, "TransactionResponse": { "oneOf": [ { "$ref": "#/components/schemas/EvmTransactionResponse" }, { "$ref": "#/components/schemas/SolanaTransactionResponse" }, { "$ref": "#/components/schemas/StellarTransactionResponse" } ] }, "TransactionStatus": { "type": "string", "enum": [ "canceled", "pending", "sent", "submitted", "mined", "confirmed", "failed", "expired" ] }, "TransferTransactionRequestParams": { "type": "object", "required": [ "amount", "token", "source", "destination" ], "properties": { "amount": { "type": "integer", "format": "int64", "minimum": 0 }, "destination": { "type": "string" }, "source": { "type": "string" }, "token": { "type": "string" } }, "additionalProperties": false }, "TransferTransactionResult": { "type": "object", "required": [ "transaction", "fee_in_spl", "fee_in_lamports", "fee_token", "valid_until_blockheight" ], "properties": { "fee_in_lamports": { "type": "string" }, "fee_in_spl": { "type": "string" }, "fee_token": { "type": "string" }, "transaction": { "$ref": "#/components/schemas/EncodedSerializedTransaction" }, "valid_until_blockheight": { "type": "integer", "format": "int64", "minimum": 0 } } }, "TurnkeySignerRequestConfig": { "type": "object", "description": "Turnkey signer configuration for API requests", "required": [ "api_public_key", "api_private_key", "organization_id", "private_key_id", "public_key" ], "properties": { "api_private_key": { "type": "string" }, "api_public_key": { "type": "string" }, "organization_id": { "type": "string" }, "private_key_id": { "type": "string" }, "public_key": { "type": "string" } }, "additionalProperties": false }, "UpdateNetworkRequest": { "type": "object", "description": "Request structure for updating a network configuration.\nCurrently supports updating RPC URLs only. Can be extended to support other fields.", "properties": { "rpc_urls": { "type": "array", "items": { "$ref": "#/components/schemas/RpcUrlEntry" }, "description": "List of RPC endpoint configurations for connecting to the network.\nSupports multiple formats:\n- Array of strings: `[\"https://rpc.example.com\"]` (defaults to weight 100)\n- Array of RpcConfig objects: `[{\"url\": \"https://rpc.example.com\", \"weight\": 100}]`\n- Mixed array: `[\"https://rpc1.com\", {\"url\": \"https://rpc2.com\", \"weight\": 100}]`\n Must be non-empty and contain valid HTTP/HTTPS URLs if provided.", "example": [ { "url": "https://rpc.example.com", "weight": 100 } ] } }, "additionalProperties": false }, "UpdatePluginRequest": { "type": "object", "description": "Request model for updating an existing plugin.\nAll fields are optional to allow partial updates.\nNote: `id` and `path` are not updateable after creation.", "properties": { "allow_get_invocation": { "type": [ "boolean", "null" ], "description": "Whether to allow GET requests to invoke plugin logic" }, "config": { "type": [ "object", "null" ], "description": "User-defined configuration accessible to the plugin (must be a JSON object)\nUse `null` to clear the config", "additionalProperties": {}, "propertyNames": { "type": "string" } }, "emit_logs": { "type": [ "boolean", "null" ], "description": "Whether to include logs in the HTTP response" }, "emit_traces": { "type": [ "boolean", "null" ], "description": "Whether to include traces in the HTTP response" }, "forward_logs": { "type": [ "boolean", "null" ], "description": "Whether to forward plugin logs into the relayer's tracing output" }, "raw_response": { "type": [ "boolean", "null" ], "description": "Whether to return raw plugin response without ApiResponse wrapper" }, "timeout": { "type": [ "integer", "null" ], "format": "int64", "description": "Plugin timeout in seconds", "minimum": 0 } }, "additionalProperties": false }, "UpdateRelayerRequest": { "type": "object", "properties": { "custom_rpc_urls": { "type": [ "array", "null" ], "items": { "$ref": "#/components/schemas/RpcConfig" } }, "name": { "type": [ "string", "null" ] }, "notification_id": { "type": "string" }, "paused": { "type": "boolean" }, "policies": { "$ref": "#/components/schemas/CreateRelayerPolicyRequest", "description": "Raw policy JSON - will be validated against relayer's network type during application" } }, "additionalProperties": false }, "VaultSignerRequestConfig": { "type": "object", "description": "Vault signer configuration for API requests", "required": [ "address", "role_id", "secret_id", "key_name" ], "properties": { "address": { "type": "string" }, "key_name": { "type": "string" }, "mount_point": { "type": "string" }, "namespace": { "type": "string" }, "role_id": { "type": "string" }, "secret_id": { "type": "string" } }, "additionalProperties": false }, "VaultTransitSignerRequestConfig": { "type": "object", "description": "Vault Transit signer configuration for API requests", "required": [ "key_name", "address", "role_id", "secret_id", "pubkey" ], "properties": { "address": { "type": "string" }, "key_name": { "type": "string" }, "mount_point": { "type": "string" }, "namespace": { "type": "string" }, "pubkey": { "type": "string" }, "role_id": { "type": "string" }, "secret_id": { "type": "string" } }, "additionalProperties": false }, "WasmSource": { "oneOf": [ { "type": "object", "required": [ "hex" ], "properties": { "hex": { "type": "string" } } }, { "type": "object", "required": [ "base64" ], "properties": { "base64": { "type": "string" } } } ], "description": "Represents different ways to provide WASM code" } }, "securitySchemes": { "bearer_auth": { "type": "http", "scheme": "bearer" } } }, "tags": [ { "name": "Relayers", "description": "Relayers are the core components of the OpenZeppelin Relayer API. They are responsible for executing transactions on behalf of users and providing a secure and reliable way to interact with the blockchain." }, { "name": "Plugins", "description": "Plugins are TypeScript functions that can be used to extend the OpenZeppelin Relayer API functionality." }, { "name": "Notifications", "description": "Notifications are responsible for showing the notifications related to the relayers." }, { "name": "Signers", "description": "Signers are responsible for signing the transactions related to the relayers." }, { "name": "Networks", "description": "Networks represent blockchain network configurations including RPC endpoints and network-specific settings." }, { "name": "Metrics", "description": "Metrics are responsible for showing the metrics related to the relayers." }, { "name": "Health", "description": "Health is responsible for showing the health of the relayers." } ] }