Skip to main content

Claude API Configuration

Setup and configuration of the Claude API integration.

API Overview​

We use the Claude Messages API to process user questions.

Endpoint: https://api.anthropic.com/v1/messages

Authentication​

API Key​

The API key is stored as an environment variable in Node-RED.

Format: sk-ant-api03-xxxxx...

Headers Required​

x-api-key: <your-api-key>
anthropic-version: 2023-06-01
content-type: application/json

Request Format​

Basic Request​

{
"model": "claude-sonnet-4-20250514",
"max_tokens": 150,
"messages": [
{
"role": "user",
"content": "Your question here"
}
]
}

With System Prompt​

{
"model": "claude-sonnet-4-20250514",
"max_tokens": 150,
"system": "You are a helpful assistant for a rural community. Give brief, clear answers. Maximum 2-3 sentences.",
"messages": [
{
"role": "user",
"content": "What is LoRa?"
}
]
}

Response Format​

Successful Response​

{
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "LoRa (Long Range) is a wireless technology that enables long-distance communication with low power consumption, ideal for IoT devices."
}
],
"model": "claude-sonnet-4-20250514",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 10,
"output_tokens": 35
}
}

Configuration Parameters​

Model Selection​

ModelSpeedQualityCost
claude-sonnet-4-20250514FastGoodLow
claude-opus-4-20250514SlowBestHigh

We use claude-sonnet-4-20250514 for speed and cost efficiency.

Token Limits​

  • max_tokens: 150 (keeps responses short for LoRa)
  • LoRa message limit: ~230 bytes
  • We truncate responses over 200 characters

System Prompt​

You are a helpful assistant for a rural community.
Give brief, clear answers. Maximum 2-3 sentences.
Respond in the same language as the question.

Error Handling​

Common Errors​

401 Unauthorized​

{
"error": {
"type": "authentication_error",
"message": "invalid x-api-key"
}
}

Solution: Verify API key is correct.

429 Rate Limited​

{
"error": {
"type": "rate_limit_error",
"message": "Rate limit exceeded"
}
}

Solution: Wait and implement rate limiting.

500 Server Error​

{
"error": {
"type": "api_error",
"message": "Internal server error"
}
}

Solution: Retry after a few seconds.

Rate Limiting​

To avoid hitting rate limits, implement delays between requests:

// In Node-RED function node
var lastCall = flow.get("lastClaudeCall") || 0;
var now = Date.now();

if (now - lastCall < 5000) { // 5 second minimum
return null; // Skip this request
}

flow.set("lastClaudeCall", now);
return msg;

Testing the API​

Using curl​

curl -X POST https://api.anthropic.com/v1/messages \
-H "x-api-key: YOUR_API_KEY" \
-H "anthropic-version: 2023-06-01" \
-H "content-type: application/json" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 100,
"messages": [
{"role": "user", "content": "Say hello"}
]
}'

Using Node-RED​

  1. Add Inject node
  2. Add Function node with test payload
  3. Add HTTP Request node
  4. Add Debug node
  5. Deploy and click inject

Costs​

API calls are billed based on tokens:

  • Input tokens: Question length
  • Output tokens: Response length

With our configuration (~150 tokens max), costs are minimal per query.

Security Notes​

  • Never expose API key in client-side code
  • Store key in environment variables
  • Rotate keys periodically
  • Monitor usage for anomalies