VECK API Documentation
API v1Overview
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 DataDefault | Raw Data | |
|---|---|---|
| What you get | Cards — 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 filtering | VECK. 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 data | A 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 for | Daily 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.
Rate Limits
| Plan | Period | Default limit | Notes |
|---|---|---|---|
| free | lifetime | 500 requests total | Counter never resets |
| paid | daily | 1000 requests / UTC day | May be overridden per account |
Conventions
- Versioning — paths use
/v1/…. Discover endpoints via API Versions. - JSON bodies — use
Content-Type: application/jsonfor POST requests. - List responses — typically
dataplus optionalpaginationandmeta. - 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 hereThe 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.
/v1/cards/Get Cards List
Main parameters
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Records per page (max 100, default 20) |
| offset | integer | Offset from start (default 0) |
| include_total | boolean | Include total count in pagination (true by default). Set false to skip expensive count() |
| sort | string | Preset (trending, recent, most_active) or custom field:direction. Default: latest_signal_date:desc |
| include_user_data | boolean | Include favorites, notes, folders |
| view | string | default (full) or compact (lightweight) |
| fields | string | Comma-separated top-level fields, e.g. id,slug,name,image |
Filters
| Parameter | Type | Description |
|---|---|---|
| stages | string | Stage slugs (OR). See Reference Data → Stages |
| rounds | string | Round slugs (OR). See Reference Data → Rounds |
| categories | string | Category slugs (OR). See Reference Data → Categories |
| locations | string | Location slugs (OR). See Reference Data → Locations |
| participants | string | Participant slugs (OR) |
| source_types | string | Source-type slugs (OR). Filters by the first signal — same as Feed Settings → Source type. See Source types. |
| display_preference | string | web3, web2, or all |
| filter_id | integer | Saved filter ID |
| folder_ids | string | Comma-separated folder IDs |
| search | string | Text search; with semantic=1 becomes semantic search |
| semantic | string | 1 / true / yes — enable semantic ranking (requires search) |
| min_similarity | float | Cosine threshold for semantic search (default 0.3) |
| featured | boolean | Filter featured cards |
| new | boolean | Cards created in the last 7 days |
| trending | boolean | Filter trending cards |
| min_signals | integer | Minimum interactions count |
| max_signals | integer | Maximum interactions count |
| created_after | string | YYYY-MM-DD |
| created_before | string | YYYY-MM-DD |
| updated_after | string | YYYY-MM-DD |
| updated_before | string | YYYY-MM-DD |
| last_interaction_after | string | YYYY-MM-DD |
| last_interaction_before | string | YYYY-MM-DD |
| first_interaction_after | string | YYYY-MM-DD |
| first_interaction_before | string | YYYY-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
/v1/cards/Get Cards List (POST)
/v1/cards/example-founder/Get Card by Slug
linkedin_profile. linkedin_data is deprecated (temporary).| Parameter | Type | Description |
|---|---|---|
| include_user_data | boolean | Include favorites, notes, folders |
/v1/cards/example-founder/interactions/Get Card Interactions
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Page size (max 200, default 50) |
| offset | integer | Offset from start |
| include_total | boolean | Include total in pagination |
Reference Data
Load slug and ID lists from meta endpoints for filters and UI.
/v1/cards/source-types/Source types
| Label | Slug | Description |
|---|---|---|
| Social | social_interactions | Cards from tracked investor activity on social networks (follows, engagement, and similar interaction-based discovery) |
| Product Hunt | product_hunt | Product Hunt leaderboard / upvote signals |
| LinkedIn discovery signal types | ||
| GitHub | github | GitHub Trending / Rising sources |
| New company | new_company_registration | New company registration signal type |
/v1/cards/categories/Categories
Hierarchical categories for categories= filter.
/v1/cards/stages/Stages
/v1/cards/rounds/Rounds
/v1/cards/locations/Locations
/v1/cards/folders/User folders
/v1/cards/filters/Saved filters
Participants
Funds, investors, angels — list, detail, and batch fetch. List supports semantic search.
/v1/participants/Get Participants List
Main parameters
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Max 200, default 50 |
| offset | integer | Offset from start |
| include_total | boolean | Include pagination total (true by default) |
| sort | string | name (default) or most_active; or field:direction |
| include_user_data | boolean | Include is_saved |
Filters
| Parameter | Type | Description |
|---|---|---|
| type | string | Participant type slug |
| web3 | boolean | Web3 focus filter |
| web2 | boolean | Web2 focus filter |
| saved_only | boolean | Only saved participants |
| search | string | Name/description search; with semantic=1 becomes semantic search |
| semantic | string | 1 / true / yes — enable semantic ranking (requires search) |
| min_similarity | float | Cosine 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
/v1/participants/<slug>/Get Participant by Slug
| Parameter | Type | Description |
|---|---|---|
| include_user_data | boolean | Include is_saved |
/v1/participants/batch/Get Multiple Participants
| Parameter | Type | Description |
|---|---|---|
| slugsreq | string | Comma-separated slugs (max 100) |
| include_user_data | boolean | Include is_saved |
/v1/participants/types/Participant Types
Type slugs for the type= filter.
Trending on X
Startups gaining X followers the fastest. VECK checks the X account of every recently added project about once a day and ranks them by growth over the window. Rankings are recomputed at most once an hour.
/v1/trending/x/Get Trending on X
| Parameter | Type | Description |
|---|---|---|
| window | integer | Growth window in days: 7 (default) or 30 |
| sort | string | followers_gained (default) or growth_pct — relative gain, accounts with 200+ followers at the start of the window |
| limit | integer | Max 100, default 20 |
| offset | integer | Offset from the top of the ranking |
| include_sparkline | boolean | Add follower history over the window (up to 24 points) |
Each entry has the startup in the compact card shape — pass its slug to Get Card by Slug for full details — plus the X account, followers.baseline at the start of the window, followers.current, and growth as growth.absolute and growth.percent (a fraction: 0.25 is +25%). x.handle is null when the account is only known by its numeric ID.
meta.available_windows lists the windows accepted right now; a 90-day window will be added once enough follower history has been collected. Other window or sort values return 400 validation_error.
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.
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.
/v1/linkedin/profiles/Get LinkedIn Profiles List
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Max 200, default 50 |
| offset | integer | Offset |
| include_total | boolean | Pagination total |
| search | string | Keyword search over name, headline, summary |
| sort | string | created_at:desc (default); also updated_at, name |
| classification | string | strong_potential_founder, potential_founder, noise |
| path | string | declared_founder, imminent_founder |
| status | string | Exact status match, e.g. stealth, came_out_of_stealth. Ignored with collection |
| tags | string | Comma-separated tags (OR, exact match), e.g. ex-Google,Stanford |
| collection | string | Comma-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_at | string | Created on/after (ISO date or datetime) |
/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.
/v1/linkedin/collections/List Collections
slug— value for thecollectionparametername,description— human-readable labels
/v1/linkedin/profiles/?collection=european_foundersEuropean Founders
| Parameter | Type | Description |
|---|---|---|
| collectionreq | string | european_founders |
| created_at | string | Only profiles created on/after this moment (ISO date or datetime) |
| limit | integer | Max 200, default 50 |
| offset | integer | Offset |
| sort | string | created_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.
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 aseuropean_founders) plus the private collections assigned to the account.GET /v1/linkedin/profiles/requirescollection=<slug>; without it the response is400 validation_error.GET /v1/linkedin/profiles/<id>/returns404for profiles outside the account's collections, and omitsstatus,out_of_stealth_dateandnew_company.- Every other endpoint (cards, participants, Radar, …) returns
403 permission_denied.
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_trackingdefaults totrue, 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
failedwith details inradar_error; retry withPOST …/retry/. - Read updates —
GET /v1/radar/updates/. Toggle tracking or disconnect as needed.
/v1/radar/quota/Radar quota
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/.
/v1/radar/applications/Create application
Body
| Parameter | Type | Description |
|---|---|---|
| source | string | linkedin or x |
| username | string | LinkedIn or X username |
| linkedin_url | string | LinkedIn profile URL (instead of username) |
| x_url | string | X profile URL (instead of username) |
| x_user_id | string | Numeric X user id (instead of username) |
| is_tracking | boolean | Defaults to true — queued immediately. false — not queued |
connection and quota (no new application). Bulk: POST /v1/radar/applications/bulk/ with { source, applications: […] }./v1/radar/applications/<linkedin|x>/List applications
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Max 100, default 50 |
| offset | integer | Offset, default 0 |
| q | string | Search |
| is_tracking | boolean | true / false |
| init_status | string | idle | pending | processing | failed |
| sort | string | recent | name | company | tracked |
| order | string | asc | 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/.
/v1/radar/connections/<linkedin|x>/List connections
| Parameter | Type | Description |
|---|---|---|
| limit | integer | Max 100, default 50 |
| offset | integer | Offset, default 0 |
| q | string | Search |
| is_tracking | boolean | true / false |
| sort | string | recent | name | company | tracked |
| order | string | asc | desc |
/v1/radar/connections/<linkedin|x>/<id>/Get connection by 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).
/v1/radar/updates/meta/Updates meta
/v1/radar/updates/List updates
| Parameter | Type | Description |
|---|---|---|
| connection_id | integer | Filter to one connection (prefer with source) |
| is_tracking | boolean | Tracking on / off only |
| change_type / change_types | string | Value from /updates/meta/ (e.g. company_move). May be null |
| source | string | linkedin | x |
| limit | integer | Max 100, default 50 |
| offset | integer | Offset, 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.
/API Versions
/v1/token/validate/Validate Token
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