# Odile Direct: A2A Business Messaging & Booking

> Odile Direct: A2A Business Messaging & Booking is a paid API for AI agents from api.odilelabs.com, paid per call via x402, $0.1/call, status unknown (last checked 2026-10-31).

Send a structured message, booking request, or cancellation to an opted-in business via its A2A agent card using a business phone number as the identifier.

## Facts

- Endpoint: POST https://api.odilelabs.com/a2a/v1/x402/b/%7Bbiz%7D?utm_source=zero.xyz
- Price: $0.1/call
- Payment: x402
- Status: unknown
- Last checked: 2026-10-31
- Activations on Zero: 0
- Tags: x402
- Canonical page: https://www.zero.xyz/c/odile-direct-a2a-business-messaging-booking-2efa535c
- Structured record (JSON): https://api.zero.xyz/v1/capabilities/cap_ABKjL2M2GWAXHRkz8UVWY

Status and success rate cover calls made through Zero and Zero's own probes. Third-party monitors may report differently.

## How to call it through Zero

Zero handles the 402 payment challenge and records the run. With the Zero CLI installed (`npm i -g @zeroxyz/cli`):

```sh
zero fetch --capability odile-direct-a2a-business-messaging-booking-2efa535c -d '<json body>'
```

Example prompt: Please send a message to the dental office at +12125550123 from Sarah Johnson — tell them she needs to reschedule her cleaning and to call her back at +12125550199.

## When to prefer this

Use this endpoint when you need to contact a specific opted-in business by their phone number through a structured A2A protocol — ideal when leaving a message, booking an appointment, or cancelling a booking programmatically without human phone interaction. Prefer this over generic messaging when the business has an Odile Direct agent card and you need confirmed delivery or booking state returned to your agent.

## Known failure modes

- Business number not opted into Odile Direct — no agent card found
- Invalid or missing required fields (messageId, role, parts, skill)
- Skill not supported by the specific business's agent card
- Invalid booking slot — slot not returned by check_availability or already taken
- Invalid booking_id or cancel_token format for cancel_booking
- Payment failure — insufficient USDC balance for paid skills (take_message, book)
- Callback number not in valid E.164 format
- messageId collision if different tasks share the same ID

## How this service works

Resolve an opted-in business number, read its A2A agent card, and send a message or booking through Odile Direct.

## Output

Returns a JSON-RPC 2.0 response with a task object whose status.state field indicates the outcome (e.g. TASK_STATE_COMPLETED). On success, the task confirms delivery of the message or booking; booking responses may include a booking ID and cancel token for future use.

## Request schema (JSON Schema)

```json
{
 "type": "object",
 "properties": {
  "id": {
   "type": [
    "string",
    "integer"
   ]
  },
  "method": {
   "const": "SendMessage"
  },
  "params": {
   "type": "object",
   "required": [
    "message"
   ],
   "properties": {
    "message": {
     "type": "object",
     "required": [
      "messageId",
      "role",
      "parts"
     ],
     "properties": {
      "role": {
       "const": "ROLE_USER"
      },
      "parts": {
       "type": "array",
       "items": {
        "type": "object",
        "required": [
         "data"
        ],
        "properties": {
         "data": {
          "type": "object",
          "required": [
           "skill"
          ],
          "properties": {
           "need": {
            "type": "string",
            "maxLength": 500,
            "description": "What the caller needs, in a sentence or two"
           },
           "slot": {
            "type": "string",
            "description": "For book: a slot value returned by check_availability"
           },
           "skill": {
            "enum": [
             "take_message",
             "book",
             "book_first_available",
             "cancel_booking"
            ],
            "type": "string",
            "description": "take_message ($0.10 when delivered), book or book_first_available ($0.50 when confirmed); cancel_booking is always free, without payment. Use only skills the business card lists."
           },
           "reason": {
            "type": "string",
            "maxLength": 300,
            "description": "Optional cancellation reason."
           },
           "booking_id": {
            "type": "string",
            "pattern": "^[A-Za-z0-9_-]{5,200}$",
            "description": "For cancel_booking: the confirmed booking id."
           },
           "caller_name": {
            "type": "string",
            "maxLength": 100,
            "description": "Who the message is from or who the booking is for"
           },
           "cancel_token": {
            "type": "string",
            "pattern": "^[a-fA-F0-9]{1,200}$",
            "description": "For cancel_booking: the private token returned with the booking id."
           },
           "on_behalf_of": {
            "type": "string",
            "maxLength": 100,
            "description": "The person the agent acts for, when different from caller_name"
           },
           "callback_number": {
            "type": "string",
            "pattern": "^\\+[1-9]\\d{7,1
… (truncated)
```

## Response schema (JSON Schema)

```json
{
 "type": "json",
 "example": {
  "id": 1,
  "result": {
   "task": {
    "status": {
     "state": "TASK_STATE_COMPLETED"
    }
   }
  },
  "jsonrpc": "2.0"
 }
}
```

## More

- Live health (JSON, refreshed every minute): https://www.zero.xyz/c/odile-direct-a2a-business-messaging-booking-2efa535c/health.json
- [Zero catalog index](https://www.zero.xyz/llms.txt)
- [Other services from api.odilelabs.com](https://www.zero.xyz/host/api.odilelabs.com/llms.txt)
