{
  "$comment": "A2A 1.0 Agent Card with A2A 0.3 compatibility fields (url, preferredTransport, protocolVersion). JSON-RPC at https://listings.base.homes/a2a: send header A2A-Version: 1.0 with SendMessage / GetTask, or omit it for 0.3 message/send / tasks/get. Records as of 2026-10-08 (snapshot 2acf413ad5ec). Prototype: a person confirms every request; nothing is sent to leasing.",
  "capabilities": {
    "extendedAgentCard": false,
    "extensions": [
      {
        "description": "Access declaration aligned with PACT scoped permissions: read skills need no credentials; request skills need no credentials but only create a pending request that requires human confirmation via confirm_url.",
        "params": {
          "$comment": "PACT-aligned scope declaration. Personal Agent Consent & Trust Protocol (PACT), announced 2026-10-06 by Decagon, co-developed with Instinct; built on A2A 1.0 and OAuth 2.0; source https://github.com/openpactprotocol/openpactprotocol (docs/spec.md), checked 2026-10-08. PACT has a business list its own permission scopes on its Agent Card as scope id to description. This card follows that form, but it is not a PACT provider: see pact.differences.",
          "confirmation_rule": "Request skills return status pending_confirmation and a confirm_url. Nothing is sent until a person opens that page and confirms; in this prototype nothing is sent even after confirmation.",
          "documentation": "https://listings.base.homes/about/agents#a2a",
          "pact": {
            "announcement": "https://decagon.ai/blog/introducing-the-personal-agent-consent-trust-protocol-pact",
            "checked": "2026-10-08",
            "conformance": "aligned_not_conformant",
            "differences": [
              "PACT requires a personal-agent JWT (Authorization: Bearer) on every call; this prototype requires no credentials.",
              "PACT requires an HTTP+JSON interface; this prototype serves JSON-RPC only.",
              "PACT user delegation (OAuth device flow, X-A2A-User-Delegation) is not offered: no skill acts on a renter account."
            ],
            "name": "Personal Agent Consent & Trust Protocol (PACT)",
            "source": "https://github.com/openpactprotocol/openpactprotocol (docs/spec.md)"
          },
          "request_format": "Send one data part {\"skill\": \"<skill id>\", \"arguments\": {...}} (or set message.metadata.skill and put the arguments in a data part). Free text is not interpreted.",
          "scopes": {
            "rentals:read": "Read published rental records, quotes, eligibility pre-checks, location facts, operator performance, tour times, application steps and listing checks. Public: no credentials, nothing is created.",
            "requests:create_pending": "Create a pending tour request, question or application start. Public, but nothing is sent: the person must open the returned confirm_url and confirm. In this prototype nothing is sent even then."
          },
          "skills": {
            "ask_question": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "question",
                  "contact",
                  "sms_consent",
                  "idempotency_key"
                ],
                "required": [
                  "property_id",
                  "question",
                  "contact",
                  "sms_consent"
                ]
              },
              "authentication": "none",
              "confirmation": "requires human confirmation via confirm_url",
              "scope": "requests:create_pending"
            },
            "check_eligibility": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "unit_id",
                  "floorplan_id",
                  "monthly_gross_income_usd",
                  "uses_housing_choice_voucher",
                  "pets"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "get_application_link": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "unit_id",
                  "move_in_date"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "get_location_facts": {
              "arguments": {
                "accepted": [
                  "property_id"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "get_operator_performance": {
              "arguments": {
                "accepted": [
                  "property_id"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "get_property": {
              "arguments": {
                "accepted": [
                  "property_id"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "get_tour_availability": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "from_date",
                  "days"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "get_unit": {
              "arguments": {
                "accepted": [
                  "unit_id"
                ],
                "required": [
                  "unit_id"
                ]
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "quote_move_in_cost": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "unit_id",
                  "floorplan_id",
                  "lease_term_months",
                  "move_in_date",
                  "applicants",
                  "pets",
                  "parking",
                  "apply_specials",
                  "include_estimates"
                ],
                "required": []
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "request_tour": {
              "arguments": {
                "accepted": [
                  "slot_token",
                  "unit_id",
                  "contact",
                  "sms_consent",
                  "notes",
                  "idempotency_key"
                ],
                "required": [
                  "slot_token",
                  "contact",
                  "sms_consent"
                ]
              },
              "authentication": "none",
              "confirmation": "requires human confirmation via confirm_url",
              "scope": "requests:create_pending"
            },
            "search_units": {
              "arguments": {
                "accepted": [
                  "city",
                  "property",
                  "beds_min",
                  "beds_max",
                  "baths_min",
                  "max_total_monthly",
                  "max_base_rent",
                  "pets",
                  "accepts_vouchers",
                  "available_by",
                  "near",
                  "max_minutes",
                  "utilities_included",
                  "sort",
                  "limit",
                  "offset",
                  "include_unpriced"
                ],
                "required": []
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            },
            "start_application": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "unit_id",
                  "move_in_date",
                  "applicants",
                  "idempotency_key"
                ],
                "required": [
                  "property_id"
                ]
              },
              "authentication": "none",
              "confirmation": "requires human confirmation via confirm_url",
              "scope": "requests:create_pending"
            },
            "verify_listing": {
              "arguments": {
                "accepted": [
                  "property_id",
                  "claimed_rent",
                  "claimed_phone",
                  "claimed_url",
                  "claimed_special"
                ],
                "required": []
              },
              "authentication": "none",
              "confirmation": "none",
              "scope": "rentals:read"
            }
          }
        },
        "required": false,
        "uri": "https://listings.base.homes/a2a/extensions/access-scopes/v1"
      }
    ],
    "pushNotifications": false,
    "streaming": false
  },
  "defaultInputModes": [
    "application/json"
  ],
  "defaultOutputModes": [
    "application/json",
    "text/plain"
  ],
  "description": "Verified rental records for the 4 Texas apartment communities Base manages and leases: Ashton Park (Killeen), Highlander Apartments (Killeen), The Midway (Waco), Jupiter Place (Garland). Skills return availability, total monthly cost with required fees, move-in quotes, eligibility pre-checks, location facts, operator performance, tour times, application steps and listing checks, each with as-of dates and sources, identical to the MCP tools at https://listings.base.homes/mcp. Read skills need no credentials. Request skills only create a pending request that a person must confirm at the returned confirm_url. Send a data part {\"skill\": \"<skill id>\", \"arguments\": {...}}; free text is not interpreted.",
  "documentationUrl": "https://listings.base.homes/about/agents",
  "name": "Base Verified Rentals",
  "preferredTransport": "JSONRPC",
  "protocolVersion": "0.3.0",
  "provider": {
    "organization": "Base",
    "url": "https://base.homes"
  },
  "skills": [
    {
      "description": "Use this to find homes currently available at the 4 Texas apartment communities Base manages and leases, filtered by listing facts: bedrooms, total monthly cost (rent plus required fees), pets, Housing Choice Voucher acceptance, or drive or walk time to a named place. Returns rent and total monthly cost with as-of dates. Does not filter on anything about who the renter is. Read-only; needs no credentials. Send a data part {\"skill\": \"search_units\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"search_units\",\"arguments\":{\"city\":\"waco-tx\",\"beds_min\":2}} (2 bedroom homes in Waco)",
        "Data part: {\"skill\":\"search_units\",\"arguments\":{\"max_total_monthly\":1000}} (Homes under $1,000 a month including required fees)",
        "{\"skill\":\"search_units\",\"arguments\":{\"city\":\"waco-tx\",\"beds_min\":2}}"
      ],
      "id": "search_units",
      "inputModes": [
        "application/json"
      ],
      "name": "Search available homes",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "apartments",
        "search",
        "availability",
        "texas",
        "read-only"
      ]
    },
    {
      "description": "Use this to read the full published record for one community: address, contacts, floor plans, listed homes, fees with statuses, utilities, policies, screening facts, location anchors, operator performance and the answer sentences. Values marked held or not_stated are not quoted. Does not create or send anything. Read-only; needs no credentials. Send a data part {\"skill\": \"get_property\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"get_property\",\"arguments\":{\"property_id\":\"the-midway\"}} (Everything published about The Midway)",
        "{\"skill\":\"get_property\",\"arguments\":{\"property_id\":\"the-midway\"}}"
      ],
      "id": "get_property",
      "inputModes": [
        "application/json"
      ],
      "name": "Get community record",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "community",
        "record",
        "fees",
        "policies",
        "read-only"
      ]
    },
    {
      "description": "Use this to read one listed home (unit_id from search results): status with as-of date, size, rent, total monthly cost and its 12-month quote summary, plus its floor plan and the community contacts. Does not hold or reserve the home. Read-only; needs no credentials. Send a data part {\"skill\": \"get_unit\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"get_unit\",\"arguments\":{\"unit_id\":\"the-midway-u44\"}} (Details for home the-midway-u44)",
        "{\"skill\":\"get_unit\",\"arguments\":{\"unit_id\":\"the-midway-u44\"}}"
      ],
      "id": "get_unit",
      "inputModes": [
        "application/json"
      ],
      "name": "Get home record",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "home",
        "record",
        "availability",
        "read-only"
      ]
    },
    {
      "description": "Use this to compute a dated, line-item quote for a listed home or a floor plan: total monthly price (rent plus required fees), estimated all-in monthly cost, cash due at application and at move-in, with each line's status and source. Totals that depend on an unconfirmed fee are returned as not quoted with the blocking items. It is not an offer or a lease. Read-only; needs no credentials. Send a data part {\"skill\": \"quote_move_in_cost\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"quote_move_in_cost\",\"arguments\":{\"unit_id\":\"the-midway-u44\"}} (What would home the-midway-u44 cost per month and at move-in?)",
        "{\"skill\":\"quote_move_in_cost\",\"arguments\":{\"unit_id\":\"the-midway-u44\"}}"
      ],
      "id": "quote_move_in_cost",
      "inputModes": [
        "application/json"
      ],
      "name": "Quote total monthly and move-in cost",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "pricing",
        "quote",
        "move-in",
        "fees",
        "read-only"
      ]
    },
    {
      "description": "Use this to compare optional inputs (monthly gross income, voucher use, pets) with the community's stated requirements: income multiple, voucher policy, pet policy and the assistance-animal statement. Returns meets, does_not_meet or cannot_compute with reasons. It is a pre-check only, not an application decision, and income is never logged or stored. Read-only; needs no credentials. Send a data part {\"skill\": \"check_eligibility\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"check_eligibility\",\"arguments\":{\"property_id\":\"the-midway\",\"floorplan_id\":\"midway-a1-1x1\",\"monthly_gross_income_usd\":3000}} (Does $3,000 a month meet the income requirement for a 1 bedroom at The Midway?)",
        "{\"skill\":\"check_eligibility\",\"arguments\":{\"property_id\":\"the-midway\",\"floorplan_id\":\"midway-a1-1x1\",\"monthly_gross_income_usd\":3000}}"
      ],
      "id": "check_eligibility",
      "inputModes": [
        "application/json"
      ],
      "name": "Check stated requirements",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "eligibility",
        "income",
        "vouchers",
        "pets",
        "read-only"
      ]
    },
    {
      "description": "Use this to get measured routes from a community to named places (distance and free-flow minutes with method and attribution) and public area facts for its city (HUD rents, housing authority payment standards and utility allowances, BAH where relevant). Area facts are not property policies. Does not estimate traffic. Read-only; needs no credentials. Send a data part {\"skill\": \"get_location_facts\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"get_location_facts\",\"arguments\":{\"property_id\":\"jupiter-place\"}} (How far is Jupiter Place from transit?)",
        "{\"skill\":\"get_location_facts\",\"arguments\":{\"property_id\":\"jupiter-place\"}}"
      ],
      "id": "get_location_facts",
      "inputModes": [
        "application/json"
      ],
      "name": "Get commute and area facts",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "location",
        "commute",
        "area",
        "read-only"
      ]
    },
    {
      "description": "Use this to read Base's measured operating metrics for one community (leasing reply time, maintenance closed within 7 days, emergency response, application decision time), each with n, window, method and status, plus the publication rules. Metrics without enough data say so. Contains no resident or staff detail. Read-only; needs no credentials. Send a data part {\"skill\": \"get_operator_performance\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"get_operator_performance\",\"arguments\":{\"property_id\":\"ashton-park\"}} (How fast does Ashton Park answer leasing questions?)",
        "{\"skill\":\"get_operator_performance\",\"arguments\":{\"property_id\":\"ashton-park\"}}"
      ],
      "id": "get_operator_performance",
      "inputModes": [
        "application/json"
      ],
      "name": "Get operator performance",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "operator",
        "performance",
        "maintenance",
        "read-only"
      ]
    },
    {
      "description": "Use this to list in-person tour slots for a community within its stated tour hours, each with a slot_token for request_tour. Communities without stated tour hours return no slots and say how to arrange a tour. Slots are demo slots in this prototype; this does not book anything. Read-only; needs no credentials. Send a data part {\"skill\": \"get_tour_availability\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"get_tour_availability\",\"arguments\":{\"property_id\":\"ashton-park\",\"days\":3}} (Tour times at Ashton Park this week)",
        "{\"skill\":\"get_tour_availability\",\"arguments\":{\"property_id\":\"ashton-park\",\"days\":3}}"
      ],
      "id": "get_tour_availability",
      "inputModes": [
        "application/json"
      ],
      "name": "Get tour times",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "tours",
        "schedule",
        "read-only"
      ]
    },
    {
      "description": "Use this to get the application steps for a community: the stated selection criteria, fees due at application, the handoff page where a person starts an application, and what happens next. The hosted application link is shown only after the person reads the criteria and confirms. It does not submit an application, run screening or take payment. Read-only; needs no credentials. Send a data part {\"skill\": \"get_application_link\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"get_application_link\",\"arguments\":{\"property_id\":\"ashton-park\"}} (How do I apply at Ashton Park?)",
        "{\"skill\":\"get_application_link\",\"arguments\":{\"property_id\":\"ashton-park\"}}"
      ],
      "id": "get_application_link",
      "inputModes": [
        "application/json"
      ],
      "name": "Get application steps",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "application",
        "criteria",
        "read-only"
      ]
    },
    {
      "description": "Use this to check a rent, phone number, web address or special seen in a listing or message against Base's published record and official contacts. Returns consistent, mismatch or cannot_verify per field, with the official contacts and anti-scam advice. Unconfirmed community websites and numbers are reported as unconfirmed, not as official. Read-only; needs no credentials. Send a data part {\"skill\": \"verify_listing\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"verify_listing\",\"arguments\":{\"property_id\":\"the-midway\",\"claimed_phone\":\"2549990000\"}} (Is 254-999-0000 a real number for The Midway?)",
        "{\"skill\":\"verify_listing\",\"arguments\":{\"property_id\":\"the-midway\",\"claimed_phone\":\"2549990000\"}}"
      ],
      "id": "verify_listing",
      "inputModes": [
        "application/json"
      ],
      "name": "Check a listing against Base's record",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "verification",
        "anti-scam",
        "contacts",
        "read-only"
      ]
    },
    {
      "description": "Use this to create a tour request for a slot from get_tour_availability. It does not book anything by itself: it returns a confirm_url the person must open and confirm. SMS: when a phone is the only contact and sms_consent is true, the person must tick text consent there; with an email that tick is optional and replies go by email if unticked; sms_consent false means no texts (reply by email, or by phone call if no email). In this prototype nothing is sent to leasing. Needs no credentials, but only creates a pending request: a person must open the returned confirm_url and confirm. Send a data part {\"skill\": \"request_tour\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"request_tour\",\"arguments\":{\"slot_token\":\"<slot_token from get_tour_availability>\",\"contact\":{\"name\":\"Pat Example\",\"email\":\"pat@example.com\"},\"sms_consent\":false}} (Request the first tour slot at Ashton Park for Pat (pat@example.com))",
        "{\"skill\":\"request_tour\",\"arguments\":{\"slot_token\":\"<slot_token from get_tour_availability>\",\"contact\":{\"name\":\"Pat Example\",\"email\":\"pat@example.com\"},\"sms_consent\":false}}"
      ],
      "id": "request_tour",
      "inputModes": [
        "application/json"
      ],
      "name": "Request a tour (needs your confirmation)",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "tours",
        "request",
        "human-confirmation",
        "pending-confirmation"
      ]
    },
    {
      "description": "Use this to create a question for a community's leasing team. It does not send anything by itself: it returns a confirm_url the person must open and confirm. SMS: when a phone is the only contact and sms_consent is true, the person must tick text consent there; with an email that tick is optional and replies go by email if unticked; sms_consent false means no texts (reply by email, or by phone call if no email). In this prototype nothing is sent to leasing. Needs no credentials, but only creates a pending request: a person must open the returned confirm_url and confirm. Send a data part {\"skill\": \"ask_question\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"ask_question\",\"arguments\":{\"property_id\":\"the-midway\",\"question\":\"Is covered parking available?\",\"contact\":{\"name\":\"Pat Example\",\"email\":\"pat@example.com\"},\"sms_consent\":false}} (Ask The Midway whether covered parking is available)",
        "{\"skill\":\"ask_question\",\"arguments\":{\"property_id\":\"the-midway\",\"question\":\"Is covered parking available?\",\"contact\":{\"name\":\"Pat Example\",\"email\":\"pat@example.com\"},\"sms_consent\":false}}"
      ],
      "id": "ask_question",
      "inputModes": [
        "application/json"
      ],
      "name": "Send a question to leasing (needs your confirmation)",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "question",
        "request",
        "human-confirmation",
        "pending-confirmation"
      ]
    },
    {
      "description": "Use this to create a pending application start for a community. It does not apply, screen or take payment: the person opens the returned confirm_url, reads the selection criteria, confirms, and only then sees the hosted application link. In this prototype nothing is sent to leasing. Needs no credentials, but only creates a pending request: a person must open the returned confirm_url and confirm. Send a data part {\"skill\": \"start_application\", \"arguments\": {...}}.",
      "examples": [
        "Data part: {\"skill\":\"start_application\",\"arguments\":{\"property_id\":\"ashton-park\",\"applicants\":2}} (Start an application at Ashton Park for 2 applicants)",
        "{\"skill\":\"start_application\",\"arguments\":{\"property_id\":\"ashton-park\",\"applicants\":2}}"
      ],
      "id": "start_application",
      "inputModes": [
        "application/json"
      ],
      "name": "Start an application (criteria first; needs your confirmation)",
      "outputModes": [
        "application/json",
        "text/plain"
      ],
      "tags": [
        "rentals",
        "application",
        "request",
        "human-confirmation",
        "pending-confirmation"
      ]
    }
  ],
  "supportedInterfaces": [
    {
      "protocolBinding": "JSONRPC",
      "protocolVersion": "1.0",
      "url": "https://listings.base.homes/a2a"
    },
    {
      "protocolBinding": "JSONRPC",
      "protocolVersion": "0.3",
      "url": "https://listings.base.homes/a2a"
    }
  ],
  "url": "https://listings.base.homes/a2a",
  "version": "0.1.0+2acf413ad5ec"
}
