Insert a single company row into a list. Name is required; domain is deduplicated per list.
name — everything else (domain, linkedinUrl, industry/size/funding/location, etc.) is optional and maps to matching columns on list_company_rows.
Domain is lowercased before insert and enforced unique per list at the database level. Submitting a company whose domain or name matches the caller’s blocklist is rejected with a 400 — clear the blocklist entry or use a different identifier.
Unlike listListCompanies (which returns camelCase rows), this endpoint returns the raw snake_case DB row. If you need camelCase, fetch the company via getListCompany after insert.
listListCompanies first if you want to avoid near-duplicates by name.Blocklist. The caller’s blocked_companies is checked on both domain and name. A match on either returns 400 with error: "Company is blocked". There is no override flag on this endpoint — unblock first via the blocklist endpoint, then retry.Response shape mismatch. This POST returns snake_case ({ company: { list_id, logo_url, ... } }), whereas GET returns camelCase ({ company: { listId, logoUrl, ... } }). Don’t reuse the same parser for both.Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
List UUID
^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$All optional except name. Only name and domain are read from the top level; the rest are mapped via a camelCase → snake_case field map.
Company name. Required.
1Company domain. Lowercased before insert. Unique per list — a duplicate returns 409.
LinkedIn company-page URL.
Free-form size string (e.g. "51-200", "1k-5k").
-9007199254740991 <= x <= 9007199254740991-9007199254740991 <= x <= 9007199254740991Company inserted. Raw snake_case row returned.
Raw Supabase row (snake_case). Unlike GET, this POST returns the DB row directly without the toCompanyRow transform.