Skip to content
BuildStackHQHosting

EU hosting for AI agents

Run your agents in Frankfurt. Behind a boundary the network enforces.

Agents, services and APIs, static sites and managed Postgres and Valkey, on one platform in eu-central-1. Egress is denied unless you list the host, and every model call and every tool call is a step in the trace.

  • One region, Frankfurt
  • Deny-all egress
  • Every step on record
  • Billed in euros
terminal
npm install -g @keelhosting/clikeel loginkeel init --template api-nodekeel deployRevision rev_01JA2K is live in eu-central-1Egress: deny-all, allowlist v12, 0 custom hostshttps://hello-api-0a1b2c3d.svc.keelhosting.devkeel db create postgreskeel domains add api.example.com
npm install -g @keelhosting/cli

What you can host

Four kinds of thing. One region, one CLI, one bill.

Your app does not have to move for the agent to move. When it does, the rest of the stack has somewhere to land, under the same egress policy and the same trace.

  • 01

    Agents

    On a schedule, on a webhook, or always on.

    Every call that leaves the container is recorded by the gateway, with the policy version that allowed it, so the step is there whether or not your code logged it.

    Turn checkpoints on and a run that failed halfway resumes from its last one instead of starting at step one. Every plan has a wall-clock ceiling the executor enforces and a reaper that fails orphaned runs, so a stuck agent never bills forever.

    keel run invoice-reconciler --follow

    79 EUR a month for an agent you keep up

  • 02

    Services and APIs

    Always-on containers with public HTTPS.

    A new revision is rolled out one replica at a time, and a replica that fails its health check is replaced while the others keep serving.

    A Node, Python or Go API, a Telegram bot, a worker. The platform keeps it up, restarts a crashed replica with exponential backoff, and holds the whole service after five consecutive crashes instead of hammering it.

    keel deploy

    79 EUR per replica-month, pro-rated by the hour

  • 03

    Static sites

    Your frontend, on your own domain, in Frankfurt with the rest of it.

    Every deployment is immutable, so rolling back switches a pointer and the previous bytes come back exactly as they were.

    Upload a build directory and it is live in seconds. Hashed assets are served immutable, HTML is revalidated, text is compressed, and certificates are issued and renewed for you.

    keel sites deploy ./dist

    Included on Pro and Enterprise

  • 04

    Databases

    Managed Postgres and Valkey, one command each.

    Neither has a public port. They answer only on the internal agent network, which is why database traffic never touches the egress gateway.

    Creating one writes the connection URL into your organization's secrets, and the next deploy injects it as an environment variable. Backups run nightly and a deleted store is kept for seven days before it is purged.

    keel db create postgres

    Postgres 19 EUR, Valkey 9 EUR per month

How a deploy works

From an empty directory to your own domain.

Three commands, and the same three whether it is an agent, an API or a site. No console, no region to pick.

  1. 01keel init

    Describe the app

    Pick a template or let the CLI read the project. It writes a keel.yaml naming the app, its resources, its secrets and the hosts it may talk to.

  2. 02keel deploy

    Build and ship

    The image is built in Frankfurt, a revision is created, and the service answers on its platform hostname with egress locked to the allowlist.

  3. 03keel domains add api.example.com

    Put it on your domain

    Create the TXT and CNAME records the command prints. The certificate is issued on the first request and renewed for you, and traffic moves over with no restart.

No Dockerfile, no problem.

A Node, Bun, Python or Go project without one is detected and a Dockerfile is rendered for the build. Run keel deploy --print-dockerfile to read it before it ships.

A bad revision does not take the service down.

A revision freezes the image, the CPU and memory, the egress hosts and the secrets together. A service rolls out one replica at a time: the new one has to pass its health check before the old one is drained, and a replica that never becomes ready is stopped while the old ones keep serving.

The run trace

Two in the morning, the run failed, and this is the screen.

The ERP session expired and answered with its sign-in page, carrying a 200. A container host tells you the process exited. The trace tells you which step, what came back, and what the model would have read next.

run_01J9X4M2K7Q8ZP3VBN6RDT5W
02:14:07 · 6.40s · eu-central-1
agent
invoice-reconciler
revision
rev_01J9WZ
trigger
schedule · every 15m
error
tool_output_invalid
01model1.84sokbedrock.eu / anthropic.claude-sonnet

input

system: You reconcile open invoices against ERP records.
user: Reconcile invoices created since 2026-09-16T02:00:00Z.

output

tool_use: erp.list_open_invoices
  { "since": "2026-09-16T02:00:00Z", "limit": 50 }
02tool412msokerp.list_open_invoices200

input

GET https://erp.internal.example/api/invoices?since=2026-09-16T02:00:00Z&limit=50
authorization: Bearer ****

output

{ "invoices": [ { "id": "inv_4471", "total": 1290.00, "currency": "EUR" }, … 11 more ] }
03model2.21sokbedrock.eu / anthropic.claude-sonnet

input

tool_result: erp.list_open_invoices → 12 invoices

output

tool_use: erp.get_invoice
  { "id": "inv_4471" }
04tool1.29sfailederp.get_invoice200

Response was text/html, expected application/json. The ERP session expired and returned its sign-in page with a 200.

input

GET https://erp.internal.example/api/invoices/inv_4471
authorization: Bearer ****

output

<!doctype html>
<html lang="en">
<head><title>Sign in · ERP</title></head>
<body><form action="/login" method="post">…
05error3msfailedrun failed

input

classification: tool_output_invalid
step: 4
policy: fail_fast

output

Callback queued → https://app.example.com/hooks/agent-runs (delivery dlv_01J9X4N)

5 steps, 5.75s recorded, 6.40s end to endstep 04 failed after 1.29s

The supervisor redacts every payload before it leaves the container, and what is stored is encrypted with a key held in the same region. Set trace.capture to structure or metadata in keel.yaml and the gateway never writes the bodies at all.

Residency and egress

Where the data goes, and what stops it leaving.

A region picker tells you where the data starts. It says nothing about where it can go. Four mechanisms hold the boundary up, and you can check every one of them.

eu-central-1, Frankfurt

  • agent run
  • api service
  • static site
  • postgres
  • valkey
  • logs
  • trace payloads
  • backups

egress gateway

The only route out. It reads the hostname from the TLS handshake before it forwards anything.

  • Allowed

    A model endpoint on the verified list

    Inspected and recorded as a model step, with the request and the response kept.

  • Allowed, and yours

    A host you listed in keel.yaml

    Recorded as a tool step. A host you add is outside the residency guarantee, and the dashboard says so.

  • Denied

    Every other hostname, IP literals, any port but 443

    The connection is closed before a byte is forwarded and an error step is written into the trace.

  1. 01

    One region

    Compute, databases, backups, logs, traces and build artifacts are created in eu-central-1, Frankfurt, and nowhere else. There is no second region to fail over to, which is the point.

  2. 02

    One door

    Outbound traffic from a container reaches the internet only through the egress gateway. It reads the hostname out of the TLS handshake and matches it against the policy before a single byte is forwarded.

  3. 03

    A list, not a promise

    The verified endpoint list is versioned data with the evidence recorded for each entry, and an agent pins the version it was deployed against, so the boundary cannot move underneath a running agent.

  4. 04

    Encrypted where it sits

    Trace payloads and the rest of your data at rest are encrypted with a KMS key held in the same region. Per-organization keys, one per tenant, are not in place yet.

A host you add yourself is outside that guarantee, and the dashboard says so where you add it, though every connection to one is still a step in the trace. Every company that can touch your data, and every gap we know about, is on the trust page.

Pricing

Every price is on this page.

One price: 79 EUR per agent per month. Count the agents you want up and you have the bill. Every agent runs in Frankfurt with the same egress policy and the same trace. Enterprise pays for the guarantee in writing, not for more compute.

  • Free

    0 EUR

    per month, where a new organization starts

    The plan an organization is on before it pays for anything.

    • 1 agent
    • 50,000 steps a month for each agent
    • 5-minute maximum run duration
    • The same Frankfurt region and the same egress allowlist
    • Every model call and every tool call in the trace
    • 3-day trace retention
    • An agent you keep up, a database or a site needs a payment method
  • One price

    Pro

    79 EUR

    per agent per month

    Teams running agents in production. Three agents cost three times 79 EUR, and nothing else changes.

    • Every agent 79 EUR a month, pro-rated by the hour it is up
    • The container, its hostname, a custom domain, traces, logs and metrics
    • 50,000 steps a month for each agent
    • Steps above 50,000 cost 2 EUR per 1,000
    • Managed Postgres 19 EUR and Valkey 9 EUR per month
    • Static sites and custom domains included
    • 30-day trace retention
    • Tool connectors and outbound callbacks
    • A spend cap you set, checked before a run starts
  • Enterprise

    From 25,000 EUR

    per year, invoiced

    Organisations that need the residency guarantee in writing.

    • The same per-agent price, on a contract
    • Signed data processing agreement
    • Customer-managed encryption key
    • SSO and audit log export
    • Long-running, checkpointed runs
    • Managed Postgres 19 EUR and Valkey 9 EUR per month
    • Static sites and custom domains included
    • 90-day trace retention
    • Private network option and SLA

What the rest of the stack costs on top

Databases are priced per resource and steps past the allowance are metered, in euros. Sites, custom domains and egress cost nothing.

Agent
79 EUR per month
One always-on agent, with its hostname, a custom domain, traces, logs, metrics and 50,000 steps. Pro-rated by the hour it is up, and priced the same way for each replica you run.
Managed Postgres
19 EUR per month
Backed up nightly, connection string injected as a secret.
Managed Valkey
9 EUR per month
Redis-compatible cache and queue, same region as your agents.
Steps above the allowance
2 EUR per 1,000 steps
Each agent brings 50,000 steps a month with it. Past that, steps are metered, and the spend cap you set is what stops the bill.

A step is one model call or one tool call. It is the unit the trace already counts, so the number you are billed on is the number on the run you are reading. The allowance is per agent and it resets every month. Crossing it stops nothing. The spend cap you set is what stops spending.

An agent is billed by the hour a replica is up, so a second replica of the same agent costs a second 79 EUR a month and an agent you stop halfway through the month costs half. Steps above the allowance are metered and settled separately. Managed databases are billed per database-month, pro-rated the same way. Sites and custom domains are included, and there is no charge for egress. Model tokens are not billed by us. You bring your own model credentials and pay your provider directly.

Every limit, written down.

These are the ceilings the platform enforces, not guidance. A request that would cross one is refused with the limit named in the error.

  • Agents

    Free
    1
    Pro
    Unlimited
    Enterprise
    Unlimited
  • Steps included per agent per month

    Free
    50,000
    Pro
    50,000
    Enterprise
    50,000
  • Longest single run

    Free
    5 minutes
    Pro
    2 hours
    Enterprise
    24 hours
  • Runs at the same time

    Free
    1
    Pro
    25
    Enterprise
    50
  • Always-on services

    Free
    1
    Pro
    Unlimited
    Enterprise
    Unlimited
  • Replicas per service

    Free
    1
    Pro
    5
    Enterprise
    10
  • CPU and memory per run

    Free
    0.25 vCPU, 0.5 GB
    Pro
    2 vCPU, 8 GB
    Enterprise
    4 vCPU, 30 GB
  • Managed data stores

    Free
    None
    Pro
    Unlimited, 10 GB each
    Enterprise
    Unlimited, 50 GB each
  • Static sites

    Free
    1
    Pro
    Unlimited
    Enterprise
    Unlimited
  • Custom domains

    Free
    None
    Pro
    Unlimited
    Enterprise
    Unlimited
  • Persistent workspace per agent

    Free
    1 GB
    Pro
    5 GB
    Enterprise
    50 GB
  • Trace retention

    Free
    3 days
    Pro
    30 days
    Enterprise
    90 days

Container logs are searchable for seven days on every plan, and a site deployment may be up to 250 MB across 10,000 files, also on every plan. The step allowance is counted per agent, so it grows with the agents you keep up rather than being a pool you divide.

FAQ

Questions teams ask first.

What is a step, and what happens when I go past the allowance?

A step is one model call or one tool call, the same unit the trace counts. Each agent brings 50,000 steps a month and the allowance resets monthly. Crossing it stops nothing: steps above it cost 2 EUR per 1,000, and the spend cap you set is what stops spending.

Do you resell model tokens?

No. You bring your own model credentials and pay your provider directly. The platform decides which model endpoints can be reached at all and records every call to them.

Where does my data live?

Compute, databases, backups, logs, traces and build artifacts are created in eu-central-1, Frankfurt, and nowhere else. There is one region and no failover to a second one, and the trust page says plainly what that costs you.

What happens when my code calls a host that is not on the list?

The connection is closed at the network before a byte is forwarded, and an egress_denied step is written into the trace, so a missed host shows up as a step rather than a silent timeout. Hosts your app needs go under egress.customHosts in keel.yaml.

Do I need a Dockerfile?

No. A Node, Bun, Python or Go project without one is detected and a Dockerfile is rendered for the build. keel deploy --print-dockerfile shows it to you before anything ships. If you have your own Dockerfile, it is used as it is.

Can I keep customer data out of the trace?

Yes. trace.capture in keel.yaml sets it per app: full records both bodies minus your secret values, structure records only their shape, and metadata records no body at all. Below full the gateway never writes the body, so there is nothing to delete later.

Which security audits have you passed?

None. There is no SOC 2 report, no ISO 27001 certificate, and there has been no external audit or penetration test. The trust page lists that and every other gap we know about, next to the documents we can send you.

How do I leave?

The EU Data Act switching rules apply: thirty days to switch and at least thirty more to retrieve your data, and we charge nothing for either. A full export is done by hand today, for free, on request.

The boundary is built. Come and run something on it.

A new organization starts on the free plan with one agent. Add a payment method when you want an agent you keep up, a database or a site.