Skip to main content
Version: v0.3.100

API

Honeyframe exposes a REST API on each of its services. Most operator workflows go through the API — the platform UI is itself a client of the same endpoints.

This page is the operator-facing overview. For the developer reference (auth tokens, SDK usage, per-endpoint signatures, webhooks), see the Developer property.

Service surfaces​

ServiceDefault URLPurpose
Platformhttps://platform.your-domain.com/apiAuthoring surface — connectors, datasets, recipes, dashboards, agents, RBAC.
App (vertical SaaS)https://app.your-domain.com/apiCustomer-facing surface for a published vertical app — read-only routes for dashboards and the domain entities the app exposes.
Cloudhttps://cloud.your-domain.com/apiInfrastructure surface — organizations, servers, domains, license.

The Platform API is the primary surface for analytics workflows. The App and Cloud surfaces expose narrower subsets for their respective audiences.

Authentication​

Every endpoint except the sign-in routes (/api/auth/login, /api/auth/google, /api/auth/microsoft, password reset) and a few probes requires a bearer token. Get a token by logging in:

TOKEN=$(curl -s -X POST https://platform.your-domain.com/api/auth/login \
-H 'Content-Type: application/json' \
-d '{"username":"you@example.com","password":"<redacted>"}' \
| jq -r '.access_token')

curl -H "Authorization: Bearer $TOKEN" https://platform.your-domain.com/api/auth/me

Session JWTs expire after 8 hours (480 minutes, configurable by the operator). There is no refresh-token endpoint — log in again when the token expires.

For scripts, CI, and the SDK, use a Personal Access Token (hf_…) instead of a JWT. Mint one from the platform UI or POST /api/auth/tokens, then send it on the same Authorization: Bearer header. See Authentication → Personal Access Tokens.

Organization and project context​

Honeyframe is multi-tenant. A request runs in the caller's primary organization unless it names another one with the X-Org-Id header — the same switch the UI's org picker uses. X-Org-Id is honored only for organizations the caller belongs to (platform superadmins may name any org). The active project is chosen the same way, with X-Project-Id.

A Personal Access Token minted with an org or project scope is pinned to it: the token's scope overrides any X-Org-Id / X-Project-Id the caller sends.

curl https://platform.your-domain.com/api/datasets \
-H "Authorization: Bearer $TOKEN" \
-H "X-Org-Id: 42" \
-H "X-Project-Id: 7"

Surface map​

The Platform API is grouped into more than 150 routers. The most commonly used are:

PrefixWhat it covers
/api/auth/*Login, /me, password change and reset, Google / Microsoft sign-in, Personal Access Tokens (/api/auth/tokens).
/api/users/*User administration.
/api/groups/*Groups, memberships, permissions.
/api/organizations/*Org-level admin: members, settings, per-org plugins.
/api/projects/*Projects within an org.
/api/connectors/*Connector CRUD, test, credential rotation.
/api/datasets/*Dataset CRUD, schema, preview, explore.
/api/sqlGoverned query endpoint — project-scoped, read-only, statement-timeout enforced.
/api/dbt/*dbt authoring: read/write models, run / test / build / compile.
/api/flow/*Flow recipes and the visual Flow.
/api/pipeline/*Scenarios, triggers, runs, jobs, scheduler health — see Scheduler.
/api/dashboards/*Dashboard CRUD, cards, execution, sharing.
/api/webapps/*Webapps; anonymous public variants under /api/public/webapps/*.
/api/lineage/*, /api/column-lineage/*Lineage graphs, including column level.
/api/catalog/*Metadata catalog adapters and the cross-tool lineage walk.
/api/audit/*The audit log (admin only).
/api/branding/*Org-level branding (logo, tagline, colors).
/api/chat/*Agent chat sessions and models.
/api/agent-tools/*Tool definitions for agents.
/api/knowledge-bases/*Knowledge Banks and retrieval.
/api/cobuild/*Cobuild sessions.
/api/publish/*Publish dashboards, API services, and app pages.
/api/admin/ldap-configLDAP configuration, test, and sync.

The App service exposes a narrower, read-oriented subset for a published app — typically entity lookups plus published dashboards:

PrefixWhat it covers
/api/<entity>/*Domain entity detail + list (one set per entity defined in the app schema).
/api/dashboards/*Published dashboards (read-only).

Cloud exposes infrastructure routes:

PrefixWhat it covers
/api/servers/*Server inventory and health.
/api/databases/*Managed databases.
/api/domains/*Domain mappings to services.
/api/cloud-accounts/*Cloud provider accounts.
/api/billing/*Usage and billing.
/api/organizations/*Cross-org admin (platform operator only).

Discovery​

The OpenAPI document (/openapi.json, plus Swagger UI at /docs) is served by the backend process itself, not on the public domain — the reference reverse-proxy configuration forwards only /api/*. Fetch it on the server (for example curl http://localhost:8001/openapi.json on the Platform host), or expose it deliberately behind authentication. The OpenAPI document is the authoritative per-endpoint reference; this page is the operator narrative. It also lists internal routes — routes not documented on this site are not a stable contract and can change between releases.

For per-endpoint walkthroughs (request/response examples, auth details, webhook payloads), see Developer → Core API.

Pagination and filtering​

There is no single platform-wide list convention. Most list endpoints accept limit (with a per-endpoint maximum) and many accept offset; filters are endpoint-specific query parameters (for example status, scope, or category). Check the endpoint's page under Developer → Core API or the generated schema.

Error model​

Errors use FastAPI's shape: a JSON object with a detail field. detail is a string for most errors and an object when the platform adds machine-readable context — for example a permission denial:

{
"detail": {
"error": "permission_denied",
"permission": "dashboard.edit",
"target_id": "7",
"message": "Your group memberships do not grant 'dashboard.edit' on 7."
}
}

The HTTP status code is the primary indicator (401 unauthenticated, 403 forbidden, 404 not found, 409 conflict, 422 validation, 5xx server or upstream failure).

Rate limits​

The shipped reverse-proxy configuration defines two rate-limit zones — see Reverse Proxy:

  • /api/auth/* — 5 requests/s per client IP, burst 10.
  • /api/* — 30 requests/s per client IP, burst 60.

Behind a load balancer that masks client IPs, configure set_real_ip_from in nginx so the limits apply to real clients.

SDK​

Honeyframe ships a first-party Python client, honeyframeapi (pip install honeyframeapi). It wraps the API behind typed handles for projects, datasets, recipes, dashboards, bundles, agents, and webapps, and includes a honeyframe CLI. Authenticate with a Personal Access Token. See Developer → SDK.