Appearance
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,hobbyorpro.status:active, orsuspended(out of credit or over the spending limit; services are stopped).role: your role in the team:owner,admin,memberorviewer.
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,agentorfunction.status:inactive(never deployed),building,deploying,active,sleeping(scaled to zero, see Sleep when idle),stopped,failed,crashedorremoved.source.type:github,image,template,inline(a function's code, stored by Fjordrun) orempty.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, ornull.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,skippedorremoved(replaced by a newer deployment).trigger: what started it:manual,api,git_push,config_change,redeploy,rollback,template,cronorwebhook.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:publicortoken; withtoken,token_headerisX-Fjordrun-Token.code: the latest saved inline code;nullfor a function deployed from GitHub.deployed_sha256: thesha256of the code the live deployment runs. Equal tocode.sha256when 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.apphostname) orcustom.status:pending_dns(create the records, then verify),provisioning_tlsoractive.
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": "…" }hostandport: where clients connect.portis 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, elsenull. It is also added tofieldsas 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,symlinkorother.sizeis 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.