IVGraph provides multiple search modes powered by Elasticsearch: full-text (BM25), autocomplete, semantic (vector), hybrid (BM25 + vector), and similarity search.

Authentication: JWT required for all endpoints.

Prerequisite: Elasticsearch must be running and the workspace must be indexed (happens automatically after sync).

Full-Text Search

GET /api/search/

Search nodes by title and content using BM25 ranking.

Parameters:

Param Type Required Default Description
q string yes Search query
connection_id UUID no user's first Specific connection to search
size int no 50 Max results
highlight bool no true Include highlighted snippets
type string no all Filter: page, database, or user

Example:

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/?q=project+planning&size=10"
import requests

resp = requests.get(
    "https://ivgraph.com/api/search/",
    headers={"Authorization": "Bearer <jwt_token>"},
    params={"q": "project planning", "size": 10}
)
results = resp.json()["results"]
const resp = await fetch(
  "https://ivgraph.com/api/search/?q=project+planning&size=10",
  { headers: { Authorization: "Bearer <jwt_token>" } }
);
const { results } = await resp.json();

Response:

{
  "query": "project planning",
  "total": 8,
  "results": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440001",
      "type": "page",
      "title": "Project Planning Guide",
      "score": 12.5,
      "highlight": "...comprehensive <em>project</em> <em>planning</em> methodology..."
    }
  ]
}

Autocomplete

GET /api/search/suggest/

Prefix-based autocomplete for search-as-you-type.

Parameters:

Param Type Required Default Description
q string yes Prefix (min 2 characters)
size int no 10 Max suggestions

Example:

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/suggest/?q=pro"

Response:

{
  "prefix": "pro",
  "suggestions": [
    {"id": "uuid-1", "title": "Project Alpha", "type": "page"},
    {"id": "uuid-2", "title": "Product Roadmap", "type": "page"},
    {"id": "uuid-3", "title": "Projects Tracker", "type": "database"}
  ]
}

Semantic Search

GET /api/search/semantic/

Vector similarity search using embeddings. Finds conceptually similar content, not just keyword matches.

Parameters:

Param Type Required Default Description
q string yes Natural language query
connection_id UUID no user's first Connection to search
size int no 10 Max results

Example:

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/semantic/?q=how+do+we+handle+user+onboarding"

Response:

{
  "query": "how do we handle user onboarding",
  "total": 5,
  "search_type": "semantic",
  "results": [
    {"id": "uuid-1", "type": "page", "title": "New User Welcome Flow", "score": 0.89},
    {"id": "uuid-2", "type": "page", "title": "Onboarding Checklist", "score": 0.82}
  ]
}

Hybrid Search

GET /api/search/hybrid/

Combines BM25 keyword search with semantic vector search for best-of-both results.

Parameters: Same as semantic search.

Example:

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/hybrid/?q=authentication+flow"

Similar Nodes

GET /api/search/similar/{node_id}/

Find nodes similar to a given node based on vector embeddings.

Parameters:

Param Type Required Default Description
node_id UUID yes Source node ID (in URL path)
connection_id UUID no user's first Connection to search
size int no 10 Max results

Example:

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/similar/550e8400-e29b-41d4-a716-446655440001/"

Page Content

GET /api/search/content/{page_id}/

Get page content as markdown and plain text.

Parameters:

Param Type Required Description
page_id UUID yes Page ID (in URL path)

Example:

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/content/550e8400-e29b-41d4-a716-446655440001/"

Response:

{
  "page_id": "550e8400-e29b-41d4-a716-446655440001",
  "title": "Project Alpha",
  "markdown": "# Project Alpha\n\nMain project page...",
  "plain_text": "Project Alpha\nMain project page...",
  "has_content": true
}

Index Management

POST /api/search/index/

Trigger reindexing of Elasticsearch index for the user's connection.

curl -X POST -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/index/"

Response:

{"message": "Indexing complete", "index_name": "ivg_conn-uuid", "indexed_count": 342}

DELETE /api/search/index/

Delete search index for the user's connection.

curl -X DELETE -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/index/"

GET /api/search/connections/

List all search indices for the user.

curl -H "Authorization: Bearer <jwt_token>" \
  "https://ivgraph.com/api/search/connections/"

Response:

{
  "user": "username",
  "connections": [
    {
      "connection_id": "conn-uuid",
      "schema_name": "airbyte_conn_uuid",
      "index_name": "ivg_conn-uuid",
      "document_count": 342,
      "last_sync": "2026-04-10T10:00:00Z"
    }
  ]
}

Errors

Status Meaning
400 Missing or invalid query parameters
401 Not authenticated
404 Connection not found or page not found
503 Elasticsearch unavailable