Skills
Skill 8 of 14
Run Deepgram in infrastructure you control.
11 minutes · 2,310 words · 10 sections
Install
npx skills add deepgram/skills --skill self-hostednpx skills add deepgram/skills/plugin marketplace add deepgram/skillsThe first command installs just this skill, by the name in its SKILL.md; the second installs the whole repository.
Deepgram ships its inference stack as container images you run on your own NVIDIA GPUs. Audio never leaves your network; only small license-verification messages do. This skill decides whether you need that, gets you licensed, and routes to the deployment target.
Self-hosting is gated on an Enterprise agreement. Read Decide before you deploy first — a large share of “we need on-prem” requirements are actually data-residency requirements that a regional endpoint already satisfies, with none of the GPU operations.
Read down the table and take the first row whose requirement you actually have. If none of them apply, the hosted API is the answer.
| Requirement | Answer | What you operate |
|---|---|---|
| Audio may not leave your network, or you need bare metal, an air gap, or FIPS crypto | Full self-hosted containers | GPUs, drivers, containers, models, scaling |
| Must run inside your AWS account, and you want AWS to handle provisioning and scaling | Amazon SageMaker via AWS Marketplace | A SageMaker Endpoint |
| Dedicated capacity, regional control, or compliance isolation — but not your hardware | Deepgram Dedicated (opens in a new tab) — {SHORT_UID}.{REGION}.api.deepgram.com | Nothing — existing API keys work |
| Data must be processed in the EU, Australia, or India | Regional endpoint: api.eu.deepgram.com, api.au.deepgram.com, api.in.deepgram.com | Nothing — same API keys and SDKs, change the base URL only |
| None of the above | Hosted API, api.deepgram.com | Nothing |
People reach for the top row first. Most requirements are satisfied by a row further down.
The three regional endpoints serve Speech-to-Text, Text-to-Speech, Voice Agent, and Text Intelligence. Confirm the current limitations at Regional Endpoints (opens in a new tab) before you promise a region to a customer.
Self-hosting is the most expensive row in engineering time. Choose it for a real network, sovereignty, or air-gap constraint — not for latency, which regional and Dedicated endpoints address without handing you a GPU fleet.
Nothing runs without both of these, and they are different things people routinely conflate.
| Self-hosted API key | Distribution credentials | |
|---|---|---|
| What it is | DEEPGRAM_API_KEY — licenses running containers | A Quay username and secret — pulls container images |
| Looks like | A normal Deepgram API key secret | deepgram+6ba7b810-… plus a 64-character secret |
| Where it goes | Container environment; [license] in api.toml / engine.toml | docker login quay.io, or a Kubernetes image-pull Secret |
| Created by | Console → API Keys, or the project keys API | Console → Self-Hosted tab, or the distribution-credentials API |
Steps:
Confirm project access. Your Console project needs a Self-Hosted tab. No tab means the project was never granted self-hosted products, or has managed access but not self-service. Both are resolved by Deepgram — contact sales (opens in a new tab) or your account representative. You cannot self-serve past this.
Create a self-hosted API key in Console (opens in a new tab). Expand its details to see which self-hosted products it may license. All self-hosted customers get API and Engine; the License Proxy must be enabled for your project by Deepgram Support.
Create distribution credentials in the Console Self-Hosted tab. The secret is displayed once — record it immediately. Verify from the CLI:
# List existing credential sets (read-only, safe)
curl -s -H "Authorization: Token $DEEPGRAM_API_KEY" \
"https://api.deepgram.com/v1/projects/$DEEPGRAM_PROJECT_ID/self-hosted/distribution/credentials"Returns 200 with a distribution_credentials array. Note the hyphen in self-hosted — selfhosted returns 404.
A 200 here does not mean your project has self-hosted access. On a project with no self-hosted entitlement the endpoint still returns 200 with an empty array rather than a 403. The Console Self-Hosted tab in step 1 is the real entitlement check; an empty list proves nothing either way.
The POST variant takes a scopes query parameter, which accepts self-hosted:products (the default, meaning all) or per-product scopes: self-hosted:product:api, :engine, :license-proxy, :dgtools, :billing, :hotpepper, :metrics-server. Only api, engine, license-proxy, and billing map to containers documented publicly; the rest are undocumented, so scope credentials to what you actually deploy. provider accepts quay.
Log in to Quay on every deployment host: docker login quay.io (or podman login).
Get the model files. Deepgram delivers encrypted .dg model files as download links from your account representative. They are not in any public repository and are not on Quay. See Gated by a human.
Verify runtime licensing. Containers hold an outbound HTTPS connection to license.deepgram.com:443 for licensing and usage reporting. That connection uses mTLS, so probing it with curl or an SSL scanner produces spurious errors — that is expected, not a fault. A 401 in container logs means the API key lacks self-hosted permissions; a timeout means your firewall is blocking the egress.
To rotate or revoke credentials, use the four endpoints documented in the api skill’s references/self-hosted.md.
| Component | Image | Role | Required |
|---|---|---|---|
| API | quay.io/deepgram/self-hosted-api | Accepts requests, serves /v1/listen, /v1/speak, /v2/listen, /v2/speak, /v1/agent/converse; delegates inference | Yes |
| Engine | quay.io/deepgram/self-hosted-engine | Runs inference on the GPU; loads .dg models | Yes |
| License Proxy | quay.io/deepgram/self-hosted-license-proxy | Caches licensing so a license-server outage does not stop inference; can be the only container with egress | Recommended in production; access granted by Deepgram |
| Billing | quay.io/deepgram/self-hosted-billing | Validates a license file locally and journals usage — air-gapped deployments only | Air gap only |
Images are tagged by release date, for example release-260915 — the tag carried across the Docker, Podman, and Helm templates and the Helm chart’s appVersion. Check the templates for the current one. Pin an explicit tag; never rely on a floating one.
Minimum viable deployment: one API container plus one Engine container on one GPU host, with api.toml, engine.toml, and at least one .dg model. The License Proxy and Billing containers are additive.
Default ports, from the template TOML files: API 8080; Engine 8080 for API-to-Engine traffic and 9991 for its metrics server; License Proxy 8443 for license verification and 8080 for its /v1/status health route.
Deepgram does not terminate TLS for you. Put your own proxy (NGINX, HAProxy, Apache) in front of the API container.
| Target | Use when | Reference |
|---|---|---|
| Docker / Podman Compose | Single host, a proof of concept, bare metal, or the simplest air gap | docker-podman.md (opens in a new tab) |
| Kubernetes + Helm | Production, autoscaling, multi-node, air-gapped or FIPS deployments, Voice Agent | kubernetes.md (opens in a new tab) |
| Amazon SageMaker | AWS-only, and you want AWS to provision and scale | sagemaker.md (opens in a new tab) |
| — | Sizing hosts, choosing GPUs, drivers, OS, firewall rules | hardware.md (opens in a new tab) |
Official templates for the first two live in deepgram/self-hosted-resources (opens in a new tab) (public): docker/, podman/, charts/deepgram-self-hosted/, common/ (TOML configs), plus benchmarking/ (k6 load scripts), monitoring/ (Grafana dashboards, Prometheus alert rules), and diagnostics/ (log parser, NVIDIA setup validator).
Self-hosted is not a mirror of the hosted API. Newer models exist self-hosted but are off by default, need a minimum image release, need a model file you request by hand, and — critically — need their own dedicated Engine.
| Product | Self-hosted? | Enable with | Minimum image | Co-residency |
|---|---|---|---|---|
Nova-3 / Nova-2 STT (/v1/listen) | Yes | Default | — | Shares an Engine with other Nova models |
Aura-1 TTS (/v1/speak) | Yes | Default — model files only | — | Dedicated TTS node recommended |
Aura-2 TTS (/v1/speak) | Yes | aura2.enabled plus a language block (Helm) | — | Two GPUs per Engine; dedicated TTS node |
Flux STT (/v2/listen) | Yes | Engine [flux] enabled; API [features] listen_v2 | release-251015 | Dedicated Engine. Cannot share with any other model |
Flux TTS (/v2/speak) | Yes | Engine [flux_tts] enabled; API [features] speak_v2, speak_v2_streaming | release-260812 | Dedicated Engine. Engine refuses to start if Aura is also configured |
Voice Agent (/v1/agent/converse) | Yes | agent.enabled (Helm) | — | Needs STT and TTS Engines running alongside the API |
Consequences worth stating out loud before an evaluation:
Audio intelligence features (entity detection, redaction, NER formatting) depend on separate models being present, and are toggled under [features] in api.toml. Presence of the feature flag is not presence of the model.
Be honest with anyone planning a timeline. These cannot be self-served and are not in public documentation:
.dg model file — links from your account representative. This is the hard blocker: you can pull images and write configs without one, and still serve nothing.[flux] max_streams — the concurrency limit per GPU. There is no published per-GPU table; the doc says to ask your account representative. Leaving it auto-calculated causes agents to hang, dropped calls, and audio_window_end increased by more than 3 frames in API logs.[flux_tts] max_batch_size — no safe default exists; Engine refuses to start while it is 0, which is what the shipped templates set. The right value differs substantially per GPU and comes from your account representative.uuid — partly gated. The Helm chart and the docs page both use an empty placeholder, but the two shipped Compose templates (common/*/engine.flux-tts.toml) hardcode a real UUID, so a Compose user who downloads the template already has a working value. The template comment still says to obtain it from your account representative — confirm the UUID matches the release you are deploying rather than assuming the checked-in one is current.Hardware sizing beyond the published minimums is also a conversation: the docs repeatedly direct you to Support for a customized recommendation.
docker login or containers that pull and then die on a licensing 401.sudo docker compose up without preserving the key. The templates interpolate ${DEEPGRAM_API_KEY}, and sudo drops it. Use sudo --preserve-env=DEEPGRAM_API_KEY docker compose up -d.>=580 in the open kernel-module flavor. On Blackwell the proprietary 580 branch does not support the GPU at all, so the card is invisible to the host.NVIDIA_VISIBLE_DEVICES and NVIDIA_DRIVER_CAPABILITIES. Without them the nvidia-container-runtime injects no CUDA libraries and Engine dies with libcuda.so.1: cannot open shared object file. On GKE with Container-Optimized OS the equivalent failure needs LD_LIBRARY_PATH instead — chart 0.41.1+ sets it for you.license.deepgram.com to start. If it cannot and the old one is already gone, every container in the environment fails to license and shuts down. Use blue-green.curl or an SSL scanner errors against license.deepgram.com. That is correct behavior.release-260115 changed API-to-Engine communication and is not backwards compatible for TTS traffic. The new Engine (3.107.0-1) is compatible with previous API versions, so it must be running before the updated API (1.176.0) serves requests — Engine first, then API. STT-only deployments are unaffected. Read the January 15, 2026 changelog (opens in a new tab) before any TTS upgrade; each self-hosted release has its own entry with its own ordering and minimum-driver requirements.api skill, file references/self-hosted.md.api skill. Self-hosted serves the same contracts on your own host.speech-to-text, text-to-speech, or voice-agent skill.deepgram-sagemaker skill in deepgram-devs/dg-sagemaker (opens in a new tab) (public). This skill’s sagemaker.md (opens in a new tab) covers the decision and the SDK transports; that skill covers the AWS mechanics.starters skill.docs skill.setup-mcp skill.Append .md to any developers.deepgram.com page for clean Markdown. llms.txt (opens in a new tab) is the full documentation index and lists the self-hosted pages, which run to several dozen — more than this skill cites.
Run Deepgram in infrastructure you control. Use when a task says "self-hosted", "self hosting", "on-prem", "on-premise", "air-gapped", "airgapped", "private deployment", "BYOC", "docker compose deepgram", "podman", "kubernetes", "helm chart", "sagemaker", "license proxy", "quay.io", "distribution credentials", "data residency", or "FIPS". Decides whether self-hosting is even the right answer versus a regional endpoint or Deepgram Dedicated, walks the licensing and container credential bootstrap, and routes to per-target guidance for Docker/Podman, Kubernetes/Helm, and Amazon SageMaker.
The verbatim description from this skill’s front matter — the string an agent matches on to decide whether to load it.
main, last pushed 20 September 2026.SKILL.md, not by matching a directory convention. One layout observed: skills/*/SKILL.md.h1 and no skipped levels:.claude-plugin/marketplace.json by Deepgram Developer Relations, declaring 7 plugins. It is read for editorial metadata only — never as the skill index, which is always the repository tree./deepgram/skills.md, and each skill at its own .md URL.4 files · 48 KB
Everything this skill ships beside its prose. All of it is set here, as subchapters of skill 8.
Documentation the agent loads on demand, rather than up front.