Skip to main content

Python SDK for the Lighthouse REST API (CRM, Discovery, Reports, Documents).

Project description

Lighthouse Python SDK

Official Python client for the Lighthouse REST API. Wraps the CRM, Discovery, Reports, and Documents endpoints behind a single typed Lighthouse class.

Installation

pip install lighthouse-private-markets-sdk

Quick Start

Generate an API key at Settings → API Keys in your Lighthouse workspace.

from lighthouse import Lighthouse

client = Lighthouse("lgt_live_...")

# Who am I?
me = client.users.me()
print(me.data)

# Search your CRM
res = client.records.search(
    "company",
    filters={
        "operator": "AND",
        "conditions": [
            {"field": "domain", "operator": "contains_any", "value": ["acme.com"]}
        ],
    },
    limit=10,
)
print(res.data, res.meta)

Every method returns an APIResponse:

class APIResponse:
    data:   Any                    # response payload
    error:  Any | None             # error message if the call failed
    meta:   dict | None            # pagination/meta info (when present)
    status: int                    # HTTP status code

res.raise_for_error()              # raises LighthouseError if error is set

Authentication

The client sends Authorization: Bearer <api_key> on every request. Keep API keys secret — never ship them in client-side code.

Resources

Namespace Endpoints
client.records search / get / create / update / delete records (company, person, deal, custom objects)
client.lists list / get / create / update / delete, get_records, add_record, remove_record, share/revoke teams, update_sharing
client.notes list / get / create / delete, link_record, unlink_record
client.tasks list / get / create / update / delete
client.attributes list / get / create / update / delete, colors
client.options list / create / delete select-field options
client.views list / get / update / delete, share/revoke teams, update_sharing
client.users me, list, get
client.teams list, get
client.dashboards list / get / create / update / delete, list_widgets, create_widget, update_widget, delete_widget, widget_data, share/revoke teams
client.discovery get_attributes, search_companies, search_people, semantic_search_companies, semantic_search_people, lookup_companies_by_domain, lookup_companies_by_linkedin, lookup_people_by_linkedin, get_saved_searches, get_search_results, get_locations, get_industries, get_tags, search_investors, search_organizations, search_schools
client.documents folders + files (v2): list_folders, create_folder, update_folder, delete_folder, link/unlink_folder, upload_url, get_file, update_file, delete_file, link/unlink_file, list_record_documents, upload() one-shot helper

Examples

Records

# Create
created = client.records.create("company", data={
    "name": "Acme",
    "domain": ["acme.com"],
})
record_id = created.data["id"]

# Update — relation fields are replaced entirely; pass the full desired array
client.records.update("company", record_id, data={"domain": ["acme.com", "acme.io"]})

# Get
client.records.get("company", record_id)

# Delete
client.records.delete("company", record_id)

Filtering with attributes

attrs = client.attributes.list(record_type="company").data
# pick a field permalink from attrs, then:
client.records.search(
    "company",
    filters={
        "operator": "AND",
        "conditions": [{"field": "headcount", "operator": "gte", "value": 50}],
    },
    sort=[{"field": "name", "direction": "asc"}],
    limit=25,
)

Lists

new_list = client.lists.create(name="Hot leads", record_type="company")
list_id = new_list.data["id"]

client.lists.add_record(list_id, record_id="…uuid…")
client.lists.get_records(list_id, limit=50)

Notes

client.notes.create(
    title="Intro call",
    content="<p>Met the founder, looking strong.</p>",
    records={"company": ["…uuid…"], "person": ["…uuid…"]},
    tags=["follow_up"],
)

# Manage the workspace tag vocabulary and attach tags to a note.
tag = client.note_tags.create("Follow up")
client.notes.add_tags("…note_uuid…", tags=[tag.data["permalink"]])

Tasks

client.tasks.create(
    title="Send follow-up",
    due_date="2026-06-01",
    assigned_to=["…user_uuid…"],
    records={"company": ["…uuid…"]},
)

tasks.list() filters and sorts on these fields: title, status, priority, due_date, created_at, updated_at, assigned_to, created_by, records, plus any custom task field permalinks. Status values are workspace-specific (fetch the valid values with client.options.list("task", "status")).

client.tasks.list(
    filters={
        "operator": "AND",
        "conditions": [{"field": "status", "operator": "eq", "value": "todo"}],
    },
    sort=[{"field": "due_date", "direction": "asc"}],
    limit=50,
)

Discovery

# Always inspect attributes first to discover valid field keys
client.discovery.get_attributes(type="company")

# Search Lighthouse's global database
res = client.discovery.search_companies(
    filters={
        "operator": "AND",
        "conditions": [
            {"field": "company_hq_country", "operator": "contains_any", "value": ["US"]},
            {"field": "company_headcount", "operator": "between", "value": {"min": 10, "max": 200}},
        ],
    },
    limit=25,
)

# Enrich by domain / LinkedIn
client.discovery.lookup_companies_by_domain(["stripe.com", "openai.com"])

# Semantic search with a plain-language query (optionally narrowed by filters)
res = client.discovery.semantic_search_companies(
    "climate fintech startups building carbon accounting software",
    filters={
        "operator": "AND",
        "conditions": [
            {"field": "company_hq_country", "operator": "contains_any", "value": ["US"]},
        ],
    },
    min_similarity=0.5,
    limit=25,
)

Documents

# One-shot helper handles upload-url + the multipart POST upload
with open("pitch.pdf", "rb") as f:
    file = client.documents.upload(
        name="pitch.pdf",
        content=f.read(),
        content_type="application/pdf",
        sharing_status="WORKSPACE",
    )
file_id = file.data["id"]

# Attach to a record
client.documents.link_file_to_record(file_id, "company", "…uuid…")

Error handling

from lighthouse import Lighthouse, LighthouseError

client = Lighthouse("lgt_live_…")
try:
    res = client.records.search("company")
    res.raise_for_error()
    print(res.data)
except LighthouseError as e:
    print(f"API error ({e.status_code}):", e)

Low-level escape hatch

For endpoints not yet wrapped by a namespace:

res = client.request("GET", "/v1/some/new/endpoint", params={"foo": "bar"})
res = client.request("POST", "/v1/some/other", json={"hello": "world"})

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

lighthouse_private_markets_sdk-0.5.0.tar.gz (13.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

File details

Details for the file lighthouse_private_markets_sdk-0.5.0.tar.gz.

File metadata

File hashes

Hashes for lighthouse_private_markets_sdk-0.5.0.tar.gz
Algorithm Hash digest
SHA256 298979f70c778670509e6727a87622381d646a26b7c9d09f8965696b0c80ad54
MD5 dc911adb33a457d59fbc26b7d2bd458b
BLAKE2b-256 1b600414d472098c343b9747f89a5ff53d8018e6256878156c09b9103a4d9bdf

See more details on using hashes here.

File details

Details for the file lighthouse_private_markets_sdk-0.5.0-py3-none-any.whl.

File metadata

File hashes

Hashes for lighthouse_private_markets_sdk-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 b2f8567241a79ee101247bd714903135069002a3cc66b45e2b0baa92b2b887e7
MD5 941c2da3980cdc7cc0016805850b3280
BLAKE2b-256 b07679ac7d46b92ffd1428ba6f24b45214f395f52a1c94ccf0074fca0d1a81d7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page