Developer API

Same API shape. No exposure.

OpenAI-compatible endpoint inside your VPN. Point any tool that speaks the OpenAI REST format at it. Your prompts never cross the public internet.

terminal
# Two environment variables. That's the migration.
export OPENAI_BASE_URL="http://api.us-east-1.pro.tpai.internal/v1"
export OPENAI_API_KEY="tpai-sk-..."

# Your existing code works unchanged.
curl -s -X POST \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"anthropic.claude-3-5-haiku-20241022-v1:0",
       "messages":[{"role":"user","content":"Hello."}],
       "max_tokens":50}' \
  "$OPENAI_BASE_URL/chat/completions"

The tradeoff you should not have to make

Every API call to a public provider crosses the open internet

Your prompt leaves your network, lands on their servers, passes through their infrastructure. You are trusting their retention policy, their access controls, and their incident response.

Public LLM API

Your data on their servers

your machine public internet provider CDN provider SaaS fleet their model hosts
  • Prompts cross the public internet in every request
  • Provider has technical ability to read your data
  • Retention, logging, and training governed by their policy
  • Credential compromise = internet-reachable endpoint
  • Audit trail owned and controlled by the provider
TPAI API

Your data inside the boundary

your machine VPN tunnel private VPC Bedrock response back to you
  • No packet crosses the public internet
  • No third-party SaaS endpoint in the traffic path
  • Prompts and completions never leave the air-gapped environment
  • VPN-only: endpoint has no public DNS or public IP
  • Audit trail stays inside the TPAI infrastructure

How it works

OpenAI wire format. Air-gapped infrastructure.

The proxy sits behind an internal load balancer in your TPAI VPC. It speaks the OpenAI REST shape and delegates to AWS Bedrock via PrivateLink. No internet hop anywhere in the chain.

VPN-only endpoint

No public DNS. No public IP. The only way to reach the proxy is through your encrypted VPN tunnel. If the tunnel is down, the endpoint does not exist.

Per-user API keys

Every user gets their own tpai-sk- key, stored in DynamoDB encrypted with a customer-managed KMS key. No shared tokens. No wildcard credentials.

No third-party provider

Traffic terminates at AWS Bedrock via PrivateLink inside the TPAI infrastructure. No OpenAI. No Anthropic SaaS. No Google AI Studio. The models run inside the air-gapped boundary.

traffic path
# Every hop after your laptop is inside the air-gapped VPC.
# No packet on this path crosses the public internet.

your laptop
   VPN tunnel (encrypted)
     internal ALB (private IP only)
       proxy Lambda (validates your tpai-sk- key)
         Bedrock Gateway ALB (SG-restricted)
           AWS Bedrock (TPAI-managed, via PrivateLink)
             response back to you

Drop-in compatible

Change two env vars. Keep your stack.

If your tool speaks the OpenAI REST format, it works with the TPAI API. No new SDK. No wrapper library. No code changes.

python
from openai import OpenAI

client = OpenAI(
    base_url="http://api.us-east-1.pro.tpai.internal/v1",
    api_key="tpai-sk-..."
)

response = client.chat.completions.create(
    model="anthropic.claude-3-5-haiku-20241022-v1:0",
    messages=[{"role": "user",
               "content": "Summarize this contract."}],
    max_tokens=500
)

print(response.choices[0].message.content)

Works with your tools

Cline
VS Code AI agent
n8n
Workflow automation
Open Code
Terminal coding agent
Open Notebook
AI notebook interface
openai SDK
Python & JS/TS
curl
Direct HTTP
Any OpenAI-compatible client
If it can point at a custom base URL, it works.

What's available

Routes, models, and honest limits

Supported routes

POST /v1/chat/completions with optional tool calls and function calling.

GET /v1/models returns the live list of available Bedrock models.

GET /health unauthenticated liveness probe.

Available models

Claude 3.5 Haiku, Claude 3.5 Sonnet, and any other Claude-family model your TPAI account has Bedrock access to. Model list is live from /v1/models.

What's not here yet

Embeddings, image generation, audio, moderation. Streaming is accepted (stream: true) but delivered as a single SSE chunk. Clients parse this correctly; you just won't see tokens arrive incrementally.

Tool calls and function calling work if the underlying model supports them. The proxy is pure pass-through: whatever JSON your client sends goes straight to Bedrock, and whatever comes back goes straight to your client.

Security posture

The comparison your compliance team wants to see

Dimension TPAI API Public LLM API
Network path VPN → air-gapped VPC → Bedrock via PrivateLink Public internet → provider SaaS → their hosts
Endpoint reachability Private DNS, private IP, VPN-only Public DNS, public IP, reachable from anywhere
Credential scope Per-user key, validated inside the TPAI boundary Per-account or per-project key, validated by provider
Key storage CMK-encrypted DynamoDB, air-gapped VPC Provider's key vault, provider operators can read
Data residency Never leaves the air-gapped TPAI environment Leaves your network to provider infrastructure
Provider access to prompts None. No third-party SaaS in the traffic path. Provider has technical ability per their ToS
Audit trail CloudWatch + CloudTrail inside the boundary Provider's dashboard, provider's retention
Internet egress None. VPC has no NAT to public internet. Required for every request

API access included with Pro

Sign up for Totally Private AI Pro and you get the chat interface and the developer API. One subscription, both surfaces. Connect to VPN, get your key, start building.

$199/month — founding beta pricing, locked while you remain subscribed.

You will receive a provisioning package immediately. VPN credentials, API key generation, and full docs included. Up and running in minutes.

Questions about the API?

Architecture deep-dive, integration help, or security review. We are happy to walk through the details.