VECK API Documentation

API v1
Ask in:

Overview

REST API for venture capital monitoring, in three parts: Veck Curated Data — cards (projects / signals), participants, interactions and reference data; Raw Data — the LinkedIn profile dataset and collections behind them; and Radar — profile updates for LinkedIn and X people you follow. Additional covers utilities, the field glossary and conventions. All routes are versioned under /v1/.

Curated vs raw data

Most VC workflows only need Veck Curated Data. Reach for Raw Data when you want to apply your own criteria to the pool the curated feed is drawn from.

Veck Curated DataDefaultRaw Data
What you getCards — companies and projects VECK has verified — plus the founders and investors behind them.Profiles of potential and declared founders, straight from the discovery pipeline, before any of them becomes a card.
Example
Example FounderReviewed by VECK

Building an AI product in stealth. Previously an engineering lead at a healthcare company.

SeedRaising NowAISaaS

San Francisco, CA

Response excerpt
{
  "name": "Example Founder",
  "stage": {
    "name": "Seed",
    "slug": "seed"
  },
  "round": {
    "name": "Raising Now",
    "slug": "raising_now"
  },
  "categories": [
    {
      "name": "AI",
      "slug": "ai"
    },
    {
      "name": "SaaS",
      "slug": "saas"
    }
  ],
  "location": {
    "formatted": "San Francisco, CA",
    "city": "San Francisco",
    "country": "United States"
  }
}
Example Founderstrong_potential_founder

Founder · AI · Previously Example Corp

declared_founderactive
Example Job Seekernoise

Open to work · Senior Account Executive

got_a_job
Response excerpt
[
  {
    "name": "Example Founder",
    "headline": "Founder · AI · Previously Example Corp",
    "classification": "strong_potential_founder",
    "path": "declared_founder",
    "status": "active"
  },
  {
    "name": "Example Job Seeker",
    "headline": "Open to work · Senior Account Executive",
    "classification": "noise",
    "path": null,
    "status": "got_a_job"
  }
]
Who does the filteringVECK. Every card is reviewed, enriched and classified before you see it.You do. The feed keeps everything the pipeline found, including profiles classified as noise.
Shape of the dataA smaller, high-precision set with stage, round, category, location and linked participants.The full discovery pool with classification, path and status, so you can set your own bar.
Best forDaily deal flow — meetings you can take this week.Your own screens, scoring models and watchlists.
Endpoints/v1/cards//v1/participants//v1/linkedin/profiles//v1/linkedin/collections/

Quick start

Base URL: https://api.theveck.com

Header: Authorization: Token <your_token> on every request

Try it: set your token once, then every example on this page runs as a copy-paste curl:

export VECK_TOKEN=<your_token>
curl "https://api.theveck.com/v1/cards/?limit=10" \
  -H "Authorization: Token $VECK_TOKEN"

Authentication

Every endpoint requires a valid API token in the Authorization header using the Token scheme. A missing token returns 401 not_authenticated; an invalid, expired or inactive one returns 401 authentication_failed. Use Validate Token to inspect plan, rate limits, and capabilities.

For partners. Agent and partner apps can also use OAuth 2.0 (Authorization Code + PKCE). Contact us for client registration and redirect URIs. Day-to-day API clients use a dashboard token as above.

Rate Limits

PlanPeriodDefault limitNotes
freelifetime500 requests totalCounter never resets
paiddaily1000 requests / UTC dayMay be overridden per account

Conventions

  • Versioning — paths use /v1/…. Discover endpoints via API Versions.
  • JSON bodies — use Content-Type: application/json for POST requests.
  • List responses — typically data plus optional pagination and meta.
  • Field semantics — required fields are always present; optional values may be null.
  • Per-account endpoints — some resources are enabled per account and reported in the catalog and in token capabilities (e.g. LinkedIn profiles).

Part

Veck Curated Data

Start here

The default feed: companies and projects VECK has reviewed, enriched and classified, plus the founders and investors behind them. Start here unless you specifically want the unfiltered pool.

Cards

List and inspect cards (projects / signals): pagination, filters, semantic search, detail and interactions.

GET/v1/cards/

Get Cards List

Paginated card list with sorting, filtering, and optional semantic search.

Main parameters

ParameterTypeDescription
limitintegerRecords per page (max 100, default 20)
offsetintegerOffset from start (default 0)
include_totalbooleanInclude total count in pagination (true by default). Set false to skip expensive count()
sortstringPreset (trending, recent, most_active) or custom field:direction. Default: latest_signal_date:desc
include_user_databooleanInclude favorites, notes, folders
viewstringdefault (full) or compact (lightweight)
fieldsstringComma-separated top-level fields, e.g. id,slug,name,image

Filters

ParameterTypeDescription
stagesstringStage slugs (OR). See Reference Data → Stages
roundsstringRound slugs (OR). See Reference Data → Rounds
categoriesstringCategory slugs (OR). See Reference Data → Categories
locationsstringLocation slugs (OR). See Reference Data → Locations
participantsstringParticipant slugs (OR)
source_typesstringSource-type slugs (OR). Filters by the first signal — same as Feed Settings → Source type. See Source types.
display_preferencestringweb3, web2, or all
filter_idintegerSaved filter ID
folder_idsstringComma-separated folder IDs
searchstringText search; with semantic=1 becomes semantic search
semanticstring1 / true / yes — enable semantic ranking (requires search)
min_similarityfloatCosine threshold for semantic search (default 0.3)
featuredbooleanFilter featured cards
newbooleanCards created in the last 7 days
trendingbooleanFilter trending cards
min_signalsintegerMinimum interactions count
max_signalsintegerMaximum interactions count
created_afterstringYYYY-MM-DD
created_beforestringYYYY-MM-DD
updated_afterstringYYYY-MM-DD
updated_beforestringYYYY-MM-DD
last_interaction_afterstringYYYY-MM-DD
last_interaction_beforestringYYYY-MM-DD
first_interaction_afterstringYYYY-MM-DD
first_interaction_beforestringYYYY-MM-DD

Semantic search

With semantic=1 and search, cards are ranked by cosine similarity. Other filters apply first. Each result may include similarity (0.0–1.0). Default min_similarity=0.3.

Filtering logic

  • Different filter groups combine with AND (except stages and rounds)
  • Values within a group combine with OR
  • Stages and rounds combine with OR between each other
  • source_types=linkedin,github&categories=ai — first signal is LinkedIn OR GitHub, AND category ai
POST/v1/cards/

Get Cards List (POST)

Same behavior as GET, but parameters are sent as JSON. Use for large filter sets.
Lists are arrays in JSON, not comma-separated strings. All GET parameters are supported.
GET/v1/cards/example-founder/

Get Card by Slug

LinkedIn on cards: use linkedin_profile. linkedin_data is deprecated (temporary).
ParameterTypeDescription
include_user_databooleanInclude favorites, notes, folders
GET/v1/cards/example-founder/interactions/

Get Card Interactions

Full interaction history for a card with pagination.
ParameterTypeDescription
limitintegerPage size (max 200, default 50)
offsetintegerOffset from start
include_totalbooleanInclude total in pagination

Reference Data

Load slug and ID lists from meta endpoints for filters and UI.

GET/v1/cards/source-types/

Source types

Filter values for source_types=. Looks at the card's earliest signal; multiple values are OR'd.
LabelSlugDescription
Socialsocial_interactionsCards from tracked investor activity on social networks (follows, engagement, and similar interaction-based discovery)
Product Huntproduct_huntProduct Hunt leaderboard / upvote signals
LinkedInlinkedinLinkedIn discovery signal types
GitHubgithubGitHub Trending / Rising sources
New companynew_company_registrationNew company registration signal type
GET/v1/cards/categories/

Categories

Hierarchical categories for categories= filter.

GET/v1/cards/stages/

Stages

GET/v1/cards/rounds/

Rounds

GET/v1/cards/locations/

Locations

Hierarchical regions and cities for the locations= filter.
GET/v1/cards/folders/

User folders

Your folders and card counts. Use folder_ids= with list endpoints.
GET/v1/cards/filters/

Saved filters

Saved filter presets. Apply one with filter_id= on card list.

Participants

Funds, investors, angels — list, detail, and batch fetch. List supports semantic search.

GET/v1/participants/

Get Participants List

Paginated participant list with filtering and optional semantic search.

Main parameters

ParameterTypeDescription
limitintegerMax 200, default 50
offsetintegerOffset from start
include_totalbooleanInclude pagination total (true by default)
sortstringname (default) or most_active; or field:direction
include_user_databooleanInclude is_saved

Filters

ParameterTypeDescription
typestringParticipant type slug
web3booleanWeb3 focus filter
web2booleanWeb2 focus filter
saved_onlybooleanOnly saved participants
searchstringName/description search; with semantic=1 becomes semantic search
semanticstring1 / true / yes — enable semantic ranking (requires search)
min_similarityfloatCosine threshold for semantic search (default 0.3)

Semantic search

With semantic=1 and search, participants are ranked by cosine similarity to the query — useful for queries like "web3 venture fund" even when those exact words are not in the profile. Other filters (type, web3, web2, saved_only) apply first. Each result may include similarity (0.0–1.0). Response meta.semantic echoes enabled, min_similarity, and ranking. Default min_similarity=0.3. If embeddings are unavailable, the API may return 503 with semantic_unavailable.

Example: GET /v1/participants/?search=web3+fund&semantic=1&limit=20

GET/v1/participants/<slug>/

Get Participant by Slug

ParameterTypeDescription
include_user_databooleanInclude is_saved
GET/v1/participants/batch/

Get Multiple Participants

ParameterTypeDescription
slugsreqstringComma-separated slugs (max 100)
include_user_databooleanInclude is_saved
GET/v1/participants/types/

Participant Types

Type slugs for the type= filter.

Part

Raw Data

The unfiltered pool behind the curated feed: the full LinkedIn dataset and named collections such as European Founders. Nothing here has been through review, so you apply your own criteria. See Curated vs raw data for the trade-off. This is VECK-processed profile data — not the LinkedIn API.

Raw Data is switched on per account. If a request returns 403 permission_denied, ask your VECK manager to enable it. Validate Token reports the current state in capabilities.linkedin_profiles.allowed.

All LinkedIn Data

Every unique LinkedIn profile VECK has collected and enriched — potential and declared founders with classification, path, status and tags. Newest first by default; duplicate records for the same person are collapsed to the most recently updated one.

GET/v1/linkedin/profiles/

Get LinkedIn Profiles List

ParameterTypeDescription
limitintegerMax 200, default 50
offsetintegerOffset
include_totalbooleanPagination total
searchstringKeyword search over name, headline, summary
sortstringcreated_at:desc (default); also updated_at, name
classificationstringstrong_potential_founder, potential_founder, noise
pathstringdeclared_founder, imminent_founder
statusstringExact status match, e.g. stealth, came_out_of_stealth. Ignored with collection
tagsstringComma-separated tags (OR, exact match), e.g. ex-Google,Stanford
collectionstringComma-separated collection slugs (OR), e.g. european_founders. See List Collections. Unknown or inactive slugs, and private collections not assigned to your account, return 400 validation_error
created_atstringCreated on/after (ISO date or datetime)
GET/v1/linkedin/profiles/5001/

Get LinkedIn Profile by ID

Same fields as a list item, wrapped in data.

linkedin.url is often the member-ID form (/in/ACwAA…) and linkedin.urn is that bare member ID. linkedin.image_url is usually a LinkedIn media link that expires after about two weeks. Experience dates are YYYY-MM-DD; timestamps are UTC ISO 8601 with microseconds.

Collections

Named streams of profiles that VECK curates and keeps topping up as new people are discovered. Each collection is a filter on the same profiles endpoint (collection=<slug>), so the payload matches All LinkedIn Data without the curator-set fields (see below). Currently available: European Founders, plus private collections built for individual clients.

GET/v1/linkedin/collections/

List Collections

Named collections you can pass to collection= on the profiles endpoint. Lists the active collections available to your account, including any private collections assigned to it.
  • slug — value for the collection parameter
  • name, description — human-readable labels
GET/v1/linkedin/profiles/?collection=european_founders

European Founders

Founders and C-level operators located in Europe, from every VECK discovery stream: anyone whose LinkedIn location names a European country or hub city, plus a daily watch for European founders moving into stealth ventures. VECK keeps adding people as they are discovered. Newest first by default.
ParameterTypeDescription
collectionreqstringeuropean_founders
created_atstringOnly profiles created on/after this moment (ISO date or datetime)
limitintegerMax 200, default 50
offsetintegerOffset
sortstringcreated_at:desc (default)

The other profile filters (classification, path, search, …) combine with the collection; status is ignored.

Collection profiles omit status, out_of_stealth_date and new_company. Collection members are discovered automatically, and those fields are only set after manual review.

Keeping a copy in sync. created_at is when VECK first stored the profile, not when it joined the collection. Someone VECK already knew joins when they update their location to Europe, and keeps their older created_at, so polling with created_at=<last seen> misses them. Page through the whole collection on each daily sync (200 per request) and upsert by linkedin.url; anyone missing from the latest pull has left the collection.

Private collections

VECK can build a collection for a single client — for example people from your portfolio companies. A private collection works like any other: it shows up in List Collections and you read it with GET /v1/linkedin/profiles/?collection=<slug>. It is visible only to the accounts it is assigned to; for anyone else its slug behaves exactly like one that does not exist (400 validation_error).

Collections-only accounts

An account can be limited to LinkedIn collections, without access to the rest of the API. Validate Token returns "scope": "collections_only" for these accounts ("full" otherwise), and:

  • GET /v1/linkedin/collections/ lists the shared collections (such as european_founders) plus the private collections assigned to the account.
  • GET /v1/linkedin/profiles/ requires collection=<slug>; without it the response is 400 validation_error.
  • GET /v1/linkedin/profiles/<id>/ returns 404for profiles outside the account's collections, and omits status, out_of_stealth_date and new_company.
  • Every other endpoint (cards, participants, Radar, …) returns 403 permission_denied.
Syncing a private collection. A person VECK already knew can be added to a collection later and keeps their original created_at, so polling with created_at=<last seen> can miss them. Private collections are usually small — page through the whole collection on each run (up to 200 per request) and upsert by linkedin.url.

Part

Radar

Follow LinkedIn and X profiles for profile updates — career moves, bio and headline changes, and similar signals. Same auth as the rest of the API.

Getting started

Add a profile, wait for it to become a connection, then read its updates.

Base path: /v1/radar/. Sources: linkedin and x — IDs are never mixed; always send source on create.

How it works

  • Add a profile — POST /v1/radar/applications/ (or bulk). is_tracking defaults to true, so the application is queued immediately.
  • Wait for a connection — on success the application becomes a connection. You cannot create connections yourself. On failure, status is failed with details in radar_error; retry with POST …/retry/.
  • Read updates — GET /v1/radar/updates/. Toggle tracking or disconnect as needed.
GET/v1/radar/quota/

Radar quota

Tracking limits for LinkedIn and X.
Current quota is also returned on create, tracking, and delete responses (including bulk).

Applications

Tracking requests. While an application is in the queue, there is no connection yet. Lists always include a source: /v1/radar/applications/linkedin/ or …/x/.

POST/v1/radar/applications/

Create application

Add a profile to Radar. source is required. is_tracking defaults to true.

Body

ParameterTypeDescription
sourcestringlinkedin or x
usernamestringLinkedIn or X username
linkedin_urlstringLinkedIn profile URL (instead of username)
x_urlstringX profile URL (instead of username)
x_user_idstringNumeric X user id (instead of username)
is_trackingbooleanDefaults to true — queued immediately. false — not queued
If the profile is already tracked, the response returns the existing connection and quota (no new application). Bulk: POST /v1/radar/applications/bulk/ with { source, applications: […] }.
GET/v1/radar/applications/<linkedin|x>/

List applications

Application queue for one source. Check init_status and radar_error.
ParameterTypeDescription
limitintegerMax 100, default 50
offsetintegerOffset, default 0
qstringSearch
is_trackingbooleantrue / false
init_statusstringidle | pending | processing | failed
sortstringrecent | name | company | tracked
orderstringasc | desc

Tracking: PATCH …/applications/<source>/<id>/tracking/ with { is_tracking }. Bulk tracking: PATCH /v1/radar/applications/bulk-tracking/. Retry on failure: POST …/retry/. Remove: DELETE / bulk-delete.

Connections

Connected profiles after a successful application. Lists always include a source: /v1/radar/connections/linkedin/ or …/x/.

GET/v1/radar/connections/<linkedin|x>/

List connections

ParameterTypeDescription
limitintegerMax 100, default 50
offsetintegerOffset, default 0
qstringSearch
is_trackingbooleantrue / false
sortstringrecent | name | company | tracked
orderstringasc | desc
GET/v1/radar/connections/<linkedin|x>/<id>/

Get connection by ID

Profile detail. Profile updates are separate: /updates/?connection_id=.

LinkedIn: career (career.current / history), education, skills. X: profile and activity — recent tweets and following (a connection snapshot, not the updates feed).

Tracking: PATCH …/tracking/ with { is_tracking }. Disconnect: DELETE. Bulk: PATCH /connections/bulk-tracking/, POST /connections/bulk-delete/ — require source and ids.

Updates

Profile-update feed for your connections (career and profile on LinkedIn, bio on X).

GET/v1/radar/updates/meta/

Updates meta

Filter values: sources and change_types.
GET/v1/radar/updates/

List updates

Paginated feed. Each update includes description, change_type, body, detected_at, and connection.
ParameterTypeDescription
connection_idintegerFilter to one connection (prefer with source)
is_trackingbooleanTracking on / off only
change_type / change_typesstringValue from /updates/meta/ (e.g. company_move). May be null
sourcestringlinkedin | x
limitintegerMax 100, default 50
offsetintegerOffset, default 0
body.variant may be career_change, combined, or x_bio_change — check the current / previous shape in the response. The example above is career_change.

Part

Additional

Utilities, field glossary and conventions that apply across every endpoint.

Utilities

Discovery and token validation.

GET/

API Versions

No authentication required. Returns the public API catalog.
GET/v1/token/validate/

Validate Token

Confirm the token and inspect plan, rate limits, and capabilities. scope is full, or collections_only for accounts limited to LinkedIn collections.

Glossary

Field reference for JSON payloads. Presence: required, optional, nullable, semantic only.

Card attributes

List (default view): id, slug, name, public_url, interactions_count, trending, stage, round, categories, created_at, updated_at, social_links, open_to_intro, has_intro_request. Optional/nullable: description, image, url, location, last_round, interaction timestamps. With semantic=1: similarity on each item.

Detail only: people, linkedin_profile (recommended), linkedin_data (deprecated), interactions (up to 20), has_more_interactions, more, employment_data.

linkedin_profile: id, name, headline, summary, location, linkedin (url, image_url, urn), education [{school, degree}], experience [{title, company, startDate, endDate, location, description}], notable_achievements, new_company, tags. Omits classification/path/status/timestamps (those are on LinkedIn Profiles API).

Participant attributes

slug, name, type, web3, web2, monthly_signals; optional alt_name, email, image, about, associated_with, sources (detail). With include_user_data: is_saved on the participant object. With semantic=1: similarity on each list item; see Semantic search.

Interaction attributes

id, created_at, participant (name, slug, type), associated_participant (nullable).

Pagination attributes

limit, offset, total (null when include_total=false), has_next.

Notes

Error Handling

Errors are JSON: { "error", "message" }

  • 401 — invalid or missing token
  • 403 — permission_denied
  • 404 — not found
  • 429 — rate limit exceeded
  • 503 — semantic_unavailable

Response Format

Successful responses contain data. Lists may include pagination and meta.

Date Formats

  • Request filters: YYYY-MM-DD
  • Response datetimes: ISO 8601 UTC
  • last_round: YYYY-MM-DD only