Ask in:

VECK API DocumentationAPI v1

REST API for seamless integration into venture capital monitoring and internal workflows: cards (projects / signals), participants (funds, investors, people), interactions, and reference data for filters. All routes are versioned under /v1/.

Overview

Quick start

Minimal request

  • Base URL: https://api.theveck.com
  • Header: Authorization: Token <your_token> on every request
  • Example: GET https://api.theveck.com/v1/cards/?limit=10

Authentication

Every endpoint requires a valid API token. Send it in the Authorization header using the Token scheme (see Quick start). Invalid or missing credentials result in 401 (see Error Handling).

Conventions

TopicRule
VersioningAll paths use /v1/…
JSON bodiesUse Content-Type: application/json when a body is required (e.g. Get Cards List (POST))
List responsesTypically data plus optional pagination and meta (Response Format)
Field semanticsRequired fields are always present. Optional values may be null; this doc uses `type
Response shapeGlossary lists fields with a Presence column (required, optional, nullable, semantic only).
DatesRequest filters: YYYY-MM-DD. Response datetimes: ISO 8601 UTC. Details: Date Formats

Where to read next: endpoint details under Cards and Participants; valid slugs under Reference Data; response field reference under Glossary; errors and payload shape under Notes.


Cards

List and inspect cards (projects / signals): pagination, filters, semantic search, detail and interactions. Use Reference Data below for slug values used in query parameters.

Get Cards List (GET)

GET /v1/cards/

Get a list of signal cards (projects) with pagination, sorting, and filtering support.

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() on large filtered datasets
sortstringPreset or custom sort (default: latest_signal_date:desc)
include_user_databooleanInclude favorites, notes, folders
viewstringResponse preset: default (full payload) or compact (lightweight payload)
fieldsstringOptional comma-separated top-level fields, for example fields=id,slug,name,image,similarity

Sort presets

PresetDescription
trendingBy interactions count (desc), then latest signal date (desc)
recentBy creation date (desc)
most_activeBy update date (desc), then interactions count (desc)

Custom sort: field:direction or field1:dir1,field2:dir2
Available fields: created_at, updated_at, name, interactions_count, latest_signal_date
Directions: asc, desc

Filters

ParameterTypeDescription
stagesstringComma-separated stage slugs, for example stages=seed,series_a. Values: stages
roundsstringComma-separated round slugs, for example rounds=raising_now,just_raised. Values: rounds
categoriesstringComma-separated category slugs, for example categories=ai,saas. Values: categories
locationsstringComma-separated location slugs, for example locations=san_francisco_ca,bay_area. Values: locations
participantsstringComma-separated participant slugs, for example participants=investor-fund. Values: participants
display_preferencestringweb3, web2, or all
filter_idintegerSaved filter ID. Values: saved filters
folder_idsstringComma-separated folder IDs, for example folder_ids=1,2,3. Values: user folders
searchstringSearch by card name/description; with semantic=1 it becomes semantic search
featuredbooleanFilter featured cards (true / false)
newbooleanOnly cards created in the last 7 days (true)
trendingbooleanFilter trending cards (true / false)
min_signalsintegerMinimum number of interactions
max_signalsintegerMaximum number of interactions

Semantic search (cards)

What it is: Semantic search finds cards by meaning and context, not just by exact words. For example, a query like "crypto exchange" can match projects about DeFi or trading platforms even if those exact words are not in the card text. Results are ordered by how closely they match the intent of your query.

  • semantic (boolean-like string) — enables this search mode when used together with search:

    • Allowed values: 1, true, yes (case-insensitive)
    • Behavior:
      • Text from search is transformed into semantic vectors by our internal retrieval pipeline.
      • All other filters (stages, rounds, categories, locations, participants, etc.) are applied first.
      • Matching cards with non-null embeddings are ordered by cosine similarity to the query embedding.
      • Results are filtered by relevance threshold (default min_similarity=0.3).
      • Each result includes a similarity field (0.0-1.0) indicating how well it matches the query.
      • Pagination (limit, offset) works as usual.
    • If embeddings are temporarily unavailable, the API may return 503 with error: "semantic_unavailable".
  • min_similarity (float) — minimum cosine similarity threshold for semantic search (only used with semantic=1):

    • Range: 0.0 to 1.0 (where 1.0 = perfect match, 0.0 = no similarity)
    • Practical range: 0.3 to 0.9 (values above 0.9 are extremely rare and indicate near-perfect matches)
    • Default: 0.3 (filters out clearly irrelevant results while keeping good matches)
    • Recommended values:
      • 0.7-0.9 — very strict (only highly relevant results, fewer matches)
      • 0.5-0.7 — strict (good quality results)
      • 0.3-0.5 — default (balanced, filters obviously irrelevant)
      • 0.0-0.3 — lenient (more results, may include less relevant)
    • Higher values = more relevant results, but fewer matches
    • Lower values = more results, but may include less relevant ones
    • Note: Setting min_similarity above 0.9 will likely return very few or no results, as perfect matches are extremely rare

Semantic metadata in response: when semantic=1, response includes meta.semantic with enabled, min_similarity, and ranking so clients can render/debug ranking mode.

Date Filters

ParameterDescription
created_after, created_beforeCard creation date (format: YYYY-MM-DD)
updated_after, updated_beforeCard update date
last_interaction_after, last_interaction_beforeLast interaction date
first_interaction_after, first_interaction_beforeFirst interaction date

Filtering Logic

  • Different filter groups are combined with AND (except stages and rounds)
  • Values within each group are combined with OR
  • Stages and rounds are combined with OR — if both stages and rounds are specified, cards matching either the stage OR the round will be returned
  • When a parent category is specified, all child categories are automatically included
  • When a region is specified, cards from all locations in that region are returned

Examples:

  • stages=seed&rounds=raising_now — returns cards with stage seed OR round raising_now
  • stages=seed,series_a&categories=ai — returns cards with stage seed OR series_a, AND category ai

Example Request

GET /v1/cards/?limit=20&offset=0&sort=trending&categories=ai,saas&stages=seed&include_user_data=true
Authorization: Token <your_token>

Example Response

meta.sort echoes the effective sort preset or custom sort string from the request. meta.fields is the sorted selected field allowlist (view, default set, or fields=). Some keys (e.g. similarity) are only present on each card when semantic search is enabled; they may still appear in meta.fields as part of the default template.

Response fields (cards list)

  • Always present in default view (required): id, slug, name, public_url, interactions_count, trending, stage, round, categories, created_at, updated_at, social_links, open_to_intro, has_intro_request. The stage and round objects always have name; slug may be null.
  • User-scoped optional field: user_data is included in personalized mode (include_user_data=true); note and folders inside it may be null/empty.
  • May be null (optional): description, image, url, location, last_round, last_interaction_at, first_interaction_at. If location is present, its subfields (formatted, slug, city, state, country, region, region_slug, type) may be null.
  • Semantic search only: similarity (float, 0.0-1.0) — cosine similarity score indicating how well the card matches the semantic query. Only present when semantic=1 is used. Higher values (closer to 1.0) indicate better matches. Practical range: typically 0.3-0.9; values above 0.9 are extremely rare.
  • Field selection: when fields or view=compact is used, response includes the selected subset of top-level fields.

Get Cards List (POST)

POST /v1/cards/

Same listing and filtering behavior as Get Cards List (GET), but parameters are sent in a JSON body. Use this when filters are too large for a query string (e.g. many categories or participant slugs).

Important: POST accepts the same parameters as GET, but in the JSON body. Lists are arrays, not comma-separated strings.

Request body (JSON)

All parameters mirror GET; passing details:

  • limit (integer) — number of records per page (maximum 100, default 20)
  • offset (integer) — offset from the start of the list (default 0)
  • include_total (boolean) — include total count in pagination (true by default)
  • sort (string) — sorting: trending, recent, most_active or custom format field:direction
  • include_user_data (boolean) — includes user data (favorites, notes, folders)
  • view (string) — default or compact
  • fields (array[string] or comma-separated string) — top-level fields to return
  • stages (array[string]) — filter by stages (array): ["seed", "series_a"]
  • rounds (array[string]) — filter by rounds (array): ["raising_now", "just_raised"]
  • categories (array[string]) — filter by categories (array): ["ai", "saas"]
  • locations (array[string]) — filter by locations (array): ["san_francisco_ca", "bay_area"]
  • participants (array[string]) — filter by participants (array): ["investor-fund"]
  • display_preference (string) — filter by type: web3, web2, all
  • filter_id (integer) — apply saved user filter
  • folder_ids (array[integer]) — filter by folders (array): [1, 2, 3]
  • created_after, created_before (string) — filter by creation date (format: YYYY-MM-DD)
  • updated_after, updated_before (string) — filter by update date
  • last_interaction_after, last_interaction_before (string) — filter by last interaction date
  • first_interaction_after, first_interaction_before (string) — filter by first interaction date
  • search (string) — optional text query; with "semantic": true it is used for semantic search over embeddings
  • semantic (boolean) — enables semantic search when used with search; same behavior as in GET cards list

Example Request

Basic POST request:

POST /v1/cards/
Content-Type: application/json
Authorization: Token <your_token>

{
  "limit": 20,
  "offset": 0,
  "sort": "recent"
}

POST with large filter volume:

POST /v1/cards/
Content-Type: application/json
Authorization: Token <your_token>

{
  "limit": 50,
  "offset": 0,
  "sort": "trending",
  "stages": ["seed", "series_a", "series_b"],
  "categories": ["ai", "saas", "b2b", "fintech", "healthcare"],
  "locations": ["san_francisco_ca", "new_york_ny", "london_united_kingdom"],
  "participants": ["investor-fund-1", "investor-fund-2", "investor-fund-3"],
  "created_after": "2024-01-01",
  "folder_ids": [1, 2, 3, 4, 5]
}

POST with custom sorting:

POST /v1/cards/
Content-Type: application/json
Authorization: Token <your_token>

{
  "limit": 20,
  "offset": 0,
  "sort": "name:asc,created_at:desc",
  "categories": ["ai", "saas"]
}

Note: Custom sorting is passed as a string in format field:direction,field:direction (same format as in GET request). For example:

  • "sort": "name:asc" — sort by name ascending
  • "sort": "created_at:desc,interactions_count:desc" — first by creation date (descending), then by interactions count (descending)

Example Response

Response format is identical to GET method (see above).


Get Card by Slug

GET /v1/cards/<slug>/

Get detailed information about a specific card by its slug.

Parameters

ParameterTypeDescription
include_user_databooleanInclude favorites, notes, folders

Response metadata

FieldTypeDescription
meta.include_user_databooleanEffective include_user_data for this response

Example Request

GET /v1/cards/project-slug/?include_user_data=true
Authorization: Token <your_token>

Example Response


Get Card Interactions

GET /v1/cards/<slug>/interactions/

Get all interactions (signals) for a card with pagination.

Parameters

ParameterTypeDescription
limitintegerPage size (max 200, default 50)
offsetintegerOffset from start
include_totalbooleanInclude total in pagination (true by default). false skips count() for faster pages

Example Request

GET /v1/cards/project-slug/interactions/?limit=50&offset=0
Authorization: Token <your_token>

Example Response


Reference Data

All reference values (stages, rounds, categories, locations, participant types, folders, filters) should be loaded from the meta endpoints below. They return complete slug/ID lists for filters and UI.

Note: Responses may include lightweight counters in meta (e.g. total, us_regions_total, world_regions_total) for caching and UI.

Categories

GET /v1/cards/categories/

Hierarchical categories (parents and children) for categories= filters.

Example response

Stages

GET /v1/cards/stages/

Stage slugs for stages= filters (e.g. seed, series_a).

Example response

Rounds

GET /v1/cards/rounds/

Round slugs for rounds= filters (e.g. raising_now, just_raised).

Example response

Locations

GET /v1/cards/locations/

Regions and cities for locations= filters.

Example response

User Folders

GET /v1/cards/folders/

Folders for the authenticated user; use with folder_ids=.

Example response

Saved Filters

GET /v1/cards/filters/

Saved filters; apply with filter_id.

Example response


Participants

Participants are funds, investors, angels, and related entities. List, fetch by slug, batch-fetch, and resolve type slugs for type= filters.

Get Participants List

GET /v1/participants/

Get list of participants (funds, investors, angels) with pagination and filtering.

Main Parameters

ParameterTypeDescription
limitintegerRecords per page (max 200, default 50)
offsetintegerOffset from start
include_totalbooleanInclude total count in pagination (true by default). Set false to skip expensive count() on large filtered datasets
searchstringSearch by name/description; with semantic=1 it becomes semantic search
sortstringPreset or custom sort (default: name)
include_user_databooleanInclude is_saved

Sort presets

PresetDescription
nameBy name (asc, default)
most_activeBy monthly signals (desc), then name (asc)

Custom sort: field:direction or field1:dir1,field2:dir2
Available fields: name, monthly_signals
Directions: asc, desc

Filters

ParameterTypeDescription
typestringFilter by type (fund, investor, angel, etc.). Values: participant types
web3booleanFilter by web3 focus (web3=true)
web2booleanFilter by web2 focus (web2=true)
saved_onlybooleanShow only saved participants

Semantic search (participants)

What it is: Semantic search finds participants by meaning and context, not just by exact words. For example, "web3 venture fund" can match funds that describe themselves in different terms but have the same focus. Results are ordered by how closely they match the intent of your query.

  • semantic (boolean-like string) — enables this search mode when used together with search:

    • Allowed values: 1, true, yes (case-insensitive)
    • Behavior:
      • Text from search is transformed into semantic vectors by our internal retrieval pipeline.
      • All other filters (type, web3, web2, etc.) are applied first.
      • Matching participants with non-null embeddings are ordered by cosine similarity to the query embedding.
      • Results are filtered by relevance threshold (default min_similarity=0.3).
      • Each result includes a similarity field (0.0-1.0) indicating how well it matches the query.
      • Pagination (limit, offset) works as usual.
    • If embeddings are temporarily unavailable, the API may return 503 with error: "semantic_unavailable".
  • min_similarity (float) — minimum cosine similarity threshold for semantic search (only used with semantic=1):

    • Range: 0.0 to 1.0 (where 1.0 = perfect match, 0.0 = no similarity)
    • Practical range: 0.3 to 0.9 (values above 0.9 are extremely rare and indicate near-perfect matches)
    • Default: 0.3 (filters out clearly irrelevant results while keeping good matches)
    • Recommended values:
      • 0.7-0.9 — very strict (only highly relevant results, fewer matches)
      • 0.5-0.7 — strict (good quality results)
      • 0.3-0.5 — default (balanced, filters obviously irrelevant)
      • 0.0-0.3 — lenient (more results, may include less relevant)
    • Higher values = more relevant results, but fewer matches
    • Lower values = more results, but may include less relevant ones
    • Note: Setting min_similarity above 0.9 will likely return very few or no results, as perfect matches are extremely rare

Example Request

GET /v1/participants/?limit=50&offset=0&type=fund&web3=true&sort=most_active
Authorization: Token <your_token>

Example Response

Note: Field is_saved appears only when include_user_data=true is specified in the request.


Get Participant by Slug

GET /v1/participants/<slug>/

Get detailed information about a participant by slug.

Parameters

ParameterTypeDescription
include_user_databooleanInclude is_saved and related personalization flag when applicable

Example Request

GET /v1/participants/investor-fund/?include_user_data=true
Authorization: Token <your_token>

Example Response


Get Multiple Participants

GET /v1/participants/batch/

Get multiple participants by list of slugs (batch operation, maximum 100).

Parameters

ParameterTypeRequiredDescription
slugsstringyesComma-separated slugs, e.g. investor-fund,john-doe
include_user_databooleannoInclude is_saved when applicable

Example Request

GET /v1/participants/batch/?slugs=investor-fund,john-doe,another-fund
Authorization: Token <your_token>

Example Response


Participant Types

GET /v1/participants/types/

Type slugs for type= filters (fund, investor, angel, …).

Example response


Utilities

Health-style helpers that do not return domain objects.

Validate Token

GET /v1/token/validate/

Check that the Authorization: Token … header is accepted.

Example Request

GET /v1/token/validate/
Authorization: Token <your_token>

Example Response

200 OK with:


Glossary

Field-by-field reference for JSON payloads. Presence: required — always present for that resource/view; optional — may be omitted (e.g. sparse fieldsets); nullable — key may be present with null; semantic only — only when semantic=1 is used with search.

Card Attributes

Basic Fields

FieldTypePresenceDescription
idintegerrequiredUnique card ID
slugstringrequiredURL-friendly identifier (e.g. thinkymachines)
namestringrequiredProject/company or person name
public_urlstringrequiredPublic page on the platform (e.g. https://app.theveck.com/public/thinkymachines)
descriptionstringnullableDetailed project description
imagestringnullableAbsolute image/logo URL
urlstringnullableWebsite or profile URL

Status and Metrics

FieldTypePresenceDescription
interactions_countintegerrequiredTotal signals/interactions for the card
trendingbooleanrequiredWhether the card is trending (recent activity)
stageobjectrequiredStage; always includes name; slug may be null. Allowed slugs: stages
roundobjectrequiredRound; always includes name; slug may be null. Allowed slugs: rounds

stage / round object

FieldTypePresenceDescription
namestringrequiredHuman-readable label (e.g. "Seed", "Raising Now")
slugstringnullableFilter slug (e.g. seed, raising_now)

Categories

FieldTypePresenceDescription
categoriesarrayrequiredCategory objects; filtering is hierarchical (parent includes children). See categories

Each category item

FieldTypePresenceDescription
namestringrequiredDisplay name (e.g. "AI")
slugstringrequiredFilter slug (e.g. ai)

Location

FieldTypePresenceDescription
locationobjectnullableOmitted as null if empty or placeholder-only ("Unknown", etc.). Valid slugs: locations

When location is an object

FieldTypePresenceDescription
formattedstringnullableFull formatted label
slugstringnullableLocation slug for filters
citystringnullableCity
statestringnullableState / province code
countrystringnullableCountry name
regionstringnullableRegion name
region_slugstringnullableRegion slug
typestringnullablee.g. city, country

Dates

FieldTypePresenceDescription
created_atstring (ISO 8601 UTC)requiredCard creation time
updated_atstring (ISO 8601 UTC)requiredLast update time
last_roundstring (YYYY-MM-DD)nullableLast funding round date
last_interaction_atstring (ISO 8601 UTC)nullableMost recent interaction
first_interaction_atstring (ISO 8601 UTC)nullableFirst interaction
FieldTypePresenceDescription
social_linksarrayrequiredList of link objects

Each social_links item

FieldTypePresenceDescription
keystringrequiredNormalized platform id (e.g. twitter)
namestringrequiredDisplay name
urlstringrequiredProfile URL

User Data (include_user_data=true)

FieldTypePresenceDescription
user_dataobjectoptionalOnly when personalization is requested

user_data object

FieldTypePresenceDescription
is_likedbooleanrequiredUser favorited the card
has_notebooleanrequiredUser has a note
noteobjectnullablePresent when has_note is true
foldersarrayrequiredFolders containing this card (may be empty)

user_data.note

FieldTypePresenceDescription
textstringrequiredNote body
created_atstringrequiredNote created (ISO 8601 UTC)
updated_atstringrequiredNote updated (ISO 8601 UTC)

Each folder item

FieldTypePresenceDescription
idintegerrequiredFolder ID
namestringrequiredFolder name

List and Detail (common)

FieldTypePresenceDescription
open_to_introbooleanrequiredCard accepts intro requests
has_intro_requestbooleanrequiredCurrent user has an intro request for this card
FieldTypePresenceDescription
similarityfloatsemantic onlyCosine similarity vs query (0.0–1.0). Typical useful range ~0.3–0.9

Card Detail Only

FieldTypePresenceDescription
peoplearrayoptionalTeam/contact rows: id, name, type, image, twitter_url, linkedin_url, crunchbase_url, reference_url, github_url, email, bio
linkedin_dataobjectoptionalStructured LinkedIn-derived data
moreobjectnullableExtra project fields
employment_dataobjectnullableEmployment-related fields
interactionsarrayoptionalUp to 20 recent interactions (same shape as Interaction Attributes)
has_more_interactionsbooleanoptionalIf true, use GET /v1/cards/<slug>/interactions/ for full history

linkedin_data

FieldTypePresenceDescription
tagsarrayoptional{ "name", "type" } where type is school, accelerator, or job
educationarrayoptionalStrings
experiencearrayoptionalStrings (e.g. "Role at Co (dates)")

Participant Attributes

Basic Fields

FieldTypePresenceDescription
slugstringrequiredAPI identifier (e.g. a16z)
namestringrequiredDisplay name
alt_namestringnullableAlternate name (e.g. "VC")
emailstringnullableContact email
imagestringnullableLogo/avatar URL
aboutstringnullableDescription

Type and Focus

FieldTypePresenceDescription
typestringrequirede.g. fund, investor, angel. See participant types
web3booleanrequiredWeb3/crypto focus
web2booleanrequiredWeb2/traditional focus

Metrics

FieldTypePresenceDescription
monthly_signalsintegerrequiredSignals per month

Semantic Search

FieldTypePresenceDescription
similarityfloatsemantic onlySame semantics as card similarity

Relationships

FieldTypePresenceDescription
associated_withobjectnullableParent org when applicable
self_associatedbooleanrequiredOften true for funds

associated_with

FieldTypePresenceDescription
slugstringrequiredParent slug
namestringrequiredParent name

User Data (include_user_data=true)

FieldTypePresenceDescription
is_savedbooleanoptionalUser saved this participant

Participant Detail Only (sources)

FieldTypePresenceDescription
sourcesarrayoptionalExternal profiles

Each sources item

FieldTypePresenceDescription
slugstringrequiredSource id
typestringrequirede.g. twitter, linkedin
linkstringrequiredFull URL

Interaction Attributes

FieldTypePresenceDescription
idintegerrequiredInteraction ID
created_atstringrequiredISO 8601 UTC
participantobjectrequiredMain participant
associated_participantobjectnullableCo-participant when applicable

participant / associated_participant summary object

FieldTypePresenceDescription
namestringrequiredDisplay name
slugstringrequiredParticipant slug
typestringrequiredParticipant type slug

Pagination Attributes

FieldTypePresenceDescription
limitintegerrequiredPage size
offsetintegerrequiredOffset
totalintegernullablenull when include_total=false
has_nextbooleanrequiredMore pages available

Notes

Cross-cutting behavior for every endpoint: error JSON, successful payload shape, and date formats.

Error Handling

All errors are returned in JSON format:

Main Error Codes

  • 401 Unauthorized — authentication required or invalid token
  • 404 Not Found — resource not found
  • 400 Bad Request — data validation error
  • 429 Too Many Requests — request limit exceeded
  • 500 Internal Server Error — internal server error

Example Error Responses

Rate limit exceeded (429) - Paid access:

Rate limit exceeded (429) - Free access:

Response Format

All successful responses contain a data field with data and an optional pagination field for lists. List endpoints may also include meta:

Date Formats

Request parameters (date filters): Use YYYY-MM-DD format (e.g., 2025-01-15)

  • Applies to: created_after, created_before, updated_after, updated_before, last_interaction_after, last_interaction_before, first_interaction_after, first_interaction_before

Response fields (date-time): Use ISO 8601 UTC format with time (e.g., 2025-01-15T10:30:00Z)

  • Applies to: created_at, updated_at, last_interaction_at, first_interaction_at, and all datetime fields in responses

Exception: last_round field in responses uses YYYY-MM-DD format (date only, e.g., 2025-01-15)