---
title: "Search GitHub repositories"
method: POST
path: "/api/search/repos"
---

# Search GitHub repositories

`POST /api/search/repos`

Semantic search across repository READMEs and descriptions using vector embeddings and cosine similarity. Results include relevance scores. Requires SEARCH service. Credits: 1 per result returned.

## Request body

- SearchRepositoriesRequest
  - `query` union, required — Search query for semantic search across repository README and description using vector embeddings. Supports: string (single query), string[] (RRF fusion), null (filter-only)
    - string
    - string[]
    - unknown
    - unknown
  - `maxResults` integer — Maximum number of results to return (default: 100, max: 1000)
  - `first` integer — Alias for maxResults (takes precedence if both provided)
  - `filters` union
    - object — Optional filters for narrowing search results. Supports filtering on: githubId, ownerLogin, ownerLocation, name, stargazerCount, language, totalIssuesCount, totalIssuesOpen, totalIssuesClosed, lastContributorLocations. Filter structure: - Field filters: { field: "fieldName", op: "Eq"|"In"|"Gte"|"Lte", value: string|number|array } - Composite filters: { op: "And"|"Or", filters: [...] } Supported operators: - String fields: Eq (exact match), In (one of array) - Number fields: Eq (exact), In (one of array), Gte (>=), Lte (<=) - Use And/Or to combine multiple filters
      - `field` string, required — Field name to filter on
      - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
      - `value` union, required — Filter value (type depends on field and operator)
        - string
        - number
        - string[]
        - number[]
    - object — Optional filters for narrowing search results. Supports filtering on: githubId, ownerLogin, ownerLocation, name, stargazerCount, language, totalIssuesCount, totalIssuesOpen, totalIssuesClosed, lastContributorLocations. Filter structure: - Field filters: { field: "fieldName", op: "Eq"|"In"|"Gte"|"Lte", value: string|number|array } - Composite filters: { op: "And"|"Or", filters: [...] } Supported operators: - String fields: Eq (exact match), In (one of array) - Number fields: Eq (exact), In (one of array), Gte (>=), Lte (<=) - Use And/Or to combine multiple filters
      - `op` 'And' | 'Or', required — Composite operator
      - `filters` object[], required — Array of field filters
        - `field` string, required — Field name to filter on
        - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
        - `value` union, required — Filter value (type depends on field and operator)
          - string
          - number
          - string[]
          - number[]
    - object — Optional filters for narrowing search results. Supports filtering on: githubId, ownerLogin, ownerLocation, name, stargazerCount, language, totalIssuesCount, totalIssuesOpen, totalIssuesClosed, lastContributorLocations. Filter structure: - Field filters: { field: "fieldName", op: "Eq"|"In"|"Gte"|"Lte", value: string|number|array } - Composite filters: { op: "And"|"Or", filters: [...] } Supported operators: - String fields: Eq (exact match), In (one of array) - Number fields: Eq (exact), In (one of array), Gte (>=), Lte (<=) - Use And/Or to combine multiple filters
      - `op` 'And' | 'Or', required — Composite operator
      - `filters` union[], required — Array of filters
        - union
          - object
            - `field` string, required — Field name to filter on
            - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
            - `value` union, required — Filter value (type depends on field and operator)
              - …
          - object
            - `op` 'And' | 'Or', required — Composite operator
            - `filters` object[], required — Array of field filters
              - …
  - `rankBy` union — Custom ranking formula (AST expression). If not provided, uses default log-normalized 70/20/10 formula (70% semantic similarity, 20% popularity, 10% activity).
    - object
      - `type` 'Attr', required
      - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
    - object
      - `type` 'Const', required
      - `value` number, required
    - object
      - `type` 'Sum', required
      - `exprs` union[], required
        - union
          - object
            - `type` 'Attr', required
            - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
          - object
            - `type` 'Const', required
            - `value` number, required
          - object
            - `type` 'Sum', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Mult', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Div', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Max', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Min', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Log', required
            - `base` number, required
            - `expr` union, required
              - …
    - object
      - `type` 'Mult', required
      - `exprs` union[], required
        - union
          - object
            - `type` 'Attr', required
            - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
          - object
            - `type` 'Const', required
            - `value` number, required
          - object
            - `type` 'Sum', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Mult', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Div', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Max', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Min', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Log', required
            - `base` number, required
            - `expr` union, required
              - …
    - object
      - `type` 'Div', required
      - `exprs` union[], required
        - union
          - object
            - `type` 'Attr', required
            - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
          - object
            - `type` 'Const', required
            - `value` number, required
          - object
            - `type` 'Sum', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Mult', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Div', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Max', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Min', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Log', required
            - `base` number, required
            - `expr` union, required
              - …
    - object
      - `type` 'Max', required
      - `exprs` union[], required
        - union
          - object
            - `type` 'Attr', required
            - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
          - object
            - `type` 'Const', required
            - `value` number, required
          - object
            - `type` 'Sum', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Mult', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Div', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Max', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Min', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Log', required
            - `base` number, required
            - `expr` union, required
              - …
    - object
      - `type` 'Min', required
      - `exprs` union[], required
        - union
          - object
            - `type` 'Attr', required
            - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
          - object
            - `type` 'Const', required
            - `value` number, required
          - object
            - `type` 'Sum', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Mult', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Div', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Max', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Min', required
            - `exprs` union[], required
              - …
          - object
            - `type` 'Log', required
            - `base` number, required
            - `expr` union, required
              - …
    - object
      - `type` 'Log', required
      - `base` number, required
      - `expr` union, required
        - object
          - `type` 'Attr', required
          - `name` 'ann' | 'stars' | 'issues_closed' | 'age' | 'recency', required
        - object
          - `type` 'Const', required
          - `value` number, required
        - object
          - `type` 'Sum', required
          - `exprs` union[], required
            - union
              - …
        - object
          - `type` 'Mult', required
          - `exprs` union[], required
            - union
              - …
        - object
          - `type` 'Div', required
          - `exprs` union[], required
            - union
              - …
        - object
          - `type` 'Max', required
          - `exprs` union[], required
            - union
              - …
        - object
          - `type` 'Min', required
          - `exprs` union[], required
            - union
              - …
        - object
          - `type` 'Log', required
          - `base` number, required
          - `expr` union, required
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
            - object
              - …
  - `enablePagination` boolean — Enable cursor-based pagination to fetch results across multiple requests
  - `after` string — Cursor for pagination (from previous response pageInfo.endCursor)
  - `includeAttributes` object — Optional graph relationships to include (owner, contributors, starrers)
    - `owner` boolean — Include repository owner information
    - `contributors` object — Include repository contributors with cursor pagination
      - `first` integer, required — Number of items to return (max: 100)
      - `after` string — Cursor for pagination (opaque base64-encoded)
      - `filters` union — Optional filters for users. Supports fields like login, company, location, resolvedCountry, resolvedState, resolvedCity. Operators: Eq, NotEq, In, NotIn, Lt, Lte, Gt, Gte.
        - object
          - `field` string, required — Field name to filter on
          - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
          - `value` union, required — Filter value (type depends on field and operator)
            - string
            - number
            - string[]
            - number[]
        - object
          - `op` 'And' | 'Or', required — Composite operator
          - `filters` object[], required — Array of field filters
            - `field` string, required — Field name to filter on
            - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
            - `value` union, required — Filter value (type depends on field and operator)
              - …
        - object
          - `op` 'And' | 'Or', required — Composite operator
          - `filters` union[], required — Array of filters
            - union
              - …
    - `starrers` object — Include users who starred the repository with cursor pagination
      - `first` integer, required — Number of items to return (max: 100)
      - `after` string — Cursor for pagination (opaque base64-encoded)
      - `filters` union — Optional filters for users. Supports fields like login, company, location, resolvedCountry, resolvedState, resolvedCity. Operators: Eq, NotEq, In, NotIn, Lt, Lte, Gt, Gte.
        - object
          - `field` string, required — Field name to filter on
          - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
          - `value` union, required — Filter value (type depends on field and operator)
            - string
            - number
            - string[]
            - number[]
        - object
          - `op` 'And' | 'Or', required — Composite operator
          - `filters` object[], required — Array of field filters
            - `field` string, required — Field name to filter on
            - `op` 'Eq' | 'NotEq' | 'In' | 'NotIn' | 'Lt' | 'Lte' | 'Gt' | 'Gte' | 'Glob' | 'NotGlob' | 'IGlob' | 'NotIGlob' | 'Regex' | 'Contains' | 'NotContains' | 'ContainsAny' | 'NotContainsAny' | 'AnyLt' | 'AnyLte' | 'AnyGt' | 'AnyGte' | 'ContainsAllTokens', required — Filter operator
            - `value` union, required — Filter value (type depends on field and operator)
              - …
        - object
          - `op` 'And' | 'Or', required — Composite operator
          - `filters` union[], required — Array of filters
            - union
              - …
    - `ownerDevrank` boolean — Include devrank data for the repository owner
  - `applyFiltersToIncludeAttributes` boolean — When true, applies the search filter to all user-returning includeAttributes (contributors, starrers). This filters the returned users to match the same criteria.

## Response `200`

Search results retrieved successfully

- SearchRepositoriesResponse
  - `repositories` PublicRepositoryWithGraph[], required — Array of repository search results with relevance scores and optional graph relationships
    - `id` string, required — BountyLab internal ID
    - `githubId` string, required — GitHub node ID
    - `ownerLogin` string, required — Repository owner username
    - `name` string, required — Repository name
    - `description` string, nullable — Repository description
    - `stargazerCount` number, required — Number of stars
    - `language` string, nullable — Primary programming language
    - `totalIssuesCount` number, required — Total number of issues (open + closed)
    - `totalIssuesOpen` number, required — Number of open issues
    - `totalIssuesClosed` number, required — Number of closed issues
    - `readmePreview` string, nullable — Preview of repository README (first ~500 chars)
    - `lastContributorLocations` string[], nullable — Locations of last contributors to this repository
    - `createdAt` string, nullable — ISO 8601 timestamp when repository was created
    - `updatedAt` string, nullable — ISO 8601 timestamp when repository was last updated
    - `embeddedAt` string, nullable — ISO 8601 timestamp when embedding was created
    - `score` number — Relevance score from search (0-1, lower is more relevant for cosine distance)
    - `owner` object — Repository owner (when includeAttributes.owner = true)
      - `id` string, required — BountyLab internal ID
      - `githubId` string, required — GitHub node ID
      - `login` string, required — GitHub username
      - `displayName` string, nullable — User display name
      - `bio` string, nullable — User biography
      - `company` string, nullable — Company name
      - `location` string, nullable — User location
      - `websiteUrl` string, nullable — User website URL
      - `socialAccounts` object[], nullable — Social media accounts
        - `provider` string, required
        - `url` string, required
      - `emails` string[], nullable — Obfuscated email addresses showing only the last 2 characters of the local part and full domain (e.g., "***oe@gmail.com"). Use /api/users/best-email endpoint for unobfuscated email access with intelligent selection.
      - `resolvedCountry` string, nullable — Resolved country from location
      - `resolvedState` string, nullable — Resolved state/region from location
      - `resolvedCity` string, nullable — Resolved city from location
      - `createdAt` string, nullable — ISO 8601 timestamp when user account was created
      - `updatedAt` string, nullable — ISO 8601 timestamp when user was last updated
      - `embeddedAt` string, nullable — ISO 8601 timestamp when metadata was extracted
      - `score` number — Relevance score from search (0-1, lower is more relevant for distance metrics)
    - `contributors` object — Repository contributors (when includeAttributes.contributors is specified)
      - `edges` PublicUser[], required — Array of user objects
        - `id` string, required — BountyLab internal ID
        - `githubId` string, required — GitHub node ID
        - `login` string, required — GitHub username
        - `displayName` string, nullable — User display name
        - `bio` string, nullable — User biography
        - `company` string, nullable — Company name
        - `location` string, nullable — User location
        - `websiteUrl` string, nullable — User website URL
        - `socialAccounts` object[], nullable — Social media accounts
          - `provider` string, required
          - `url` string, required
        - `emails` string[], nullable — Obfuscated email addresses showing only the last 2 characters of the local part and full domain (e.g., "***oe@gmail.com"). Use /api/users/best-email endpoint for unobfuscated email access with intelligent selection.
        - `resolvedCountry` string, nullable — Resolved country from location
        - `resolvedState` string, nullable — Resolved state/region from location
        - `resolvedCity` string, nullable — Resolved city from location
        - `createdAt` string, nullable — ISO 8601 timestamp when user account was created
        - `updatedAt` string, nullable — ISO 8601 timestamp when user was last updated
        - `embeddedAt` string, nullable — ISO 8601 timestamp when metadata was extracted
        - `score` number — Relevance score from search (0-1, lower is more relevant for distance metrics)
      - `pageInfo` PageInfo, required — Pagination information
        - `hasNextPage` boolean, required — Whether there are more items available
        - `endCursor` string, nullable, required — Cursor to fetch next page (null if no more items)
    - `starrers` object — Users who starred this repository (when includeAttributes.starrers is specified)
      - `edges` PublicUser[], required — Array of user objects
        - `id` string, required — BountyLab internal ID
        - `githubId` string, required — GitHub node ID
        - `login` string, required — GitHub username
        - `displayName` string, nullable — User display name
        - `bio` string, nullable — User biography
        - `company` string, nullable — Company name
        - `location` string, nullable — User location
        - `websiteUrl` string, nullable — User website URL
        - `socialAccounts` object[], nullable — Social media accounts
          - `provider` string, required
          - `url` string, required
        - `emails` string[], nullable — Obfuscated email addresses showing only the last 2 characters of the local part and full domain (e.g., "***oe@gmail.com"). Use /api/users/best-email endpoint for unobfuscated email access with intelligent selection.
        - `resolvedCountry` string, nullable — Resolved country from location
        - `resolvedState` string, nullable — Resolved state/region from location
        - `resolvedCity` string, nullable — Resolved city from location
        - `createdAt` string, nullable — ISO 8601 timestamp when user account was created
        - `updatedAt` string, nullable — ISO 8601 timestamp when user was last updated
        - `embeddedAt` string, nullable — ISO 8601 timestamp when metadata was extracted
        - `score` number — Relevance score from search (0-1, lower is more relevant for distance metrics)
      - `pageInfo` PageInfo, required — Pagination information
        - `hasNextPage` boolean, required — Whether there are more items available
        - `endCursor` string, nullable, required — Cursor to fetch next page (null if no more items)
    - `ownerDevrank` object — Devrank data for the repository owner (when includeAttributes.ownerDevrank = true)
      - `crackedScore` number, required
      - `tier` string, required
      - `rawScore` number, required
      - `trust` number, required
      - `pc` number, required
      - `followersIn` number, required
      - `followingOut` number, required
      - `community` integer, required
      - `createdAt` string, required
      - `updatedAt` string, required
  - `count` number, required — Number of repositories returned
  - `pageInfo` object — Pagination info (only present if enablePagination: true was set in request)
    - `hasNextPage` boolean, required — Whether there are more items available
    - `endCursor` string, nullable, required — Cursor to fetch next page (null if no more items)

## Other responses

- `400` — Bad request - invalid search query, parameters, or filter validation failed
- `401` — Unauthorized - API key missing
- `403` — Forbidden - Invalid API key or SEARCH service access denied
- `500` — Internal server error - search service failure, embedding generation failure, or unexpected error

## Changes

- **2026-01-23** `4664c27f7e3a` — 8 info
  - the response property `code` became required for the status `400`
  - the response property `code` became required for the status `401`
  - the response property `code` became required for the status `403`
  - the response property `code` became required for the status `500`
  - …4 more
- **2026-01-23** `7e0e92c35079` — 1 info
  - added the new optional request property `applyFiltersToIncludeAttributes`
- …earlier changes not shown

[Full history](https://skmtc.dev/bountylaboratories/apis/bounty-lab-public-api/changes/api/search/repos/post.md)

---

[API](https://skmtc.dev/bountylaboratories/apis/bounty-lab-public-api.md) · [All operations](https://skmtc.dev/bountylaboratories/apis/bounty-lab-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bountylaboratories/apis/bounty-lab-public-api/revisions/4664c27f7e3a?raw)
