Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

API Overview

Base URL: https://api.syndb.xyz/v1

Interactive OpenAPI documentation: api.syndb.xyz/docs

OpenAPI spec: GET /openapi.json

Authentication

Pass a PASETO access token in the Authorization header:

Authorization: Bearer <access_token>

See Authentication for how to obtain tokens.

Content Types

  • Requests: application/json
  • Responses: application/json (API), Apache Arrow IPC (job results), BibTeX/RIS (citations)

Error Format

{
  "error": "Human-readable error message"
}

Standard HTTP status codes: 400 (bad request), 401 (unauthenticated), 403 (insufficient permissions), 404 (not found), 409 (conflict), 429 (rate limited).

Route Map

No Authentication Required

MethodPathDescription
GET/healthService health check (Postgres, ClickHouse, S3, Meilisearch)
POST/v1/user/auth/loginLogin
POST/v1/user/auth/registerRegister
POST/v1/user/auth/register-serviceRegister service account (X-Service-Secret)
POST/v1/user/auth/refreshRefresh token
POST/v1/user/auth/logoutLogout
GET/v1/user/profile/{user_id}Public profile lookup
GET/v1/searchFull-text dataset search
GET/v1/federation/pingFederation health
POST/v1/federation/registerCluster self-registration (federation password)

Authenticated User (AuthUser)

MethodPathDescription
GET/v1/user/profileCurrent user profile
PATCH/v1/user/profileUpdate profile
POST/v1/user/profile/scientist-tagGenerate scientist tag
GET/v1/user/authenticate/cilogonAcademic metadata

Academic / Verified User (AcademicUser)

MethodPathDescription
POST/v1/neurodata/datasetsRegister dataset
GET/v1/neurodata/datasets/ownedUser’s datasets
POST/v1/neurodata/download-urlsPre-signed S3 download URLs
POST/v1/syql/planParse and validate SyQL
POST/v1/syql/execExecute SyQL query
POST/v1/syql/explainExplain query plan
POST/v1/syql/cancelCancel running query
GET/v1/queriesList saved queries
POST/v1/queriesSave query
POST/v1/queries/{id}/runExecute saved query
POST/v1/jobsSubmit query job
POST/v1/jobs/graphSubmit graph analysis job
GET/v1/jobsList jobs
GET/v1/jobs/{id}/resultDownload job result
GET/v1/analytics/{id}/summaryDataset summary stats
GET/v1/analytics/{id}/neuron-morphometricsMorphometric statistics
GET/v1/analytics/{id}/graph-summaryGraph-level statistics
GET/v1/analytics/{id}/reciprocitySynapse reciprocity
GET/v1/analytics/{id}/degree-distributionDegree distribution
GET/v1/analytics/zscore-comparisonZ-score comparison
GET/v1/graph/{id}/metricsGraph metrics
POST/v1/graph/{id}/motifsTriadic census
POST/v1/graph/{id}/shortest-pathShortest path
POST/v1/graph/{id}/reachabilityReachability analysis
POST/v1/graph/{id}/full-analysisFull graph analysis
POST/v1/graph/compareCross-dataset comparison
POST/v1/meta-analysis/analyzeCross-dataset meta-analysis
POST/v1/meta-analysis/atlas-compareAtlas comparison

SuperUser

MethodPathDescription
GET/v1/federation/statusFederation overview
GET/v1/federation/clustersList clusters
POST/v1/federation/clustersRegister cluster
DELETE/v1/federation/clusters/{id}Deactivate cluster
POST/v1/federation/schema/syncSync schema to clusters
POST/v1/ontology/termsCreate ontology term
PUT/v1/ontology/terms/{id}Update term
POST/v1/ontology/import-csvBulk import terms

Middleware Stack

Requests pass through these layers in order:

  1. Request ID — UUID v7, propagated via X-Request-ID
  2. Tracing — structured request/response logging
  3. Rate limiting — per-IP token bucket (see Rate Limiting)
  4. Timeout — 60s default, 408 on expiry
  5. CORS — permissive in dev mode, restricted to api_domain in production
  6. Compression — automatic response compression
  7. Body limit — 100 MB max request body
  8. API versionapi-version: v1 response header

Health Check

curl https://api.syndb.xyz/health
{
  "status": "healthy",
  "components": {
    "postgres": { "status": "ok", "latency_ms": 5 },
    "clickhouse": { "status": "ok", "latency_ms": 12 },
    "storage": { "status": "ok", "latency_ms": 8 },
    "meilisearch": { "status": "ok" }
  }
}

Status is degraded if any component fails. Meilisearch is optional — its absence does not degrade the overall status.