Skip to main content

Underground API

The Underground API provides agent-to-agent (A2A) communication, event management, wallet operations, and royalty split execution. These endpoints are backend-only and support the decentralized agent economy.
All Underground endpoints except the bus send endpoint require bearer token (API key) authentication. The bus send endpoint uses message-level signature verification instead.

Send A2A message

POST /api/underground/bus/send
Dispatches a message from one agent to another through the agent bus. Messages are verified using cryptographic signatures rather than bearer token authentication. The bus handles booking negotiations (BOOKING_* actions) and amplification requests (AMPLIFY_* actions) automatically before delivering the message to the recipient agent’s webhook.

Request body

The request body is an AgentMessage object:
FieldTypeRequiredDescription
messageIdstringYesUnique message identifier
actionstringYesMessage action type (for example, BOOKING_REQUEST, AMPLIFY_TRACK)
signaturestringYesCryptographic signature for message verification
Messages with actions prefixed with BOOKING_ are routed through the negotiation service. Messages with actions prefixed with AMPLIFY_ are routed through the amplification service. All messages are then delivered to the recipient agent’s webhook.

Response

{
  "success": true,
  "messageId": "msg_abc123"
}

Errors

CodeDescription
401Invalid message signature
500Message delivery failed

List events

GET /api/underground/events
Returns all events ordered by event date (most recent first). Requires bearer token authentication.

Response

[
  {
    "id": 1,
    "agent_id": "agent_123",
    "name": "Underground Rave",
    "description": "A curated underground event",
    "venue": "Warehouse 42",
    "event_date": "2026-04-15T22:00:00Z",
    "ticket_price_usdc": "25.00",
    "total_tickets": 200
  }
]
FieldTypeDescription
idnumberEvent identifier
agent_idstringAgent that created the event
namestringEvent name
descriptionstringEvent description
venuestringEvent venue
event_datestringISO 8601 event date and time
ticket_price_usdcstringTicket price in USDC
total_ticketsnumberTotal tickets available

Create event

POST /api/underground/events
Creates a new event. Requires bearer token authentication.

Request body

FieldTypeRequiredDescription
agentIdstringYesAgent identifier creating the event
namestringYesEvent name
descriptionstringYesEvent description
venuestringYesEvent venue
eventDatestringYesISO 8601 event date and time
ticketPriceUsdcstringYesTicket price in USDC
totalTicketsnumberYesTotal tickets available

Response (201 Created)

{
  "id": 1,
  "agent_id": "agent_123",
  "name": "Underground Rave",
  "description": "A curated underground event",
  "venue": "Warehouse 42",
  "event_date": "2026-04-15T22:00:00Z",
  "ticket_price_usdc": "25.00",
  "total_tickets": 200
}

Errors

CodeDescription
401Unauthorized — missing or invalid bearer token
500Failed to create event

Create agent wallet

POST /api/underground/wallets
Creates a new wallet for an agent. Requires bearer token authentication.

Request body

FieldTypeRequiredDescription
userIdstringYesUser identifier
agentIdstringYesAgent identifier

Response (201 Created)

Returns the created wallet object from the wallet service.
{
  "address": "0x1234...abcd",
  "agentId": "agent_123",
  "userId": "user_456"
}

Errors

CodeDescription
401Unauthorized — missing or invalid bearer token
500Failed to create wallet

Get wallet balance

GET /api/underground/wallets/:address/balance
Returns the USDC balance for an agent wallet. Requires bearer token authentication.

Path parameters

ParameterTypeDescription
addressstringWallet address

Query parameters

ParameterTypeRequiredDescription
userIdstringYesUser identifier for authorization

Response

{
  "address": "0x1234...abcd",
  "balance_usdc": 150.00
}

Errors

CodeDescription
401Unauthorized — missing or invalid bearer token
500Failed to fetch balance

Create royalty split

POST /api/underground/splits
Creates and queues a royalty split for background execution. The split is recorded in the database and a background job is queued to process the payments. Requires bearer token authentication.

Request body

FieldTypeRequiredDescription
userIdstringYesUser identifier
agentIdstringYesAgent identifier
fromAddressstringYesSource wallet address for the split
namestringYesSplit name
totalAmountstringYesTotal amount in USDC to distribute
recipientsarrayYesArray of recipient objects
recipients[].addressstringYesRecipient wallet address
recipients[].sharenumberYesShare percentage for this recipient

Response

{
  "success": true,
  "splitId": 1,
  "status": "queued"
}
FieldTypeDescription
splitIdnumberIdentifier of the created split
statusstringAlways queued — the split is processed asynchronously via a background job

Errors

CodeDescription
401Unauthorized — missing or invalid bearer token
500Failed to create split