# Listings and inquiries

Every listing on Acquestor came from the broker who represents it. The broker owns the listing and every inquiry about it, and Acquestor never contacts the seller.

## For brokers: getting a listing in

All routes end in a draft. A draft goes live only when the broker approves it on acquestor.com, where they review each field, see the source page behind each drafted figure, accept the Listing License and confirm their authority to list. Approval needs `ListAgentFullName`, `ListOfficeName` and `ListAgentStateLicense` (write "None required" where a state requires none); members see all three on each listing. Social Security, account and card numbers are removed from listing text on every route, and a figure of nine digits or more is refused as an identifier.

| Route | How | Notes |
| --- | --- | --- |
| Your own file | `POST /listing-imports` with `kind: file` and your teaser, CIM or financial summary | The draft cites a page for every figure. Free, up to 30 file drafts a month per broker |
| CSV | `POST /listing-imports` with `kind: csv` | Columns use the canonical field names; `GET /listing-imports/template.csv` has the template. The job reports errors by row |
| JSON | `POST /listings` with the fields | Starts as a draft |

Imports run as a job: poll `GET /listing-imports/{import_id}` for `status`, `draft_listing_ids`, `row_errors` and `flags`. A file that looks like a printout of a BizBuySell, BizQuest or LoopNet page is flagged `marketplace_printout_suspected`, and the broker must confirm the content is their own before approving the draft.

```sh
curl https://api.acquestor.com/v1/listing-imports \
  -H "Authorization: Bearer $ACQUESTOR_API_KEY" \
  -H "Idempotency-Key: $(uuidgen)" \
  -F kind=file -F file=@teaser.pdf
```

`GET /broker/listings` returns your org's listings in every status. `PATCH /listings/{listing_id}` edits one; an edit to price, financials or disclosure on a live listing sends it back for approval. `POST /listings/{listing_id}/withdraw` withdraws it.

In an AI host, `create_listing_draft` takes the file as base64 and returns the draft. Approval stays on acquestor.com.

### Listing fields

Listings use RESO Data Dictionary names where RESO has the field, and `X_`-prefixed US business fields where it doesn't: `ListPrice`, `GrossIncome` (annual revenue), `X_SellersDiscretionaryEarnings`, `X_NAICSCode`, `StateOrProvince`, `X_DisclosureLevel` (`teaser`, `financials` or `full`) and the rest in the [reference](/reference/rest). No field holds the seller's name or contact details.

### SBA ceiling cards on listings

A listing with SDE shows two SBA ceiling cards: one at the broker's salary and capex assumptions, and one at the BLS median manager salary for the area. Both appear on the listing. The `sba_financeable` search filter uses the second.

## A listing's history

`GET /listings/{listing_id}` (MCP: `get_listing`) returns `history`: every change to the listing's figures and status, oldest first. Each entry has `at`, the `event` (`drafted`, `updated`, `approved`, `withdrawn`, or `recorded` for the figures on file when history began), the `channel` it came through (`site`, `api`, `mcp`, `csv`, `file`, or `unknown` before history was kept), a `line` ready to show, and `changes`, where each number is a Figure that cites the broker's listing as of that entry's date.

```json
{
  "at": "2026-10-12T15:04:11.000Z",
  "event": "updated",
  "channel": "api",
  "line": "Oct 12, 2026: Updated through the API. Asking price $820,000 to $780,000.",
  "changes": [
    { "field": "ListPrice",
      "from": { "value": 820000, "unit": "USD", "source": "s1" },
      "to": { "value": 780000, "unit": "USD", "source": "s2" } }
  ]
}
```

Your own organization sees every entry, drafts included, and the file a draft was read from. Members see a listing from its first approval, and only the fields its disclosure level shows.

## For buyers: search and inquiries

`GET /listings` (MCP `search_listings`) searches member listings by `q`, `naics`, `state`, `price_min`, `price_max`, `sde_min` and `sba_financeable`. Results carry teaser fields; `GET /listings/{listing_id}` (MCP `get_listing`) returns what the broker's disclosure level allows, with both ceiling cards.

Listings are for signed-in members' own use. A developer key receives only its own org's listings.

Broker-written text, such as `PublicRemarks` and `X_Headline`, is third-party data. On the MCP server it is marked as such; see [conventions](/concepts/conventions#third-party-text).

### Inquiries

`POST /listings/{listing_id}/inquiries` (MCP `contact_listing_broker`) sends a message to the listing broker's org, and only to them.

```json
{"message": "Is the seller open to a 10% seller note on standby?", "share_profile": false}
```

- From acquestor.com, the inquiry is sent at once.
- From an API key or an AI client, it is saved as `pending_confirmation`. It goes to the broker only when the buyer confirms it on acquestor.com. The MCP tool's result gives the link.
- `share_profile` attaches a snapshot of the buyer's profile; it's off unless the buyer turns it on.
- A buyer can send 20 inquiries a day.

`GET /inquiries` returns a buyer's sent inquiries or a broker org's inbox.

## Closed-deal contributions

Contributions aren't open yet. Until their page on acquestor.com ships, this operation returns 422 `not_yet_supported` and saves nothing, and the MCP tool isn't listed. When they open:

`POST /comps/contributions` (MCP `contribute_closed_deal`) saves an anonymised closed deal as `pending_attestation`. It takes only the fields in the reference; any other field is refused with 422 `invalid_input`, so no name, note or commission can be stored. The broker attests on acquestor.com that they represented a party, that the record isn't copied from a licensed database, that sharing it is allowed, and that it names no person, business or street address. Comps open once enough deals are in.
