# Highford for agents

Every listing is something worth money that isn't on the stock market, and Highford is where people who have one meet people who fund or buy them.

Highford is not a broker-dealer. Categories:

- `legal` — judgments and awards. Litigation funding and `case` (“Do I have a case?”) sit here, not as separate markets. Enforcement firms look at this category.
- `business` — businesses for sale to small PE firms and search funds
- `startup` — startups raising from VCs and angels. Primary raises only. No secondary shares.
- `ip` — patents and domain names. Patent rows can later be seeded from USPTO public data (assignments, expired patents, maintenance-fee lapses). Nothing is fetched from USPTO yet.
- `data` — datasets for sale, and data-wanted requests (`list_data_requests`, `post_data_request`). Optional filters: vertical, data_type, license_scope, license_use, never_published, privacy, hipaa, consent_basis, min_headcount, min_years, min_tokens, fresh_after, fresh_before. A missing fact does not match. Real descriptions stay in the data room until a full grant. Plain archive form: https://tryhighford.com/data/sellable

No real estate. Highford is not a law firm. Nothing here is legal advice, an offer of securities, or a promise that capital will show up. A data seller attests rights and lawful collection. Highford does not verify rights. Sample files for data and IP stay in the private room.

## Pages

Add `?format=md`, or send `Accept: text/markdown`, for a markdown copy of a public page.

- Home: https://tryhighford.com/
- Deals: https://tryhighford.com/deals
- Data: https://tryhighford.com/data
- Pricing: https://tryhighford.com/pricing
- Developers: https://tryhighford.com/developers
- AI instructions: https://tryhighford.com/ai
- Use with your AI: https://tryhighford.com/use-ai
- Guided listing: https://tryhighford.com/start
- List a deal: https://tryhighford.com/list
- How it works: https://tryhighford.com/how-it-works
- FAQ: https://tryhighford.com/faq

## Sign up with an email code

POST https://tryhighford.com/api/v1/signup
POST https://tryhighford.com/api/v1/verify

No card, no phone, and no captcha. The verify response returns api_key. Public search stays free.

Private credit from BDC filings: GET https://tryhighford.com/api/v1/credit?borrower=&lender=&window=12
MCP tools: search_borrowers, search_lenders, search_maturities. Maturity is XBRL, then the HTML table. Revolvers and delayed draws are not refinancing flags.

## Early access

The agent API is open. There is no waitlist. Search, inspect, and creating a listing are free. Unlocking a contact or requesting an intro spends 1 credit from the caller’s balance.

Create an account with an email. The free plan starts with 3 credits. Paid monthly packs exist as placeholder prices only. Checkout is not connected, and this API will not bill a card.

Send the token on later calls:

```
Authorization: Bearer $TOKEN
```

Replace `$TOKEN` with the `token` field from the account response.

If you get stuck, send feedback. Say which step failed and what you needed. A person reads it in the internal desk.

## Search deals (free)

Plain language works. This query asks for legal judgments in Texas at or above $1,000,000.

```http
# expect 200
# contains ex-tx-judgment
# excludes poster@example.com
GET https://tryhighford.com/api/v1/listings?q=find%20judgments%20over%20%241M%20in%20Texas
```

A category filter is also free.

```http
# expect 200
# contains ex-ca-startup
# excludes ex-tx-judgment
GET https://tryhighford.com/api/v1/listings?category=startup
```

The response includes `interpretation` (how the reader understood the words) and `listings`. Contact fields are not included.

## Inspect a listing (free)

```http
# expect 200
# contains Commercial money judgment
# excludes poster@example.com
GET https://tryhighford.com/api/v1/listings/ex-tx-judgment
```

`contact.locked` is true until an unlock.

## List a startup from the founder’s AI

A founder can paste this into Claude, ChatGPT, or Cursor:

`connect to https://tryhighford.com/skill.md and list my startup on Highford`

Create the listing with `create_listing` and do not set `publish`. The response is a private draft: `publication` is `draft`, and `magic_link` is the founder’s approval link. The draft is absent from search until that link is opened. Keep `owner_token`. Use it with `review_deal_access` to approve, deny, revoke, or invite an email or a domain. You cannot bypass a missing token.

MCP config for clients that ask for a snippet:

```json
{"mcpServers":{"highford":{"url":"https://tryhighford.com/api/mcp"}}}
```

## List a deal (free)

Every category needs the same contact block and all three consent flags. Omit `publish` to store a private draft. The human form on the site sends `publish` because the person already reviewed the fields. The public card stays anonymized: do not put a personal email in the headline.

### Legal claim, judgment, or award

```http
# expect 201
# contains "category":"legal"
POST https://tryhighford.com/api/v1/listings
Content-Type: application/json

{"category":"legal","subtype":"judgment","headline":"Agent-listed judgment in Delaware","location":"Delaware","size_label":"$2M–$4M","stage":"Judgment entered","details":"A commercial judgment. The holder wants a conversation about a sale or financing.","contact":{"name":"Agent Lister","email":"lister-legal@example.com","phone":"202-555-0101","role":"Counsel","company":"Example LLP","location":"Delaware","method":"email"},"consent":{"accurate":true,"terms":true,"contact":true}}
```

### Do I have a case?

Use plain facts. The platform will not tell the person they have a case.

```http
# expect 201
# contains "category":"case"
POST https://tryhighford.com/api/v1/listings
Content-Type: application/json

{"category":"case","location":"Illinois","details":"I was fired last month after I reported unpaid overtime. I live in Illinois and I want a lawyer to tell me if this is worth a conversation.","contact":{"name":"Agent Lister","email":"lister-case@example.com","phone":"312-555-0102","role":"The person with the question","company":"None","location":"Illinois","method":"email"},"consent":{"accurate":true,"terms":true,"contact":true}}
```

### Business for sale

```http
# expect 201
# contains "category":"business"
POST https://tryhighford.com/api/v1/listings
Content-Type: application/json

{"category":"business","headline":"Agent-listed services company in Arizona","location":"Arizona","size_label":"$3M–$6M","stage":"Exploring a sale","details":"A founder-owned services company. The owner will talk about a sale.","extras":{"industry":"Services"},"contact":{"name":"Agent Lister","email":"lister-business@example.com","phone":"480-555-0103","role":"Advisor","company":"Example Advisory","location":"Arizona","method":"phone"},"consent":{"accurate":true,"terms":true,"contact":true}}
```

### Startup raising

```http
# expect 201
# contains "category":"startup"
# contains "draft"
POST https://tryhighford.com/api/v1/listings
Content-Type: application/json

{"category":"startup","location":"New York","stage":"Seed","details":"A software company opening a seed round.","startup":{"company":"Example Tools","stage":"Seed","sector":"Software","raise_amount":"$3M","deck_link":"https://example.com/deck"},"contact":{"name":"Agent Lister","email":"lister-startup@example.com","phone":"212-555-0104","role":"Founder","company":"Example Tools","location":"New York","method":"email"},"consent":{"accurate":true,"terms":true,"contact":true}}
```

### IP for sale

```http
# expect 201
# contains "category":"ip"
POST https://tryhighford.com/api/v1/listings
Content-Type: application/json

{"category":"ip","subtype":"domain","headline":"Example domain name","location":"Online","size_label":"Open to offers","details":"A domain name the owner is willing to sell.","sample_available":"no","contact":{"name":"Agent Lister","email":"lister-ip@example.com","phone":"415-555-0105","role":"Owner","company":"Example Names","location":"California","method":"email"},"consent":{"accurate":true,"terms":true,"contact":true}}
```

### Dataset for sale

The sample link, when present, is stored for the private room and is absent from this response.

```http
# expect 201
# contains "category":"data"
# excludes private-sample
POST https://tryhighford.com/api/v1/listings
Content-Type: application/json

{"category":"data","headline":"Example technical manuals","details":"A text dataset of technical manuals offered for license.","size_label":"Open to offers","modality":"text","dataset_size":"12 GB","rights_basis":"The seller holds a license to redistribute these manuals.","rights_attested":"yes","contains_pii":"no","consent_for_pii":"not_applicable","sample_available":"yes","sample_link":"https://example.com/private-sample","contact":{"name":"Agent Lister","email":"lister-data@example.com","phone":"415-555-0106","role":"Owner","company":"Example Data","location":"California","method":"email"},"consent":{"accurate":true,"terms":true,"contact":true}}
```

## Data wanted

`list_data_requests` is free. `post_data_request` is free. The public card never includes the buyer email. `hide_identity` also hides the name and firm.

```http
# expect 200
# contains dreq-ex-support
# excludes buyer-hidden@example.com
GET https://tryhighford.com/api/v1/data-requests
```

```http
# expect 201
# contains "modality":"text"
# excludes lab-buyer@example.com
POST https://tryhighford.com/api/v1/data-requests
Content-Type: application/json

{"modality":"text","domain":"licensed support transcripts","size_label":"1 million rows","rights_requirements":"Commercial license. No personal information.","budget_label":"","deadline":"","hide_identity":true,"buyer_name":"Lab Buyer","buyer_email":"lab-buyer@example.com","buyer_firm":"Example Lab"}
```

## Get a token (free)

Use any email. The same email returns the same token and does not refill credits.

```http
# expect 201
# contains "token"
POST https://tryhighford.com/api/v1/accounts
Content-Type: application/json

{"email":"agent-demo@example.com","name":"Example Agent"}
```

## Unlock a contact or request an intro (1 credit)

Spend a credit to reveal contact details. `intent` is `unlock` or `intro`. An intro is stored for the desk. This preview does not send the email for you.

```http
# expect 200
# contains poster@example.com
POST https://tryhighford.com/api/v1/listings/ex-tx-judgment/unlock
Authorization: Bearer $TOKEN
Content-Type: application/json

{"intent":"intro"}
```

If the balance is empty the response is HTTP 402 with `error` set to `insufficient_credits`. No card is charged.

## Send feedback (free)

Use this when a step fails or the API is missing something you need.

```http
# expect 201
# contains "id"
POST https://tryhighford.com/api/v1/feedback
Content-Type: application/json

{"agent_name":"example-agent","task":"find a Texas judgment and ask for an intro","step":"unlock","blocker":"none — this is a sample report","needs":"A way to tell which listings are examples before spending a credit","contact":"agent@example.com"}
```

## Other free helpers

Suggest fields from a messy note. The reader fills category, place, and size. A hosted model is optional and stays off unless `AI_API_KEY` is set. `AI_BASE_URL` and `AI_MODEL` point that key at any OpenAI-compatible host. Structured fields stay on the built-in reader either way.

```http
# expect 200
# contains "Texas"
POST https://tryhighford.com/api/v1/assist/listing
Content-Type: application/json

{"text":"We have a $4M judgment against a Texas company and may want to sell it."}
```

Pre-screen a case question. The disclaimer is the important part.

```http
# expect 200
# contains not a law firm
POST https://tryhighford.com/api/v1/assist/case
Content-Type: application/json

{"text":"I was fired last month after I reported unpaid overtime. I am in Illinois and I do not know if I have a case."}
```

## Filter and poll (free)

Structured fields sit beside plain language. `since` is how a persistent agent polls for listings posted after the last check. Search is rate limited at 1,200 requests a minute per caller, which is meant to stay out of the way.

```http
# expect 200
# contains "ex-ca-startup"
GET https://tryhighford.com/api/v1/listings?category=startup&sector=Software&stage=Seed&since=2020-01-01T00:00:00.000Z
```

Save a filter set, then poll it. Nothing is pushed unless a later webhook flag is turned on.

```http
# expect 201
# contains srch-
POST https://tryhighford.com/api/v1/searches
Content-Type: application/json

{"email":"agent@example.com","filters":{"category":"startup","sector":"Software"}}
```

## OpenAPI (free)

```http
# expect 200
# contains "search_deals"
GET https://tryhighford.com/openapi.json
```

## MCP (free)

The remote MCP endpoint is `https://tryhighford.com/api/mcp`. It speaks JSON-RPC over HTTP. Send `Accept: application/json, text/event-stream`. Tools: `search_deals`, `get_deal`, `create_listing`, `request_unlock`, `send_feedback`, `request_deal_access`, `read_deal_room`, `list_data_requests`, `post_data_request`, `draft_data_intro`, `draft_intro`, `save_search`, `list_matches`.

A tool call returns the public teaser. It does not return a deck, metrics, or a contact unless that email already has a grant, or the caller spends a credit on `request_unlock`.

```http
# expect 200
# contains "protocolVersion"
POST https://tryhighford.com/api/mcp
Content-Type: application/json
Accept: application/json, text/event-stream

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"example-agent","version":"0"}}}
```

```http
# expect 200
# contains "ex-ca-startup"
# excludes "private-deck"
POST https://tryhighford.com/api/mcp
Content-Type: application/json
Accept: application/json, text/event-stream

{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"search_deals","arguments":{"category":"startup","sector":"Software"}}}
```

## Request a private deal room (free)

Deal rooms default to private. An agent submits the requester’s email, name, and firm. It cannot skip the grant. The example startup uses founder approval, so this call stays pending and does not return the deck.

```http
# expect 200
# contains "pending"
# excludes "private-deck"
POST https://tryhighford.com/api/v1/listings/ex-ca-startup/access
Content-Type: application/json

{"email":"investor@example.com","name":"Example Investor","firm":"Example Capital"}
```

The example startup’s owner token can approve that request. A missing or wrong token does not open the room.

```http
# expect 200
# contains "approve"
POST https://tryhighford.com/api/v1/listings/ex-ca-startup/access/review
Content-Type: application/json

{"owner_token":"own-ex-ca-startup","action":"approve","email":"investor@example.com","level":"deck"}
```

## Errors

- `400` — the body is missing a required field. Read `error`.
- `401` — unlock was called without a bearer token.
- `402` — the account has no credits left.
- `404` — that listing id is not on the book.
