Claude (Anthropic) aus PHP aufrufen – die Messages-API mit cURL
Ein KI-Feature in deine PHP-Website einbauen, ohne SDK: Die Anthropic Messages-API ist ein einziger HTTP-Endpunkt. Hier der komplette, sichere Aufruf per cURL – mit Key aus der Umgebung, nicht im Code.
Du willst ein KI-Feature in deine PHP-Seite bauen – eine Zusammenfassung, eine Klassifizierung, einen Chat-Assistenten? Bei Claude von Anthropic geht alles über einen einzigen Endpunkt: POST /v1/messages. Du brauchst kein SDK, curl reicht. Wichtig ist nur, den API-Key serverseitig zu halten (nie im Frontend!) und ihn aus der Umgebung zu lesen.
Der komplette Aufruf
<?php
declare(strict_types=1);
function claude_ask(string $prompt): string
{
$apiKey = getenv('ANTHROPIC_API_KEY'); // Key aus der Umgebung, NICHT im Code
if ($apiKey === false || $apiKey === '') {
throw new RuntimeException('ANTHROPIC_API_KEY fehlt');
}
$payload = [
'model' => 'claude-sonnet-5', // gutes Preis-/Leistungs-Verhältnis
'max_tokens' => 1024, // Obergrenze der Antwortlänge
'messages' => [
['role' => 'user', 'content' => $prompt],
],
];
$ch = curl_init('https://api.anthropic.com/v1/messages');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'x-api-key: ' . $apiKey,
'anthropic-version: 2023-06-01', // Pflicht-Header
'content-type: application/json',
],
CURLOPT_POSTFIELDS => json_encode($payload, JSON_THROW_ON_ERROR),
CURLOPT_TIMEOUT => 60,
]);
$res = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($res === false || $code >= 400) {
throw new RuntimeException("Claude-API-Fehler (HTTP $code): $res");
}
$data = json_decode($res, true, 512, JSON_THROW_ON_ERROR);
// content ist ein Array aus Blöcken – der Text steckt im ersten "text"-Block
foreach ($data['content'] as $block) {
if (($block['type'] ?? '') === 'text') {
return $block['text'];
}
}
return '';
}
echo claude_ask('Fasse in einem Satz zusammen, was ein CMS ist.');Worauf es ankommt
anthropic-version: 2023-06-01ist ein Pflicht-Header – ohne ihn antwortet die API mit 400.max_tokensist erforderlich und begrenzt die Antwortlänge. Für lange Antworten höher setzen (und dann besser streamen).- Die Antwort ist ein Array von Blöcken, nicht ein einzelner String. Greif nie blind auf
content[0]['text']zu – iteriere und prüfe dentype, sonst kracht es, sobald ein anderer Block zuerst kommt. - Modellwahl:
claude-sonnet-5ist ein guter Standard fürs Web (schnell, günstig, stark). Für die anspruchsvollsten Aufgaben gibt es die Opus-Reihe.
Merksatz zur Sicherheit: Der API-Key gehört ausschließlich auf den Server. Ein Key im JavaScript deiner Seite ist sofort öffentlich – über die Netzwerk-Konsole des Browsers auslesbar. Frontend-Aufrufe gehen daher immer über deinen eigenen PHP-Endpunkt, der den Key hält.
Du willst ein KI-Feature sauber in deine Website integrieren? Sprich mich an.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
array_find, array_any und array_all in PHP 8.4 – Arrays durchsuchen ohne Schleife
„Gibt es einen inaktiven Eintrag?", „Sind alle bezahlt?", „Hol mir den ersten Treffer" – dafür hast du bisher eine foreach-Schleife mit break geschrieben. PHP 8.4 macht daraus je eine Zeile, die genau sagt, was sie meint.
First-Class-Callable-Syntax in PHP: aus strlen(...) wird ein echter Wert
Funktionen als Zeichenketten weiterzureichen – 'strlen', [$objekt, 'methode'] – hat nie jemand gemocht: kein Tippfehlerschutz, keine Sprungmarke in der IDE. Seit PHP 8.1 schreibst du drei Punkte und bekommst ein Closure-Objekt.
@layer in CSS: Kaskadenebenen statt !important-Wettrüsten
Irgendwann steht in jedem gewachsenen Stylesheet das erste !important – und ein halbes Jahr später das dreißigste. Mit @layer legst du die Reihenfolge einmal fest, und ab da gewinnt nicht mehr der längste Selektor, sondern die Ebene, die du bestimmt hast.