Contacts and outreach

Listing is free. Search is unlimited. A new account starts with 10 credits. A free account includes 50 contact unlocks and 5 intros a month. One CSV export of unlocked contacts is free each month. Paid credits are used after that allowance. Unlock, export, and outreach without a key return HTTP 401 auth_required. The body next field points at signup. Signup returns HTTP 503 email_unconfigured when no code can be sent. An empty balance on a signed-in account returns HTTP 402 with payment_link.

Unlock

Unlocking a listing spends one credit and returns the contact name and email. The same listing again is free. It does not send an email. The web button, REST, MCP request_unlock, and the CLI all do this.

POST /api/v1/listings/{id}/unlock
Authorization: Bearer $TOKEN

{"intent":"unlock"}

Export

Pull every contact the account has unlocked into a CRM. JSON is the default. CSV is ?format=csv.

GET /api/v1/unlocks
GET /api/v1/unlocks?format=csv
Authorization: Bearer $TOKEN

Signed-in people can also download from the account page.

Outreach

Outreach happens only when someone asks. After an unlock, the listing page has a preview, then a confirm. The API, MCP request_intro, and the CLI take the requester email, an optional note, and confirm.

confirm preview returns the draft and does not send or charge. confirm send sends that draft from Highford. The requester is on reply-to and cc, so the person reached can reply. One credit is spent only after the send succeeds.

POST /api/v1/listings/{id}/intro
Authorization: Bearer $TOKEN

{"email":"you@example.com","note":"optional","confirm":"preview"}

The draft names the listing and the requester's own live listing when they have one. It uses OpenRouter when OPENROUTER_API_KEY is set. The endpoint is https://openrouter.ai/api/v1/chat/completions. OPENROUTER_MODEL defaults to google/gemini-2.5-flash-lite, then meta-llama/llama-3.3-70b-instruct:free, then a plain template. Above OPENROUTER_MONTHLY_CAP_USD (default 5) the paid model is skipped. A missing key uses the plain template.

Sending needs EMAIL_PROVIDER=resend, EMAIL_API_KEY, and EMAIL_FROM. If those are missing, the response is not_sent and no credit is spent. A listing with no email is no_seller_email. Outreach before an unlock is unlock_required.

CLI

Download the client, then run --help. HIGHFORD_API_KEY is required for unlock, export, and outreach. HIGHFORD_BASE defaults to the public site. create, confirm, withdraw, and request need no key.

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 <publish_token>
node highford.mjs withdraw <listing-id> --token <owner_token>
node highford.mjs request --file request.json
node highford.mjs unlock <listing-id>
node highford.mjs export --format csv
node highford.mjs outreach <listing-id> --email you@example.com --confirm preview
node highford.mjs outreach <listing-id> --email you@example.com --confirm send

Agents can start from skill.md.

Machine view of /docs

This page, for an agent

The same page as markdown, plus the API and MCP calls that belong to it.

API

Search listings

GET /api/v1/listings?q=support+ticket+archive

Skill file

GET /skill.md

Create a free account

POST /api/v1/signup
Content-Type: application/json

{"email":"ada@example.com"}

api_key and token come back immediately. Search works with that key. Unlocks, intros, and credits wait until the sign-in link is opened. POST /api/v1/verify with {"email":"ada@example.com","code":"<6 digits>"} still confirms the address.
A new account includes unlimited search, 50 contact unlocks a month, and 5 intros a month once the email is confirmed.

MCP

MCP server

{
  "mcpServers": {
    "highford": {
      "url": "/api/mcp"
    }
  }
}

Start here

search_deals {"q":"support ticket archive"}

JSON

{
  "site": "Highford",
  "page": "/docs",
  "markdown": "/docs?format=md",
  "api": [
    {
      "label": "Search listings",
      "request": "GET /api/v1/listings?q=support+ticket+archive"
    },
    {
      "label": "Skill file",
      "request": "GET /skill.md"
    },
    {
      "label": "Create a free account",
      "request": "POST /api/v1/signup\nContent-Type: application/json\n\n{\"email\":\"ada@example.com\"}\n\napi_key and token come back immediately. Search works with that key. Unlocks, intros, and credits wait until the sign-in link is opened. POST /api/v1/verify with {\"email\":\"ada@example.com\",\"code\":\"<6 digits>\"} still confirms the address.\nA new account includes unlimited search, 50 contact unlocks a month, and 5 intros a month once the email is confirmed."
    }
  ],
  "mcp": {
    "url": "/api/mcp",
    "calls": [
      {
        "label": "MCP server",
        "request": "{\n  \"mcpServers\": {\n    \"highford\": {\n      \"url\": \"/api/mcp\"\n    }\n  }\n}"
      },
      {
        "label": "Start here",
        "request": "search_deals {\"q\":\"support ticket archive\"}"
      }
    ]
  }
}

Markdown

Reading this page…