{"openapi":"3.1.0","info":{"title":"Highford API","version":"0.1.0","description":"An agentic marketplace for private markets. Intros can be between people, between agents, or between a person and an agent. Open access to private deals. Built for agents. Audiences include investors, lawyers, business development and partnerships, corp dev, startups finding customers or open to acquisition, AI labs, and data owners. Listing is free. Search is unlimited. Each month a free account includes 50 contact unlocks and 5 intros. Export of unlocked contacts is free. Paid credits are used after that allowance. An empty paid balance and an empty allowance return 402 with payment_link. A pack of 10 credits is $9. A pack of 25 credits is $9. A pack of 100 credits is $27. Pro is $19 a month for 25 credits. Firm is $49 a month for 120 credits. Stripe test mode does not charge a real card. Categories: businesses for sale, data, startups, judgments and awards, private credit, and IP. Search returns teasers. Deal rooms stay private. A buyer or seller can be a person or their agent. The API key belongs to a person's account. Unlock returns the contact name and email and uses one monthly unlock, or one paid credit after those unlocks. The same listing again is free. Outreach requires that unlock, the requester email, and confirm preview or send. Preview does not charge. Send uses one monthly intro, or one paid credit after those intros, only after the email succeeds. A decline returns the free intro when one was used, or the paid credit when a credit was spent. The unlock stays used. A missing contact is not charged. A public record is not charged. A data listing is only a listing. The API does not sell, host, or transfer the data. GET /api/v1/account returns unlocks_remaining and intros_remaining."},"servers":[{"url":"https://tryhighford.com"}],"paths":{"/api/submit":{"post":{"operationId":"submit","summary":"List a deal without an account. Types: business_for_sale, dataset, startup, private_credit, case, other.","responses":{"201":{"description":"Received"},"400":{"description":"Invalid"}}}},"/api/v1/listings":{"get":{"operationId":"search_deals","summary":"Search public teasers. Search is unlimited and does not spend credits.","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string","enum":["legal","case","business","startup","ip","data","credit","other"]}},{"name":"min_amount","in":"query","schema":{"type":"number"}},{"name":"max_amount","in":"query","schema":{"type":"number"}},{"name":"jurisdiction","in":"query","schema":{"type":"string"}},{"name":"stage","in":"query","schema":{"type":"string"}},{"name":"sector","in":"query","schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":"string"},"description":"ISO timestamp for cheap polling"},{"name":"verification_status","in":"query","schema":{"type":"string"}},{"name":"limit","in":"query","schema":{"type":"number"}},{"name":"page","in":"query","schema":{"type":"number"},"description":"Past the first page. Search does not spend credits."},{"name":"goals","in":"query","schema":{"type":"string"},"description":"Startup goals: raising, customers, partners, acquisition."},{"name":"vertical","in":"query","schema":{"type":"string","enum":["enterprise","finance","legal","healthcare","coding","education","robotics","other"]}},{"name":"data_type","in":"query","schema":{"type":"string","enum":["raw_archive","expert_labeled","reasoning_traces","rl_environment","held_out_eval","expert_hours"]}},{"name":"license_scope","in":"query","schema":{"type":"string","enum":["exclusive","non_exclusive"]}},{"name":"license_use","in":"query","schema":{"type":"string","enum":["training","eval_only"]}},{"name":"never_published","in":"query","schema":{"type":"string","enum":["yes","no"]}},{"name":"privacy","in":"query","schema":{"type":"string","enum":["contains_pii","deidentified","synthetic"]}},{"name":"hipaa","in":"query","schema":{"type":"string","enum":["none","safe_harbor","expert_determination","limited_data_set"]}},{"name":"consent_basis","in":"query","schema":{"type":"string","enum":["contract","consent","legitimate_interest","public","unknown"]}},{"name":"min_headcount","in":"query","schema":{"type":"number"}},{"name":"min_years","in":"query","schema":{"type":"number"}},{"name":"min_tokens","in":"query","schema":{"type":"number"}},{"name":"fresh_after","in":"query","schema":{"type":"string"}},{"name":"fresh_before","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Teaser listings. Keyed calls include searches_remaining."},"402":{"description":"Monthly allowance and paid credits are used up. Body includes payment_link."}}},"post":{"operationId":"create_listing","summary":"Create a listing. Response includes owner_token once. Startup goals are optional: raising, customers, partners, acquisition. A dataset takes modality, dataset_size, rights_basis, and license_terms.","responses":{"201":{"description":"Created"},"400":{"description":"Invalid"}}}},"/api/v1/status":{"get":{"operationId":"store_status","summary":"Which record store is active, whether tables answer, and live listing counts by source. No secrets.","responses":{"200":{"description":"sqlite or supabase status"}}}},"/api/v1/listings/{id}":{"get":{"operationId":"get_deal","summary":"Read one teaser","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Teaser"},"404":{"description":"Missing"}}}},"/api/v1/listings/confirm":{"post":{"operationId":"confirm_listing","summary":"Publish a draft. Body is {token: publish_token} from create_listing. No account.","responses":{"200":{"description":"publication live"},"404":{"description":"Unknown token"}}}},"/api/v1/listings/{id}/withdraw":{"post":{"operationId":"withdraw_listing","summary":"Remove a listing. Body is {owner_token} from create_listing. No account.","responses":{"200":{"description":"publication withdrawn"},"404":{"description":"id and owner_token do not match"}}}},"/api/v1/listings/{id}/unlock":{"post":{"operationId":"request_unlock","summary":"Spend a credit to return the contact name and email. The same listing again is free. Does not send email.","responses":{"200":{"description":"Contact name and email"},"401":{"description":"auth_required. POST /api/v1/signup returns api_key. Search works immediately. Unlocks wait until the email is confirmed. 503 email_unconfigured means no email was sent and no key was issued."},"402":{"description":"Signed in, but the balance is empty. Body includes payment_link."}}}},"/api/v1/unlocks":{"get":{"operationId":"export_unlocks","summary":"Export contacts this account has unlocked. format=csv or JSON.","parameters":[{"name":"format","in":"query","schema":{"type":"string","enum":["json","csv"]}}],"responses":{"200":{"description":"JSON contacts or a CSV file"},"401":{"description":"auth_required. POST /api/v1/signup returns api_key."}}}},"/api/v1/listings/{id}/intro":{"post":{"operationId":"request_intro","summary":"Preview or send outreach. Requires email. confirm preview returns the draft. confirm send uses one monthly intro, or one paid credit after that, only after success.","responses":{"200":{"description":"Draft preview, or already sent"},"201":{"description":"Sent"},"400":{"description":"not_sent, unlock_required, email_required, or no_seller_email. No charge."},"401":{"description":"auth_required. POST /api/v1/signup returns api_key. 503 email_unconfigured means no email was sent and no key was issued."},"402":{"description":"No credits. Body includes payment_link."}}}},"/api/v1/listings/{id}/access":{"post":{"operationId":"request_deal_access","summary":"Request private deal-room access for a named email. Does not bypass grants.","responses":{"200":{"description":"pending or approved without extra files"}}}},"/api/v1/listings/{id}/access/review":{"post":{"operationId":"review_deal_access","summary":"Owner token required. Approve, deny, revoke, invite an email or domain, set file visibility, or confirm freshness.","responses":{"200":{"description":"Updated"},"403":{"description":"Bad owner token"}}}},"/api/v1/listings/{id}/room":{"get":{"operationId":"read_deal_room","summary":"Read the room granted to the email query parameter.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"email","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Granted view"},"403":{"description":"No grant"}}}},"/api/v1/signup":{"post":{"operationId":"email_signup","summary":"Return api_key immediately and email a sign-in link. Search works at once. Unlocks, intros, and credits wait until the link is opened, or until POST /api/v1/verify with the fallback code. No phone, card, or captcha. 503 email_unconfigured means the sender is off, no email was sent, and no key was issued.","responses":{"200":{"description":"api_key plus a sign-in email"},"400":{"description":"invalid_email or disposable_email"},"429":{"description":"Rate limited"},"503":{"description":"email_unconfigured"}}}},"/api/v1/verify":{"post":{"operationId":"email_verify","summary":"Confirm the email with the fallback code. Opens unlocks, intros, and credits. The signup key is not shown again. The body includes unlocks_remaining and intros_remaining.","responses":{"200":{"description":"api_key"},"400":{"description":"Bad code"}}}},"/api/v1/credit":{"get":{"operationId":"search_private_credit","summary":"Search BDC borrowers, lenders, and maturities. Free. Cited to the SEC filing.","parameters":[{"name":"borrower","in":"query","schema":{"type":"string"}},{"name":"lender","in":"query","schema":{"type":"string"}},{"name":"window","in":"query","schema":{"type":"string","enum":["12","24"]},"description":"Refinancing window in months. Excludes revolvers and delayed draws."},{"name":"maturity_before","in":"query","schema":{"type":"string"}},{"name":"maturity_after","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Positions with citations"}}}},"/api/v1/account":{"get":{"operationId":"read_account","summary":"Paid credits plus the remaining monthly allowance: unlocks_remaining and intros_remaining. Search is unlimited. api_key is a prefix only. The full key is stored as a hash and is not returned here.","responses":{"200":{"description":"Account"},"401":{"description":"Auth"},"429":{"description":"240 requests a minute per key"}}}},"/api/v1/account/key":{"post":{"operationId":"rotate_api_key","summary":"Replace the API key. The previous key stops working. The new key is shown once. Requires Authorization: Bearer <api_key> or a signed-in session.","responses":{"200":{"description":"api_key"},"401":{"description":"Auth"},"429":{"description":"Rate limited"}}}},"/api/v1/accounts":{"post":{"operationId":"create_account","responses":{"201":{"description":"Token"}}}},"/api/v1/feedback":{"post":{"operationId":"send_feedback","responses":{"201":{"description":"Stored"}}}},"/api/data-requests":{"get":{"operationId":"search_data_requests","summary":"List or search live data requests. The contact email is omitted. Search does not spend credits.","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"modality","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Requests, without contact emails"},"402":{"description":"searches_required with payment_link"}}},"post":{"operationId":"create_data_request","summary":"Post a data request. Free. title or domain, volume or size_label, rights or rights_requirements, email or buyer_email. Returns magic_link and stays a draft until that link is opened with Accept: application/json. The email is never public.","responses":{"201":{"description":"Draft and magic_link"},"400":{"description":"Invalid"}}}},"/api/data-requests/confirm":{"get":{"operationId":"confirm_data_request","summary":"Publish a data request. Send Accept: application/json. text/html redirects to the public card.","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Live request"},"400":{"description":"Used or invalid link"}}}},"/api/data-requests/{id}/respond":{"post":{"operationId":"respond_data_request","summary":"Respond to a live data request. Emails the requester with reply-to set to the responder, and confirms to the responder. Does not return the requester email.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Intro queued or logged"},"400":{"description":"Invalid or spam"},"429":{"description":"Rate limited"}}}},"/api/v1/wanted":{"get":{"operationId":"search_wanted","summary":"What buyers want. Newest first. User-submitted contact stays locked. Public-source posts are unblurred and include source_link.","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string","enum":["business","data","startup","legal","credit","ip"]}},{"name":"buyer_type","in":"query","schema":{"type":"string","enum":["ai_lab","pe","strategic","investor","other"]}}],"responses":{"200":{"description":"Wanted posts"}}},"post":{"operationId":"post_wanted","summary":"Post what you want. Free. Stays a draft until magic_link is opened. Email and phone stay off the public card.","responses":{"201":{"description":"Draft and magic_link"},"400":{"description":"Invalid"}}}},"/api/v1/wanted/{id}":{"get":{"operationId":"get_wanted","summary":"One wanted post. Contact is included only after unlock, or when the source is public.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Post"},"404":{"description":"Not found"}}}},"/api/v1/wanted/{id}/respond":{"post":{"operationId":"respond_to_wanted","summary":"Say you have this. The buyer accepts before contact is shared. User-submitted posts spend an intro. Public-source posts are free.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Pending acceptance"},"401":{"description":"Auth"},"402":{"description":"No intro left"}}}},"/api/v1/wanted/{id}/decision":{"post":{"operationId":"decide_wanted","summary":"Buyer accepts or declines. Accept shares contact both ways. Decline returns the intro.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Decided"},"404":{"description":"Not found"}}}},"/api/v1/wanted/{id}/unlock":{"post":{"operationId":"unlock_wanted","summary":"Unlock a user-submitted wanted contact. Uses the monthly unlock allowance, then a paid credit. Public-source posts are already open.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Contact"},"401":{"description":"Auth"},"402":{"description":"No unlock left"}}}},"/api/wanted/confirm":{"get":{"operationId":"confirm_wanted","summary":"Publish a wanted post. Send Accept: application/json. text/html redirects to the post.","parameters":[{"name":"code","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Live post"},"400":{"description":"Used or invalid link"}}}},"/api/v1/data-requests":{"get":{"operationId":"list_data_requests","summary":"Public data-wanted teasers. Buyer email is omitted. The same data filters as listing search apply. A missing fact does not match.","parameters":[{"name":"vertical","in":"query","schema":{"type":"string"}},{"name":"data_type","in":"query","schema":{"type":"string"}},{"name":"license_scope","in":"query","schema":{"type":"string"}},{"name":"license_use","in":"query","schema":{"type":"string"}},{"name":"never_published","in":"query","schema":{"type":"string"}},{"name":"privacy","in":"query","schema":{"type":"string"}},{"name":"hipaa","in":"query","schema":{"type":"string"}},{"name":"consent_basis","in":"query","schema":{"type":"string"}},{"name":"min_headcount","in":"query","schema":{"type":"number"}},{"name":"min_years","in":"query","schema":{"type":"number"}},{"name":"min_tokens","in":"query","schema":{"type":"number"}},{"name":"fresh_after","in":"query","schema":{"type":"string"}},{"name":"fresh_before","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Requests"}}},"post":{"operationId":"post_data_request","summary":"Post a data-wanted request. Email is stored and kept off the public card.","responses":{"201":{"description":"Created"},"400":{"description":"Invalid"}}}},"/api/v1/data-requests/{id}/intro":{"post":{"operationId":"draft_data_intro","summary":"Draft a seller intro. One flat credit. Nothing is sent unless confirm is send.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Draft, not sent"},"401":{"description":"Auth"},"402":{"description":"No credits"}}}},"/api/v1/listings/{id}/decision":{"post":{"operationId":"decide_intro","summary":"Listing contact accepts or declines a sent introduction. Decline returns the outreach credit once. The unlock credit stays spent.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Already decided"},"201":{"description":"Decided"},"400":{"description":"Not the listing contact, or no intro"},"401":{"description":"Auth"}}}},"/api/v1/listings/{id}/reply":{"post":{"operationId":"reply_intro","summary":"Reply on an intro this account already has. No extra credit. Goes to the other side's registered email or https endpoint. The response does not include that address.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Sent"},"400":{"description":"Not a party, or no message"},"401":{"description":"Auth"}}}},"/api/v1/listings/{id}/matches":{"get":{"operationId":"list_matches","summary":"Buyers who opted in for this listing. Only the listing contact, or owner_token, can read them. Not a recommendation.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Opt-in buyers"},"401":{"description":"auth_required"},"404":{"description":"not_found"}}}},"/api/v1/monitors":{"post":{"operationId":"create_monitor","responses":{"201":{"description":"Saved monitor"}}}},"/api/v1/monitors/{id}":{"get":{"operationId":"read_monitor","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Matches"}}}},"/api/v1/tasks":{"post":{"operationId":"create_task","responses":{"201":{"description":"Research task"}}}},"/api/v1/tasks/{id}":{"get":{"operationId":"read_task","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Task"}}}},"/api/v1/searches":{"post":{"operationId":"save_search","responses":{"201":{"description":"Saved filter"}}}},"/api/v1/searches/{id}":{"get":{"operationId":"poll_search","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}},{"name":"since","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"Matches"}}}},"/api/mcp":{"post":{"operationId":"mcp","summary":"Streamable HTTP MCP endpoint. JSON-RPC methods initialize, tools/list, and tools/call.","responses":{"200":{"description":"JSON-RPC result"}}}}}}