Every API here is available over the APIs.io API and to AI agents over MCP.
{
"openapi": "3.1.0",
"info": {
"title": "V2X App API",
"description": "API for Vehicle-to-Everything (V2X) Multi-Access Edge Computing (MEC) services. This App API provides endpoints for ETX registration, V2X Message Deposit, and authentication services.",
"version": "1.0.0"
},
"servers": [
{
"url": "http://localhost:8080",
"description": "Generated server url"
}
],
"security": [
{
"BearerAuth": []
}
],
"tags": [
{
"name": "Path Management",
"description": "Path management endpoints for GeoJSON-like path data"
},
{
"name": "Registration",
"description": "ETX client registration endpoints for the MQTT Broker"
},
{
"name": "Geofence Expiration",
"description": "Geofence expiration management endpoints"
},
{
"name": "Secret Management",
"description": "Secret configuration endpoints"
},
{
"name": "Authentication",
"description": "Authentication and authorization for Registration and Configuration endpoints"
},
{
"name": "TIM Configuration",
"description": "TIM ITIS phrases and metadata configuration endpoints"
},
{
"name": "Registration",
"description": "ETX client registration and connection management endpoints"
},
{
"name": "Vendor Limits Management",
"description": "Endpoints for managing vendor-wide registration limits"
},
{
"name": "Authentication",
"description": "Authentication and authorization for Registration and Deposit endpoints"
},
{
"name": "User Limits Management",
"description": "Endpoints for managing user registration limits"
},
{
"name": "Deposit",
"description": "V2X Message Deposit endpoints for deployment to the ETX MQTT Broker"
},
{
"name": "Geofence Deployments",
"description": "Geofence deployment management endpoints"
}
],
"paths": {
"/prd/v2/registration": {
"get": {
"tags": [
"Registration"
],
"summary": "Check registration status",
"description": "Checks the registration status of a device by its device ID against the ETX API",
"operationId": "checkRegistration",
"parameters": [
{
"name": "DeviceID",
"in": "query",
"description": "Device ID to check registration status for",
"required": true,
"schema": {
"type": "string"
},
"example": "f7306888-94c9-478b-a076-bba9378563a9"
}
],
"responses": {
"200": {
"description": "Registration status retrieved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegistrationResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid device ID",
"content": {
"*/*": {
"schema": {
"$ref": "#/components/schemas/RegistrationCheckResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"*/*": {
"schema": {
"$ref": "#/components/schemas/RegistrationCheckResponse"
}
}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"*/*": {
"schema": {
"$ref": "#/components/schemas/RegistrationCheckResponse"
}
}
}
},
"404": {
"description": "Not found - device not registered",
"content": {
"*/*": {
"schema": {
"$ref": "#/components/schemas/RegistrationCheckResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"*/*": {
"schema": {
"$ref": "#/components/schemas/RegistrationCheckResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"put": {
"tags": [
"Registration"
],
"summary": "Update ETX client registration",
"description": "Updates an existing ETX client registration. This endpoint supports retry logic for handling pending registration updates. The client must provide a valid device ID for successful registration update.",
"operationId": "putRegistration",
"parameters": [
{
"name": "retry",
"in": "query",
"description": "Enable retry logic for pending registration updates",
"required": false,
"schema": {
"type": "boolean",
"default": true
},
"example": true
},
{
"name": "num_retries",
"in": "query",
"description": "Number of retry attempts for pending updates",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"default": 5
},
"example": 5
},
{
"name": "num_sec_to_sleep",
"in": "query",
"description": "Seconds to sleep between retry attempts",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"default": 15
},
"example": 15
}
],
"requestBody": {
"description": "Client registration update information",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegistrationPutRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Registration update successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegistrationResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid update data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"404": {
"description": "Not found - device not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"post": {
"tags": [
"Registration"
],
"summary": "Register ETX client",
"description": "Registers a new ETX client with the system. This endpoint supports retry logic for handling pending registrations. The client must provide valid client type and subtype information for successful registration.",
"operationId": "postRegistration",
"parameters": [
{
"name": "retry",
"in": "query",
"description": "Enable retry logic for pending registrations",
"required": false,
"schema": {
"type": "boolean",
"default": true
},
"example": true
},
{
"name": "num_retries",
"in": "query",
"description": "Number of retry attempts for pending registrations",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"default": 5
},
"example": 5
},
{
"name": "num_sec_to_sleep",
"in": "query",
"description": "Seconds to sleep between retry attempts",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"default": 15
},
"example": 15
}
],
"requestBody": {
"description": "Client registration information",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegistrationPostRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Registration successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegistrationResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid registration data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
}
},
"/prd/v2/configurations/geofence": {
"get": {
"tags": [
"configuration-rest-controller"
],
"summary": "Get geofence by ID",
"description": "Retrieves detailed information for a specific geofence by its ID. This endpoint returns the complete geofence configuration including geometry, properties, and metadata.",
"operationId": "getGeofence",
"parameters": [
{
"name": "id",
"in": "query",
"description": "Unique identifier of the geofence",
"required": true,
"schema": {
"type": "string"
},
"example": "geofence-001"
}
],
"responses": {
"200": {
"description": "Geofence details retrieved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ConfigurationGeofenceResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid geofence ID",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"404": {
"description": "Not found - geofence not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"put": {
"tags": [
"configuration-rest-controller"
],
"summary": "Update existing geofence",
"description": "Updates an existing geofence with new configuration. All fields in the request will replace the existing geofence configuration.",
"operationId": "updateGeofence",
"parameters": [
{
"name": "id",
"in": "query",
"description": "Unique identifier of the geofence to update",
"required": true,
"schema": {
"type": "string"
},
"example": "geofence-001"
}
],
"requestBody": {
"description": "Updated geofence configuration",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ConfigurationGeofence"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Geofence updated successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ConfigurationGeofenceResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid geofence configuration",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"404": {
"description": "Not found - geofence not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"post": {
"tags": [
"configuration-rest-controller"
],
"summary": "Create new geofence",
"description": "Creates a new geofence with the specified configuration. The geofence can be used for V2X traffic management and safety applications.",
"operationId": "createGeofence",
"requestBody": {
"description": "Geofence configuration to create",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ConfigurationGeofence"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Geofence created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ConfigurationGeofenceResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid geofence configuration",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"delete": {
"tags": [
"configuration-rest-controller"
],
"summary": "Delete geofence",
"description": "Deletes a geofence from the system. This operation is irreversible and will remove all associated configuration and data.",
"operationId": "deleteGeofence",
"parameters": [
{
"name": "id",
"in": "query",
"description": "Unique identifier of the geofence to delete",
"required": true,
"schema": {
"type": "string"
},
"example": "geofence-001"
}
],
"responses": {
"200": {
"description": "Geofence deleted successfully"
},
"400": {
"description": "Bad request - invalid geofence ID",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"404": {
"description": "Not found - geofence not found",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
}
},
"/prd/v2/registration-connection": {
"post": {
"tags": [
"Registration"
],
"summary": "Register and connect ETX client",
"description": "Performs both client registration and connection establishment in a single operation. This endpoint first registers the client with the system, then establishes a connection using the returned device ID. This is a convenience endpoint that combines the functionality of both registration and connection endpoints.",
"operationId": "postRegistrationConnection",
"parameters": [
{
"name": "num_retries",
"in": "query",
"description": "Number of retry attempts for pending registrations",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"default": 5
},
"example": 5
},
{
"name": "num_sec_to_sleep",
"in": "query",
"description": "Seconds to sleep between retry attempts",
"required": false,
"schema": {
"type": "integer",
"format": "int32",
"default": 15
},
"example": 15
}
],
"requestBody": {
"description": "Combined registration and connection information",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/RegistrationConnectionPostRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Registration and connection successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/CompleteResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid registration or connection data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"500": {
"description": "Internal server error - registration or connection failed",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"deprecated": true,
"security": [
{
"BearerAuth": []
}
]
}
},
"/prd/v2/paths": {
"get": {
"tags": [
"Path Management"
],
"summary": "Get all paths",
"description": "Retrieves all active paths in GeoJSON-like format. This endpoint returns a collection of paths with their coordinates, timestamps, and metadata.",
"operationId": "getAllPaths",
"responses": {
"200": {
"description": "Paths retrieved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PathsResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"post": {
"tags": [
"Path Management"
],
"summary": "Create or update path",
"description": "Creates a new path with GeoJSON-like structure, or updates an existing path if one with the same name already exists. Only administrators can create/update paths.",
"operationId": "createPath",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PathRequest"
}
}
},
"required": true
},
"responses": {
"201": {
"description": "Path created successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PathResponse"
}
}
}
},
"200": {
"description": "Path updated successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/PathResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid path data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
}
},
"/prd/v2/deposit/geofence": {
"post": {
"tags": [
"Deposit"
],
"summary": "Deposit V2X Message",
"description": "Deposits V2X message data to the database. This endpoint is used to deploy V2X messages (TIM, MAP, etc.) with geospatial information. The configuration must include geofence overrides to define the deployment area. Vendor ID is automatically determined from the user\u0027s JWT token based on their role.",
"operationId": "deposit",
"requestBody": {
"description": "Configuration data to deposit",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/DepositRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "V2X message deployed successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/GeofenceDeploymentResponse"
}
}
}
},
"400": {
"description": "Bad request - invalid configuration data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"409": {
"description": "Conflict - no available geohash or conflicting state",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"413": {
"description": "Payload too large - exceeds maximum allowed geohashes",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"422": {
"description": "Unprocessable entity - invalid ASN.1 data",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
},
"delete": {
"tags": [
"Deposit"
],
"summary": "Delete geofence by identifier",
"description": "Deletes geofence deployments associated with a specific identifier. This endpoint allows for manual removal of geofence deployments by their identifier. The system will deactivate the geofence deployment by setting is_active to false. This follows REST best practices by using query parameters for resource identification.",
"operationId": "deleteGeofence_1",
"parameters": [
{
"name": "identifier",
"in": "query",
"description": "Geofence identifier to delete",
"required": true,
"schema": {
"type": "string"
},
"example": "GEOFENCE_12345"
}
],
"responses": {
"204": {
"description": "Geofence deleted successfully",
"content": {
"*/*": {
"schema": {
"type": "object"
}
}
}
},
"400": {
"description": "Bad request - invalid identifier",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"401": {
"description": "Unauthorized - invalid or missing authentication",
"content": {
"application/json": {}
}
},
"403": {
"description": "Forbidden - insufficient permissions",
"content": {
"application/json": {}
}
},
"404": {
"description": "Not found - no geofence found with the specified identifier",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"BearerAuth": []
}
]
}
},
"/prd/v2/deposit/geofence/expiration/cleanup": {
"post": {
"tags": [
"Geofence Expiration"
],
"summary": "Manually trigger Geofence expiration cleanup",
"description": "Manually triggers the cleanup process to deactivate expired Geofence deployments. This endpoint is useful for testing and immediate cleanup without waiting for the scheduled task.",
"operationId": "triggerCleanup",
"responses": {
"200": {
"description": "Cleanup completed successfully",
"content": {
"*/*": {
"schema": {
"type": "object",
"additionalProperties": {}
}
}
}
},
"401": {
"descr
# --- truncated at 32 KB (115 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/federal-highway-administration/refs/heads/main/openapi/federal-highway-administration-v2x-app-api-openapi.json