Skip to content

Objects ​

The JSON objects the API returns. Timestamps are ISO 8601 strings in UTC; IDs are UUID strings. Fields can be added over time, so ignore fields you don't know.

Team ​

json
{
  "id": "…", "name": "Acme", "slug": "acme", "namespace": "t-acme-x7k2p",
  "plan": "hobby", "status": "active", "role": "owner",
  "founding_member": false, "created_at": "2026-10-01T09:30:00+00:00"
}
  • plan: trial, hobby or pro.
  • status: active, or suspended (out of credit or over the spending limit; services are stopped).
  • role: your role in the team: owner, admin, member or viewer.

Member ​

{ "user": User, "role": "admin", "joined_at": "…" }

Invite ​

json
{
  "id": "…", "email": "ana@example.com", "role": "member",
  "expires_at": "…", "created_at": "…", "team": { "id": "…", "name": "Acme" }
}

Creating an invite also returns accept_url. Invites expire after 7 days.

User ​

json
{
  "id": "…", "email": "ana@example.com", "name": "Ana", "avatar_url": null, "github_login": "ana",
  "is_staff": false, "referral_code": "ana-7f3k", "product_emails": true, "created_at": "…"
}

Current user ​

GET /auth/me returns { "user": User, "teams": [Team] }.

Project ​

json
{
  "id": "…", "team_id": "…", "name": "shop", "description": null, "icon": null, "region": "nbg1",
  "environments": [Environment], "service_count": 3, "created_at": "…", "updated_at": "…"
}

region: nbg1 (Nuremberg), fsn1 (Falkenstein) or hel1 (Helsinki).

Environment ​

json
{ "id": "…", "project_id": "…", "name": "production", "slug": "production", "is_ephemeral": false, "created_at": "…" }

Service ​

A service as it is in one environment.

json
{
  "id": "…", "project_id": "…", "environment_id": "…",
  "name": "web", "slug": "web", "icon": null, "kind": "web",
  "status": "active",
  "source": { "type": "image", "image": "nginxdemos/hello:latest", "repo": null, "branch": null, "root_dir": null, "template": null },
  "config": ServiceConfig,
  "private_hostname": "web.production.internal",
  "private_hostnames": ["web.production.internal", "web.production.shop-3f9a12bc.internal"],
  "vpc": { "id": "…", "name": "backend", "slug": "backend" } or null,
  "domains": [Domain],
  "volume": Volume or null,
  "tcp_proxies": [Public TCP port],
  "latest_deployment": Deployment or null,
  "detected_plan": { … } or null,
  "connections": ["<id of a service this one references>"],
  "canvas": { "x": 0, "y": 0 },
  "created_at": "…", "updated_at": "…"
}
  • kind: web, worker, cron, database, agent or function.
  • status: inactive (never deployed), building, deploying, active, sleeping (scaled to zero, see Sleep when idle), stopped, failed, crashed or removed.
  • source.type: github, image, template, inline (a function's code, stored by Fjordrun) or empty.
  • config: build, deploy and resource settings. See ServiceConfig for every field and its default.
  • private_hostname: reachable from the other services in the same environment (see Private networking).
  • private_hostnames: the short hostname, then the project-qualified one, which services in other projects of the same private network use.
  • vpc: the private network the service's environment is in, or null.
  • detected_plan: what the builder detected in the last build (framework, package manager, commands).
  • tcp_proxies: the service's public TCP ports in this environment.

Deployment ​

json
{
  "id": "…", "service_id": "…", "environment_id": "…",
  "status": "success", "trigger": "manual", "is_active": true,
  "image": "registry.fjordrun.com/…@sha256:…",
  "commit_sha": "4f1c2e9", "commit_message": "Fix checkout", "commit_author": "ana",
  "created_by": { "id": "…", "name": "Ana" },
  "detected_plan": { … } or null,
  "created_at": "…", "started_at": "…", "finished_at": "…"
}
  • status: in progress: queued, building, deploying. Finished: success, failed (build or start failed), crashed (the container kept exiting), cancelled, skipped or removed (replaced by a newer deployment).
  • trigger: what started it: manual, api, git_push, config_change, redeploy, rollback, template, cron or webhook.
  • is_active: this deployment is the one serving the service.

Function ​

A Service of kind function with a function block (returned by the function endpoints):

json
{
  "id": "…", "kind": "function", "name": "hello", "status": "active", … every Service field …,
  "function": {
    "runtime": "node22", "runtime_name": "Node.js 22", "entry": "index.mjs",
    "memory_mb": 256, "timeout_s": 30, "concurrency": 10, "max_replicas": 1, "idle_timeout_s": 120,
    "auth": "public", "token_header": null,
    "url": "https://hello-production-1a2b.fjordrun.app",
    "code": Function code (without files) or null,
    "deployed_sha256": "…" or null
  }
}
  • auth: public or token; with token, token_header is X-Fjordrun-Token.
  • code: the latest saved inline code; null for a function deployed from GitHub.
  • deployed_sha256: the sha256 of the code the live deployment runs. Equal to code.sha256 when the saved code is deployed.

Function code ​

json
{
  "id": "…", "sha256": "…", "size_bytes": 412, "paths": ["index.mjs", "package.json"], "created_at": "…",
  "files": [{ "path": "index.mjs", "content": "export default …" }]
}

files is only in GET /functions/{id}/code and PUT /functions/{id}/code (which returns { "code": Function code, "deployment": Deployment or null }).

Function invocation ​

The response of POST /functions/{id}/invoke:

json
{
  "status": 200, "headers": { "content-type": "application/json" },
  "body": "{\"hello\":\"world\"}", "body_encoding": "utf-8", "body_bytes": 17, "truncated": false,
  "duration_ms": 42
}

body_encoding is base64 when the body isn't text. Bodies over 1 MB are cut (truncated: true).

Function stats ​

json
{
  "range": "1h", "step_s": 60,
  "totals": { "invocations": 1200, "errors": 3, "error_rate": 0.0025, "timeouts": 0, "cold_starts": 2,
              "p50_ms": 18.4, "p95_ms": 61.0, "gb_seconds": 4.2 },
  "series": { "invocations": [["<time>", 20], …], "errors": [["<time>", 0], …], "p95_ms": [["<time>", 58.1], …] }
}

Totals are null when metrics are not available.

Log line ​

json
{ "ts": "…", "stream": "deploy", "level": "info", "message": "Deployment is live", "replica": null }

stream: build, deploy or http. Runtime logs (GET /services/{id}/logs) come from your running containers.

Variables ​

Service and shared variables are returned as:

json
{
  "variables": { "DATABASE_URL": "${{Postgres.DATABASE_URL}}", "MODE": "prod" },
  "resolved": { "DATABASE_URL": "postgresql://…", "MODE": "prod" }
}

variables holds what you set, including references; resolved holds the values the service receives.

Domain ​

json
{
  "id": "…", "hostname": "shop.example.com", "kind": "custom", "target_port": 8080,
  "status": "pending_dns", "url": "https://shop.example.com",
  "dns_records": [
    { "type": "CNAME", "name": "shop.example.com", "value": "edge.fjordrun.app" },
    { "type": "TXT", "name": "_fjordrun.shop.example.com", "value": "fjordrun-verify=…" }
  ],
  "created_at": "…"
}
  • kind: generated (a *.fjordrun.app hostname) or custom.
  • status: pending_dns (create the records, then verify), provisioning_tls or active.

Public TCP port ​

A port on the shared TCP proxy that forwards to one port of a service (see Public TCP).

json
{ "id": "…", "host": "tcp.fjordrun.app", "port": 20345, "target_port": 5432, "created_at": "…" }
  • host and port: where clients connect. port is assigned from 20000-29999.
  • target_port: the port the service listens on.

Connection details ​

Returned by GET /services/{id}/access for services created from a template (null for other services): the login and connection values shown in the dashboard, filled in from the service's variables.

json
{
  "fields": [
    { "label": "Username", "value": "postgres", "secret": false },
    { "label": "Password", "value": "…", "secret": true },
    { "label": "Connection URL", "value": "postgresql://postgres:…@postgres.production.internal:5432/fjordrun", "secret": true },
    { "label": "Public connection URL", "value": "postgresql://postgres:…@tcp.fjordrun.app:20345/fjordrun", "secret": true }
  ],
  "notes": "Private to this project: …",
  "public_url": "postgresql://postgres:…@tcp.fjordrun.app:20345/fjordrun"
}
  • public_url: the connection URL through public TCP when it is on for the port the connection URL uses, else null. It is also added to fields as Public connection URL.

Volume ​

json
{ "id": "…", "name": "web-data", "mount_path": "/data", "size_gb": 5, "used_mb": 120, "created_at": "…" }

Private network ​

A VPC: environments of several projects whose services reach each other privately.

json
{
  "id": "…", "team_id": "…", "name": "backend", "slug": "backend", "description": null,
  "members": [Private network member],
  "created_at": "…", "updated_at": "…"
}

Private network member ​

One project environment in a private network, with its services and their project-qualified hostnames.

json
{
  "project_id": "…", "project_name": "Billing",
  "environment_id": "…", "environment_name": "production", "environment_slug": "production",
  "added_at": "…",
  "services": [
    { "id": "…", "name": "api", "kind": "web", "status": "active", "port": 8080,
      "private_hostname": "api.production.billing-3f9a12bc.internal" }
  ]
}

Volume file ​

json
{ "name": "report.csv", "path": "/exports/report.csv", "type": "file", "size": 20480, "modified": "…" }
  • path: relative to the volume root (/ is the folder the volume is mounted at).
  • type: file, dir, symlink or other. size is in bytes.

Folder listing ​

json
{ "path": "/exports", "mount_path": "/data", "entries": [ { "name": "report.csv", … } ], "truncated": false }

entries are volume files, folders first. truncated is true when the folder has more than 2000 entries and only the first 2000 are listed.

Replica ​

json
{ "name": "web-production-1a2b3c4d-7d9c5b8f6-x2k4q", "ready": true, "started_at": "…" }

A running pod of a service: the target of a shell.

Shell ticket ​

json
{
  "ticket": "fjr_sh_…", "expires_at": "…",
  "url": "wss://api.fjordrun.com/api/v1/services/…/shell?ticket=fjr_sh_…",
  "replica": "web-production-1a2b3c4d-7d9c5b8f6-x2k4q", "replicas": [ { "name": "…", "ready": true, "started_at": "…" } ]
}

Opens one WebSocket within 30 seconds. See Shell and files → API.

Activity ​

json
{
  "id": "…", "actor": { "id": "…", "name": "Ana" }, "action": "deployment.triggered",
  "target_type": "service", "target_id": "…", "target_name": "web", "metadata": { … }, "created_at": "…"
}

Team API token ​

json
{ "id": "…", "name": "github-actions", "prefix": "fjr_ab12", "project_id": null, "last_used_at": null, "created_at": "…" }

Only the response that creates a token includes token, the full secret. Store it then: it can't be shown again.

Secret ​

{ "id": "…", "name": "STRIPE_KEY", "created_at": "…", "updated_at": "…" }

Team secrets are write-only: the API never returns their values.

Fjordrun is hosted in the EU (Hetzner, Nuremberg, Germany). Private beta.