T
TOMO
Developer Docs
BETA These docs are under partner review. Some features described are roadmap items, not yet shipped. Verify against your sandbox before relying on any contract.

TOMO Manifest Reference — Every Field Documented

Audience: every TOMO partner. The manifest is your declaration of intent coverage. It tells TOMO which intents you serve, where, at what price, and at what self-rated quality on TTBS.

The manifest is also TOMO's source of truth for routing decisions. A manifest entry is the contract that gets you traffic.

Source code (TOMO server side): server/routes/businessTier1.ts POST /manifest/:uid + server/services/businessFirestore.ts writeServiceManifest().

Authoring UI: https://www.automobnxt.com/?dev=tier1-manifest → guided form with live YAML preview.


1. Manifest top-level structure

manifest_version: "v0.1.0"

business:
  name:        "Booking.com"
  legal_name:  "Booking.com B.V."
  tier:         tier1                # tier1 (API) or tier2 (phone — generated automatically by Tier 2 wrapper)
  partner_id:   <issued by TOMO at signup>

intents:
  - intent:           travel.book_hotel
    intent_version:    v1.0.0
    domain:            travel
    description:      "Hotels, homestays, resorts, service apartments worldwide"
    pricing:
      min:      500
      max:      50000
      currency: INR
    service_area:        ["Bangalore", "Hyderabad", "Mumbai", "Delhi", "Chennai", "Goa", "Pune"]
    ttbs_signals:
      time:    0.6
      taste:   0.8
      budget:  0.5
      safety:  0.7
    availability:        "24x7"
    completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/booking_com_partner"
    widget_type:          travel_listing_results

  - intent:    food.order_delivery
    # ... another entry

2. manifest_version

Type: string, semver. REQUIRED.

The version of THIS manifest schema, not the spec. Currently v0.1.0. TOMO will inform you of schema upgrades 30 days in advance with migration instructions.


3. business block

business:
  name:        string, REQUIRED        # display name shown in chat: "Booking.com"
  legal_name:  string, REQUIRED        # registered legal entity: "Booking.com B.V."
  tier:        STRICT ENUM, REQUIRED   # tier1 | tier2
  partner_id:  string, REQUIRED        # issued by TOMO at signup; do not change

tier1 = API path (engineering team integration). tier2 = phone signup (small business — manifest auto-generated by TOMO's Tier 2 wrapper from the storefront fields).

Most partners reading this doc are tier1. tier2 partners typically don't write manifests by hand — TOMO generates one for them from their storefront/menu/listings.


4. intents[] — the heart of the manifest

Each entry declares one intent you serve. Multiple entries allowed (you can serve travel.book_hotel AND travel.book_flight). Limit: 50 entries per manifest.

Required fields per entry

Field Type Constraint Notes
intent string REQUIRED, full ID exact match from _INTENT_CATALOG.md
intent_version semver REQUIRED spec version your tools implement
domain enum REQUIRED derived from intent's namespace
description string REQUIRED, ≤200 chars partner-facing description shown in admin review
pricing object REQUIRED floor + ceiling per closed intent
service_area array REQUIRED, ≥1 cities or pincodes
ttbs_signals object REQUIRED self-rated quality across 4 axes
availability string REQUIRED hours of operation in human-readable format
completion_callback URL REQUIRED TOMO's CPC webhook URL
widget_type string REQUIRED matches the intent's §9 widget_type

5. pricing block

pricing:
  min:      500       # INR_INTEGER, REQUIRED — typical floor for a single closed intent
  max:      50000     # INR_INTEGER, REQUIRED — typical ceiling
  currency: INR       # REQUIRED, always INR for v1

This drives TTBS budget scoring. If the user has budget_band: ok and your min is too high, you may not appear. If they have budget_band: great and your max is too low, you may appear with the "ok" cohort but not the "great" cohort.

Be honest. Setting min: 1 to game the budget filter gets you flagged in TOMO's 1% audit, then suspended. Set ranges that reflect your real distribution.


6. service_area

service_area: ["Bangalore", "Hyderabad", "Mumbai"]
# or with pincodes:
service_area: ["560001", "500081", "400001"]
# or mixed:
service_area: ["Bangalore", "560001", "Hyderabad", "500081"]

REQUIRED, ≥1 entry. Strings are city names (canonical Indian English) or 6-digit pincodes.

For pan-India partners (e.g., DHL, Razorpay), use ["IN_ALL"] — but you'll be asked to verify nation-wide coverage during sandbox-to-prod review.

For hyper-local partners (single restaurant, single salon), pincode-only is fine and you'll only get traffic from that pincode.


7. ttbs_signals — your self-rating

ttbs_signals:
  time:    0.6
  taste:   0.8
  budget:  0.5
  safety:  0.7

Four floats, each 0.0-1.0. They tell TOMO how YOU position yourself on each axis. The orchestrator uses this as a signal alongside live performance (latency, ratings, etc.).

Axis Meaning High value (0.8-1.0) Low value (0.0-0.3)
time how fast you fulfill <30 min average >2 hours average
taste quality / curation premium curation broad, no curation
budget value-for-money positioning budget-friendly premium-priced
safety trust + verification depth full KYC + audits minimal verification

Self-rating is verifiable. TOMO compares your declared signals against actual delivery metrics. Inflate any signal materially → suspension.

Example honest declarations:

# Booking.com (broad, premium-positioned, slow-confirm)
ttbs_signals: { time: 0.4, taste: 0.85, budget: 0.5, safety: 0.8 }

# OYO (volume, budget-positioned, fast-confirm)
ttbs_signals: { time: 0.7, taste: 0.4, budget: 0.85, safety: 0.5 }

# Boutique homestay platform (slow, premium, expensive, very safe)
ttbs_signals: { time: 0.3, taste: 0.95, budget: 0.2, safety: 0.95 }

8. availability

availability: "24x7"
# or:
availability: "Mon-Sat 08:00-22:00 IST"
# or:
availability: "Mon-Fri 09:00-18:00 IST; Sat 10:00-14:00 IST; Sun closed"

REQUIRED. Free-text accepted but partner-side audit checks it against actual response patterns. If you say 24x7 but never respond between 02:00-06:00, TOMO will flag and downgrade you to your declared real hours.


9. completion_callback

completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/booking_com_partner"

REQUIRED. Always points to TOMO's CPC webhook, not your endpoint. You don't receive callbacks here — you POST to here when an intent closes.

The pattern is fixed: /api/v1/cpc/mcp_provider/<your_partner_id>. Your <partner_id> is shown in your Tier 1 dashboard at signup.


10. widget_type

widget_type: travel_listing_results

REQUIRED. Must match exactly the widget_type declared in your intent's §9. If you serve travel.book_hotel, your widget_type is travel_listing_results.

You don't get to choose. The widget is locked per intent so users see consistent rendering across providers.


11. Optional fields (per-intent, declared in TOMO's spec but not in the manifest)

These are NOT in the manifest — they're declared in your tool's MCP _meta.tomo block instead, OR fixed by the intent spec:

  • tool_role — declared in MCP _meta.tomo
  • pricing_band — declared in MCP _meta.tomo
  • TTBS signal weighting — locked by domain in domain-agent-map.ts
  • Caching policy — fixed by intent §9
  • Anti-fabrication rules — fixed by intent §12

Don't try to override these. They're spec-level constants.


12. Validation rules at submit

When you click "Submit for review" on the manifest editor, TOMO runs:

[ ] manifest_version is current
[ ] business.tier matches your account tier (tier1 partner submits tier1 manifest)
[ ] business.partner_id matches your account
[ ] business.legal_name format reasonable (not "test" or "asdf")
[ ] At least 1 intent declared, max 50
[ ] Every intent.intent exists in _INTENT_CATALOG.md
[ ] Every intent_version matches a live spec version
[ ] Every domain matches the intent's namespace
[ ] Every pricing.min ≥ 0, pricing.max ≥ pricing.min
[ ] Every service_area entry is a known city or valid 6-digit pincode
[ ] Every ttbs_signal is 0.0-1.0
[ ] Every availability parses (or is "24x7")
[ ] Every completion_callback follows the exact pattern
[ ] Every widget_type matches the intent's §9 widget_type

Failure → editor shows inline error. Pass → status flips to pending_review. Admin reviews within 24-72h.


13. After approval

Status flips pending_reviewlive. TOMO's orchestrator now includes your tools in the candidate pool for matching intents. You start receiving traffic.

You can update your manifest at any time. Updates flow:

1. You edit + submit  → status: pending_review
2. Admin reviews      → status: live (approved) | rejected (with notes)
3. While pending:     → old approved version stays live (no traffic disruption)

Material changes (adding new intents, expanding service_area beyond a state, dropping intents) require admin re-review. Cosmetic changes (description text, ttbs signal tweaks within ±0.1) auto-approve.


14. The complete YAML for one common case

A boutique hotel chain serving travel.book_hotel only, in 5 cities:

manifest_version: "v0.1.0"

business:
  name:        "Mahima Resorts"
  legal_name:  "Mahima Hospitality Pvt. Ltd."
  tier:         tier1
  partner_id:   tomo_sandbox_a1b2c3d4e5f6

intents:
  - intent:    travel.book_hotel
    intent_version: v1.0.0
    domain:     travel
    description: "Boutique resorts in South India tourist destinations"
    pricing:
      min:      3500
      max:      18000
      currency: INR
    service_area: ["Coorg", "Munnar", "Ooty", "Chikmagalur", "Wayanad"]
    ttbs_signals:
      time:    0.4
      taste:   0.9
      budget:  0.3
      safety:  0.85
    availability: "24x7"
    completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/tomo_sandbox_a1b2c3d4e5f6"
    widget_type:  travel_listing_results

15. The complete YAML for a multi-intent partner

A delivery aggregator serving food and groceries:

manifest_version: "v0.1.0"

business:
  name:        "Swiggy"
  legal_name:  "Bundl Technologies Pvt. Ltd."
  tier:         tier1
  partner_id:   swiggy_partner

intents:
  - intent:    food.order_delivery
    intent_version: v1.0.0
    domain:     food
    description: "Restaurant-to-doorstep food delivery, 30-50 min"
    pricing:
      min:      120
      max:      4000
      currency: INR
    service_area: ["IN_ALL"]
    ttbs_signals:
      time:    0.85
      taste:   0.65
      budget:  0.55
      safety:  0.7
    availability: "24x7"
    completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/swiggy_partner"
    widget_type:  food_menu_results

  - intent:    food.book_dine_in
    intent_version: v1.0.0
    domain:     food
    description: "Dine-in reservations via Swiggy Dineout (former Dineout)"
    pricing:
      min:      400
      max:      8000
      currency: INR
    service_area: ["Bangalore", "Hyderabad", "Mumbai", "Delhi", "Chennai", "Pune", "Kolkata"]
    ttbs_signals:
      time:    0.5
      taste:   0.7
      budget:  0.55
      safety:  0.7
    availability: "24x7"
    completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/swiggy_partner"
    widget_type:  food_dine_in_results

  - intent:    grocery.order_delivery
    intent_version: v1.0.0
    domain:     grocery
    description: "Instamart grocery — 10-30 min delivery"
    pricing:
      min:      80
      max:      3000
      currency: INR
    service_area: ["Bangalore", "Hyderabad", "Mumbai", "Delhi", "Pune", "Chennai", "Kolkata"]
    ttbs_signals:
      time:    0.95
      taste:   0.5
      budget:  0.65
      safety:  0.65
    availability: "24x7"
    completion_callback: "https://www.automobnxt.com/api/v1/cpc/mcp_provider/swiggy_partner"
    widget_type:  grocery_results

16. Common mistakes

intent ID typo

e.g., travel.book_hotels (plural) doesn't exist; only travel.book_hotel (singular). TOMO returns INVALID_INTENT.

intent_version higher than live spec

You can't serve a future spec version. Pin to the latest live version (currently v1.0.0 for all intents).

domain mismatch

If your intent is food.order_delivery, domain is food, not restaurant or delivery.

service_area with "Bengaluru" vs "Bangalore"

TOMO uses canonical English city names. Bangalore, Mumbai, Calcutta (still accepted alongside Kolkata), etc. Run your manifest through the editor's autocomplete to get the canonical form.

TTBS signals at 1.0 across all axes

Self-inflation. TOMO's audit will detect that you don't actually deliver in <30 min, your reviews aren't 4.9, your prices aren't always lowest, etc. Be honest — being 0.6 on time and 0.9 on taste is more useful than being 1.0 on everything.

widget_type not matching intent

You declared travel_listing_results for food.order_delivery. The intent spec mandates food_menu_results. Editor catches this; don't fight it.


17. Programmatic manifest submission

If you want to script manifest updates (CI/CD, multi-environment), use the API directly:

curl -X POST https://www.automobnxt.com/api/v1/business/tier1/manifest/<your_uid> \
  -H "Authorization: Bearer <your_jwt>" \
  -H "Content-Type: application/json" \
  -d '{
    "businessName":   "Booking.com",
    "intents": [
      {
        "intent":           "travel.book_hotel",
        "domain":           "travel",
        "description":      "Hotels worldwide",
        "pricing":          { "min": 500, "max": 50000, "currency": "INR" },
        "service_area":     ["Bangalore", "Hyderabad", "Mumbai"],
        "ttbs_signals":     { "time": 0.6, "taste": 0.8, "budget": 0.5, "safety": 0.7 },
        "availability":     "24x7",
        "completion_callback": "https://www.automobnxt.com/api/v1/cpc/mcp_provider/booking_com_partner",
        "widget_type":       "travel_listing_results"
      }
    ],
    "submitForReview": true
  }'

18. References


Built by AUTOMOBNXT · DPIIT Recognised Startup · 2026.