Claude API for Internal Company Tools: Setup Guide
Claude API for Internal Company Tools
If you're building internal tools — an HR assistant, a support ticket summarizer, a sales call analyzer, an internal knowledge base chatbot — the Claude API is a strong choice because it handles long context, tool use, and structured output reliably. The practical question isn't "can Claude do this," it's "how do I wire it into a company tool without creating a security and billing mess for my team."
This article covers the actual setup: getting API access, managing keys across multiple internal projects, controlling who can use what, and keeping costs visible as usage grows from one prototype to five internal tools used by forty employees.
What "internal tool" usually means in practice
Internal tools built on the Claude API tend to fall into a few categories:
- Chat-based assistants — a Slack or Teams bot answering questions against internal docs
- Automation scripts — summarizing tickets, generating reports, tagging data
- Dashboards — internal web apps where employees type a request and get a generated answer
- Agents with tool use — Claude calling internal APIs (CRM, ticketing system, database) to fetch or act on data
Each of these needs the same basic infrastructure: an API key, a way to send requests, and some way to track who's using it and how much it costs. The complexity isn't the Claude API call itself — it's everything around it.
Step 1: Get API access
You need an Anthropic API key (or a provider that issues Claude-backed keys) tied to a billing account. For a single internal tool built by one developer, this is a five-minute setup. Problems start when:
- Multiple teams want to build their own tools and all need a key
- Finance wants to know what each tool costs, not just the total bill
- Someone leaves the company and you need to revoke their access without breaking production tools
- You want usage limits per tool so one buggy script can't burn the monthly budget
A raw provider API key doesn't give you per-tool breakdowns or seat-based access out of the box — you have to build that layer yourself, or use a service that already has it.
Step 2: Make the first call
Whatever platform you use, the core request pattern is the same — send a model name, a system prompt, and messages, get a response back.
curl https://api.subtoapi.app/v1/messages \
-H "Authorization: Bearer $SUBTOAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-3-5-sonnet",
"max_tokens": 500,
"system": "You are an internal HR assistant. Answer only from company policy documents provided.",
"messages": [
{"role": "user", "content": "How many PTO days carry over to next year?"}
]
}'
For internal tools, the system prompt is where most of the real work happens — scoping Claude to company-specific context, tone, and boundaries (e.g., "don't answer questions outside HR policy, escalate to a human instead").
If the tool needs to look up real data instead of guessing, tool use lets Claude call an internal API before answering — see /docs/tools for the request format.
Step 3: Separate keys per internal tool
This is the step most teams skip early and regret later. If your HR bot, your support summarizer, and your sales dashboard all share one API key, you lose the ability to answer basic questions: Which tool is driving the cost increase? Which one should we rate-limit if usage spikes? Which key do we rotate if a tool's codebase gets compromised?
The fix is issuing a distinct application key per internal tool, even if they're all hitting the same underlying Claude access. SubToAPI generates application keys in the sub_live_... format specifically for this — each internal tool gets its own key, its own usage metadata, and its own entry in the dashboard, while everything still runs on your team's shared Claude access. Setup takes about the same time as making a single raw API key: see /docs/quickstart.
// support-summarizer-service.js
const response = await fetch("https://api.subtoapi.app/v1/messages", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.SUPPORT_TOOL_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
model: "claude-3-5-sonnet",
max_tokens: 400,
messages: [{ role: "user", content: ticketText }]
})
});
Each internal tool gets its own environment variable and its own key, so a compromised or misbehaving tool can be revoked individually without touching the others.
Step 4: Add team seats instead of ad-hoc key sharing
As more people build or maintain internal tools, you need a way to add and remove people without rewriting code or sharing a single key over Slack. Plan-based seat access (Solo €9, Team €19/seat, Scale €49/seat on SubToAPI, see /pricing) solves this at the account level — new developers get added as seats, former employees get removed, and nobody needs to touch the underlying API keys.
Step 5: Streaming for interactive tools
If the internal tool is chat-based — a bot employees type into and expect a live response from — streaming avoids the "is this frozen?" problem. Claude responses come back token-by-token instead of all at once.
curl https://api.subtoapi.app/v1/messages \
-H "Authorization: Bearer $SUBTOAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "claude-3-5-sonnet",
"max_tokens": 500,
"stream": true,
"messages": [{"role": "user", "content": "Summarize this ticket thread."}]
}'
Details on handling the stream in your frontend or service are in /docs/streaming.
Step 6: Watch costs per tool, not just total spend
Once you have three or four internal tools live, the question changes from "what's our Claude bill" to "which tool is worth its cost." Separate keys per tool make this answerable — you can see exactly how many requests and tokens each internal tool consumes, which lets you decide whether to optimize a prompt, cap usage, or just confirm it's working as expected.
Getting started
For a single internal tool, start simple: one key, a clear system prompt, and basic logging of requests. As soon as a second team wants their own tool, split keys immediately rather than retrofitting it later. If you want seat-based access and per-tool keys without building that infrastructure yourself, /signup gets you a working setup in a few minutes, and /docs/messages covers the full request reference.
Questions
Do I need a separate Claude API key for every internal tool? Not technically, but it's strongly recommended once you have more than one tool. Separate keys let you track cost and usage per tool and revoke access individually without affecting others.
Can non-developers use an internal tool built on the Claude API? Yes — the API itself is backend infrastructure. Non-developers interact through whatever frontend you build (Slack bot, internal dashboard, web form), not the API directly.
How do I control who can access the underlying Claude account? Use seat-based access management rather than sharing one key across the team. This lets you add or remove individual people without changing any application code.