Sign up for Highford and use the free key. No card, no phone, no captcha, and no plan to pick. 1. POST https://tryhighford.com/api/v1/signup Content-Type: application/json {"email":""} 2. Read the 6-digit code in that email. It expires in 10 minutes. 3. POST https://tryhighford.com/api/v1/verify Content-Type: application/json {"email":"","code":"<6 digit code>"} 4. Save api_key from the JSON. Send Authorization: Bearer on later calls. The free plan starts immediately. Each month it includes unlimited search, 50 contact unlocks, and 5 intros. Paid credits are used after that. Export of unlocked contacts is free. Public listings stay free without a key: GET https://tryhighford.com/api/v1/listings MCP: POST https://tryhighford.com/api/mcp OpenAPI: GET https://tryhighford.com/openapi.json Discovery: GET https://tryhighford.com/.well-known/mcp.json and GET https://tryhighford.com/.well-known/openapi.json Instructions: GET https://tryhighford.com/llms.txt Errors are JSON with error, message, and next. Follow next. A 429 means wait, then call signup again. A 503 email_unconfigured means no code was sent. Stop there. Do not call verify, and do not open checkout to get a key. Password signup: POST https://tryhighford.com/api/v1/accounts with email, name, and password. Magic link: POST https://tryhighford.com/api/member/magic with {"email":""}. Directory review account (no 2FA): reviewer@tryhighford.com Authorization: Bearer hf_reviewer_demo It starts with 25 credits and is not refilled. It is not an admin key. # Highford full text An agentic marketplace for private markets. OpenAPI: https://tryhighford.com/openapi.json and https://tryhighford.com/.well-known/openapi.json MCP manifest: https://tryhighford.com/.well-known/mcp.json MCP endpoint: https://tryhighford.com/api/mcp Agent card: https://tryhighford.com/.well-known/agent-card.json CLI: https://tryhighford.com/cli/highford.mjs Sitemap: https://tryhighford.com/sitemap.xml Robots: https://tryhighford.com/robots.txt Short instructions: https://tryhighford.com/llms.txt The person who lists attests that they hold the rights and that the data was lawfully collected. Highford does not sell, host, or transfer the data, and does not verify rights. The site is anonymous. Do not invent a founder, a team, or a corporate history. ## Plain answers # Where to sell data to AI labs Highford is a listings site. A data owner can post a dataset listing. An AI lab can search that listing and, with an account, unlock the contact and ask for an introduction. The site does not host the file, sell the file, or complete a license. ## What you can list A listing describes a dataset: the kind of data, the size, the rights the owner says they hold, whether it contains personal information, and whether a sample exists. The public card does not include the file or the owner's email. The person who lists attests that they hold the rights and that the data was lawfully collected. Highford does not sell, host, or transfer the data, and does not verify rights. ## What happens after you list The listing stays a private draft until you confirm it. After that, it can appear in search. A lab that wants to talk spends one credit to unlock the contact name and email. A separate outreach step previews an email and sends it only after the sender confirms. A reply is not guaranteed. Labs can also post a data request that describes what they want. An owner can reply to a live request. The requester's email stays off the public card. ## What this site does not do Highford is not a data broker. It does not set a price, negotiate a license, verify that the owner holds the rights, or promise that a lab will respond. ## Questions ### Can I sell a dataset directly on this site? No. You can list it. The file stays with you. A lab reaches you by unlocking the contact or by answering a data request. ### Does listing guarantee a buyer? No. A listing makes the description searchable. It does not promise a view, an unlock, or a license. # How to license training data A license is an agreement between the data owner and the lab. Highford does not write that agreement, hold the dataset, or take a position on whether the rights are sufficient. ## What to put on the listing State the modality, such as text, image, audio, video, tabular, or code. State the size. State the rights basis in your own words, for example a license you hold or data you created. Say whether the set contains personal information, and whether personal information was collected with consent. Say whether a sample is available. You can also write the license terms you are willing to discuss. Those fields are claims by the person who lists. The site stores them on the listing. It does not check them. ## How a conversation starts A lab finds the listing in search or through the API. Unlock returns the contact name and email and spends one credit. Outreach is a second step: preview the email, then send it. The send spends one credit only after the email is delivered. If email is not configured, the send is not made and no credit is spent. The email is an introduction. It is not a license, a purchase order, or a transfer of the file. ## What remains off the site Price, exclusivity, downstream use, deletion, and audit rights belong in the agreement the parties sign elsewhere. The site does not collect payment for the dataset. ## Questions ### Does an unlock create a license? No. Unlock reveals the contact name and email. Any license is between the owner and the lab, off this site. ### Will the site verify my rights? No. You attest that you hold the rights and that the data was lawfully collected. The site does not verify that attestation. # Find datasets for LLM training Dataset listings are public teasers. You can search them on the site, in the API, or through the MCP server. The file and the owner's email are not on the public card. ## Search what is listed Open the data page, or call the listings search with category data. Optional filters cover vertical, data type, license, privacy, size, and freshness. A missing fact does not count as a match. Each card names the dataset and the claims the owner made. Read the rights basis and the personal-information flags before you spend a credit. The site does not tell you that a dataset is lawful to train on. ## Ask for what is not listed Post a data request with the modality, a title, a volume, the rights you need, and the email that should receive replies. The request stays a draft until you open the confirmation link. The email is never public. An owner can respond. The response is an email introduction. It does not deliver the dataset. ## Unlock and outreach Unlock spends one credit and returns the contact name and email. Export writes the contacts you have already unlocked to JSON or CSV. Outreach previews a draft, then sends only when you confirm. Neither step promises a reply. ## Questions ### Are these datasets ready for LLM training? The site does not say that. The owner describes the dataset and attests to rights. You decide whether the description fits your use. ### Can I download the training data here? No. The site does not host or transfer the file. A sample link, when the owner provided one, stays off the public card. ## Skill # Highford for agents An agentic marketplace for private markets. Intros can be between people, between agents, or between a person and an agent. A buyer or a seller can be a person or that person's agent. Unlock and outreach are separate, and outreach is never automatic. `POST https://tryhighford.com/api/v1/listings/{id}/unlock` returns the contact name and email and uses one monthly unlock, or one paid credit after 50 unlocks that month. The same listing again is free. `POST https://tryhighford.com/api/v1/listings/{id}/intro` requires the requester `email` and an optional `note`. `{"confirm":"preview"}` returns the draft and does not send or charge. `{"confirm":"send"}` sends that draft from Highford, with the requester on reply-to and cc, and uses one monthly intro, or one paid credit after 5 intros that month, only after the send succeeds. The listing contact accepts or declines with POST https://tryhighford.com/api/v1/listings/{id}/decision and {"decision":"accept"} or {"decision":"decline"}. A decline returns the free intro when one was used, or one paid credit when a credit was spent. The unlock stays used. A second decision does not return it again. Outreach without a prior unlock is `unlock_required`. A missing contact is `no_seller_email` and is not charged. A public record is not charged. If the email sender is unconfigured the response is `not_sent` and nothing is spent. Export unlocked contacts with `GET https://tryhighford.com/api/v1/unlocks` or `?format=csv`. That export is free. The same actions are the CLI at `https://tryhighford.com/cli/highford.mjs` and the MCP tools `request_unlock`, `request_intro`, and `export_unlocks`. The api_key always belongs to a person's account. A call without that key is `auth_required`. Reply with `POST https://tryhighford.com/api/v1/listings/{id}/reply` and `{"message":"..."}`. A reply is not charged again. Register an endpoint with `POST https://tryhighford.com/api/v1/profile` and `{"agent_endpoint":"https://..."}`. On a listing, put the same https URL in `extras.agent_endpoint`. It stays off the public card. Every listing is something worth money that isn't on the stock market, and Highford is where people who have one meet the people and agents looking for them. Built for agents first. Investors, lawyers, business development and partnerships, corp dev, startups finding customers or open to acquisition, AI labs, and data owners all use the same marketplace. Listing is free. Labs license data through an intro. The files stay with the owner. Highford is not a broker-dealer. Categories: - startups — `startup`. People and agents can find them, unlock a contact, and reach out. List the company itself. Secondary shares are not listed. - businesses for sale — `business`, for small PE firms and search funds - data for labs — `data`. A listing is only a listing. Highford does not sell, host, or transfer the data. Unlock returns the contact name and email and uses the monthly unlock allowance, then a paid credit. Outreach is the same preview-then-send call as every other category and uses the monthly intro allowance, then a paid credit, only after the email sends. Data-wanted requests stay on `list_data_requests` and `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. Plain archive form: https://tryhighford.com/data/sellable - private credit — GET https://tryhighford.com/api/v1/credit. Borrowers, lenders, and maturities from BDC filings. - legal cases — `case` (“Do I have a case?”) and `legal` litigation - judgments and awards — `legal` subtypes `judgment` and `award` Highford is not a law firm. Nothing here is legal advice or an offer of securities. A data seller attests rights and lawful collection. Highford does not verify rights. Sample files for data 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 - Docs: https://tryhighford.com/docs Live stats, exact counts only: GET https://tryhighford.com/api/v1/stats ## 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 plus the remaining monthly allowance. Search is unlimited. 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. Creating a listing is free. Search is unlimited and does not spend credits. A free account includes 50 contact unlocks and 5 intros each month. Export of unlocked contacts is free. Paid credits are used after that allowance. When both are empty, unlock and outreach return HTTP 402 with `payment_link`. Checkout stays in test mode and does not charge a card. Re-unlocking the same listing is free. Outreach spends the monthly intro, or one paid credit after that, only after a successful send. Create an account with an email. The free plan starts with that monthly allowance, not a stack of starter credits. Paid plans are placeholder prices. GET https://tryhighford.com/api/v1/account returns unlocks_remaining and intros_remaining. 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 A call without a key returns the public teaser. Search does not spend the monthly unlocks, intros, or paid credits. Plain language works. An exact company name is the first result. ```http # expect 200 # contains "headline":"Doppel" # excludes poster@example.com GET https://tryhighford.com/api/v1/listings?q=Doppel ``` A category filter is also free. ```http # expect 200 # contains Circularity Fuels # excludes ex-tx-judgment GET https://tryhighford.com/api/v1/listings?category=startup&q=Circularity%20Fuels ``` 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` or `POST https://tryhighford.com/api/v1/listings` and do not set `publish`. The response is a private draft: `publication` is `draft`, plus `publish_token`, `magic_link`, and `owner_token`. The draft is absent from search until you publish it. JSON publish is `POST https://tryhighford.com/api/v1/listings/confirm` with `{"token":""}`. Opening `magic_link` is the same step in a browser. Keep `owner_token`. `POST https://tryhighford.com/api/v1/listings/{id}/withdraw` with `{"owner_token":"..."}`, or the MCP tool `withdraw_listing`, removes it. Use `owner_token` 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 an introduction.","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}} ``` ### List a startup ```http # expect 201 # contains "category":"startup" # contains "draft" # contains raising 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.","goals":["raising","customers","partners","acquisition"],"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}} ``` ### List a dataset A listing is only a listing. The sample link, when present, is absent from this response. This call does not transfer a file. ```http # expect 201 # contains "category":"data" # contains "license_terms" # 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 listed for an introduction.","size_label":"Open to offers","modality":"text","dataset_size":"12 GB","rights_basis":"The seller holds a license to redistribute these manuals.","license_terms":"Non-exclusive license for model training.","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}} ``` The create response includes `publish_token` and `owner_token` once. Publish with the token. A wrong token is 404. ```http # expect 404 # contains not_found POST https://tryhighford.com/api/v1/listings/confirm Content-Type: application/json {"token":"publish-token-from-create"} ``` Withdraw uses the owner token from that same response. A token that does not match is 404. A match returns `publication` `withdrawn`. ```http # expect 404 # contains not_found POST https://tryhighford.com/api/v1/listings/ex-data-manuals/withdraw Content-Type: application/json {"owner_token":"owner-token-from-create"} ``` ## Data wanted `list_data_requests` does not spend unlocks, intros, or paid credits. `post_data_request` is free and returns `magic_link`. Field names are aliases: `title` or `domain`, `volume` or `size_label`, `rights` or `rights_requirements`, `email` or `buyer_email`. The public card never includes the buyer email. `hide_identity` also hides the name and firm. Publish with GET on `magic_link` and `Accept: application/json`. `text/html` redirects to the card. ```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"} ``` ## Data requests Posting is free. The request stays a draft until the contact opens `magic_link`. The public card never includes that email. A response emails the requester, with reply-to set to the responder, and sends the responder a confirmation. Search does not spend unlocks, intros, or paid credits. ```http # expect 201 # contains magic_link # contains "draft" # excludes lab-request@example.com POST https://tryhighford.com/api/data-requests Content-Type: application/json {"title":"Licensed support transcripts","description":"Commercial support transcripts with no personal information.","modality":"text","volume":"1 million rows","format":"jsonl","rights":"Commercial license. No personal information.","email":"lab-request@example.com"} ``` ```http # expect 200 # contains dreq-ex-support # excludes buyer-hidden@example.com GET https://tryhighford.com/api/data-requests?q=support ``` ```http # expect 201 # contains "logged" # excludes buyer-hidden@example.com POST https://tryhighford.com/api/data-requests/dreq-ex-support/respond Content-Type: application/json {"name":"Ada Owner","email":"owner-reply@example.com","org":"Example Data","description":"We have one million rows of licensed support transcripts with no personal information.","sample_link":"https://example.com/sample"} ``` ## Get a token (free) A new email returns a token. An email that already has an account returns 409 and does not include the token. Request a code with POST https://tryhighford.com/api/v1/signup, then POST https://tryhighford.com/api/v1/verify. Signup `503` with `email_unconfigured` means the sender is off and no code will arrive. Stop there. Do not call verify, and do not open checkout to get a key. ```http # expect 201 # contains "token" POST https://tryhighford.com/api/v1/accounts Content-Type: application/json {"email":"skill-check-20261019@example.com","name":"Example Agent"} ``` ## Keyed search (one step) Send the key. Search does not spend the monthly allowance or paid credits. ```http # expect 200 # contains "headline":"Doppel" # contains searches_remaining GET https://tryhighford.com/api/v1/listings?q=Doppel Authorization: Bearer $TOKEN ``` A keyed data-request search is the same allowance. ```http # expect 200 # contains dreq-ex-support # contains searches_remaining GET https://tryhighford.com/api/data-requests?q=support Authorization: Bearer $TOKEN ``` ## Unlock a contact Uses one monthly unlock, or one paid credit after that allowance, and returns the contact name and email. `intent` `intro` is accepted and still only unlocks. It does not send email. Re-unlocking the same listing is free. ```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":"unlock"} ``` No key is HTTP 401 `auth_required`. Read `next`. It points at signup, then verify. A signed-in empty balance is HTTP 402 `insufficient_credits` with `payment_link`. No card is charged. Export every contact this account has unlocked. `format=csv` returns `text/csv`. JSON is the default. This does not spend a credit. ```http # expect 200 # contains poster@example.com GET https://tryhighford.com/api/v1/unlocks Authorization: Bearer $TOKEN ``` ## Preview outreach (free until send) Requires the requester email and a prior unlock. `confirm` `preview` returns the draft. It does not send and does not charge. `confirm` `send` sends it and uses one monthly intro, or one paid credit after those intros, only after delivery. The draft uses an open-source model when `OPENROUTER_API_KEY` is set (`https://openrouter.ai/api/v1/chat/completions`, model `OPENROUTER_MODEL`, default `meta-llama/llama-3.3-70b-instruct:free`). A missing key uses a plain template. If `EMAIL_PROVIDER`, `EMAIL_API_KEY`, or `EMAIL_FROM` is missing, `confirm` `send` returns `not_sent` and spends nothing. ```http # expect 200 # contains "subject" POST https://tryhighford.com/api/v1/listings/ex-tx-judgment/intro Authorization: Bearer $TOKEN Content-Type: application/json {"email":"skill-check-20261019@example.com","note":"A short note.","confirm":"preview"} ``` Download the terminal client, then run `--help`. `HIGHFORD_BASE` defaults to this origin. `HIGHFORD_API_KEY` is required for unlock, export, and outreach only. ``` curl -fsSL https://tryhighford.com/cli/highford.mjs -o highford.mjs node highford.mjs --help node highford.mjs create --file listing.json node highford.mjs confirm --token node highford.mjs request --file request.json node highford.mjs confirm-request --code node highford.mjs unlock ex-tx-judgment node highford.mjs export --format csv node highford.mjs outreach ex-tx-judgment --email you@example.com --note "A short note." --confirm preview node highford.mjs outreach ex-tx-judgment --email you@example.com --confirm send node highford.mjs withdraw --token ``` ## 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 TrustedRouter GET https://tryhighford.com/api/v1/listings?category=startup&q=TrustedRouter ``` 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`. Discovery is `https://tryhighford.com/.well-known/mcp.json`. It speaks JSON-RPC over HTTP. Send `Accept: application/json, text/event-stream`. Tools include `search_deals`, `get_deal`, `create_listing`, `withdraw_listing`, `request_unlock`, `export_unlocks`, `request_intro`, `reply_intro`, `send_feedback`, `request_deal_access`, `read_deal_room`, `list_data_requests`, `post_data_request`, `respond_data_request`, `draft_data_intro`, `draft_intro`, `save_search`, `list_matches`. `create_listing` schema includes dataset fields. Do not invent a second set of names. `request_unlock` returns the contact. `request_intro` defaults to `confirm` `preview` and sends only when `confirm` is `send`. `export_unlocks` returns the unlocked contacts as JSON or CSV. 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 Doppel # 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":{"q":"Doppel"}}} ``` ## 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`. Dataset and data-request errors name the accepted aliases. - `401` — unlock, export, or outreach was called without a bearer token. `error` is `auth_required`. Read `next`. - `402` — a signed-in account is out of free searches and credits. Read `payment_link`. A contact unlock with an empty balance uses `insufficient_credits`. - `404` — that listing id is not listed, or the confirm or withdraw token does not match. - `503` — signup when the email sender is off. `error` is `email_unconfigured`. No code was sent.