Anthropic Messages API (/v1/messages) Integration Guide

Overview

To support Anthropic-format models, apiset.ai provides a compatible endpoint:

  • Endpoint: POST /v1/messages
  • Base URL: https://apiset.ai/api
  • HK Base URL: https://hk.apiset.ai/api
  • Authentication: Authorization: Bearer {api_set_key}
  • Protocol style: Anthropic Messages API compatible

This endpoint is intended for applications already built with Anthropic SDK conventions or messages payloads, enabling migration to apiset.ai with minimal changes.

Supported Models

Use one of the following values in the request model field:

  • claude-4.5
  • claude-haiku-4-5-20251001
  • claude-sonnet-4-6
  • claude-opus-4-6

Please treat the console model list as the source of truth. New models will be reflected in both the console and docs.

Request Example (Non-streaming)

curl https://apiset.ai/api/v1/messages \
  -H &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Authorization: Bearer sk-xxxx&amp;quot;&lt;/span&gt; \
  -H &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Content-Type: application/json&amp;quot;&lt;/span&gt; \
  -d &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;#x27;{
    &amp;quot;model&amp;quot;: &amp;quot;claude-sonnet-4-6&amp;quot;,
    &amp;quot;max_tokens&amp;quot;: 512,
    &amp;quot;messages&amp;quot;: [
      {
        &amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;,
        &amp;quot;content&amp;quot;: &amp;quot;Introduce the value of apiset.ai <span class="hljs-keyword">in</span> three sentences.&amp;quot;
      }
    ]
  }&amp;#x27;&lt;/span&gt;

Response Example (Non-streaming)

&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">{</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;id&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;msg_01ABCDEFGH1234567890&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;message&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;assistant&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;model&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;claude-sonnet<span class="hljs-number">-4</span><span class="hljs-number">-6</span>&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;content&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">[</span>&lt;/span&gt;
    &lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">{</span>&lt;/span&gt;
      &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;type&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
      &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;text&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;apiset.ai provides a unified API so you can integrate multiple model providers through one interface. It supports mainstream protocol compatibility with observability and billing capabilities<span class="hljs-punctuation">,</span> reducing migration and operations overhead. This helps teams ship AI features faster while preserving model flexibility.&amp;quot;&lt;/span&gt;
    &lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">}</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">]</span>&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;stop_reason&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;end_turn&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;usage&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">{</span>&lt;/span&gt;
    &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;input_tokens&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;<span class="hljs-number">27</span>&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">,</span>&lt;/span&gt;
    &lt;span class=<span class="hljs-string">&quot;hljs-attr&quot;</span>&gt;&amp;quot;output_tokens&amp;quot;&lt;/span&gt;&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">:</span>&lt;/span&gt; &lt;span class=<span class="hljs-string">&quot;hljs-number&quot;</span>&gt;<span class="hljs-number">66</span>&lt;/span&gt;
  &lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">}</span>&lt;/span&gt;
&lt;span class=<span class="hljs-string">&quot;hljs-punctuation&quot;</span>&gt;<span class="hljs-punctuation">}</span>&lt;/span&gt;

Request Example (Streaming)

curl https://apiset.ai/api/v1/messages \
  -H &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Authorization: Bearer sk-xxxx&amp;quot;&lt;/span&gt; \
  -H &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;quot;Content-Type: application/json&amp;quot;&lt;/span&gt; \
  -N \
  -d &lt;span class=<span class="hljs-string">&quot;hljs-string&quot;</span>&gt;&amp;#x27;{
    &amp;quot;model&amp;quot;: &amp;quot;claude-haiku-4-5-20251001&amp;quot;,
    &amp;quot;max_tokens&amp;quot;: 512,
    &amp;quot;stream&amp;quot;: <span class="hljs-literal">true</span>,
    &amp;quot;messages&amp;quot;: [
      {
        &amp;quot;role&amp;quot;: &amp;quot;user&amp;quot;,
        &amp;quot;content&amp;quot;: &amp;quot;Summarize the purpose of the Anthropic Messages API <span class="hljs-keyword">in</span> bullet points.&amp;quot;
      }
    ]
  }&amp;#x27;&lt;/span&gt;

Typical event stream (excerpt):

event: message_start
data: {&amp;quot;type&amp;quot;:&amp;quot;message_start&amp;quot;,&amp;quot;message&amp;quot;:{&amp;quot;id&amp;quot;:&amp;quot;msg_...&amp;quot;,&amp;quot;model&amp;quot;:&amp;quot;claude-haiku-4-5-20251001&amp;quot;}}

event: content_block_delta
data: {&amp;quot;type&amp;quot;:&amp;quot;content_block_delta&amp;quot;,&amp;quot;index&amp;quot;:0,&amp;quot;delta&amp;quot;:{&amp;quot;type&amp;quot;:&amp;quot;text_delta&amp;quot;,&amp;quot;text&amp;quot;:&amp;quot;- Compatible with Anthropic request format&amp;quot;}}

event: message_delta
data: {&amp;quot;type&amp;quot;:&amp;quot;message_delta&amp;quot;,&amp;quot;delta&amp;quot;:{&amp;quot;stop_reason&amp;quot;:&amp;quot;end_turn&amp;quot;},&amp;quot;usage&amp;quot;:{&amp;quot;output_tokens&amp;quot;:56}}

Relationship with OpenAI-Compatible Endpoint

  • OpenAI-compatible endpoint: POST /v1/chat/completions
  • Anthropic-compatible endpoint: POST /v1/messages

If your application already uses Anthropic SDKs (or a messages-based structure), using /v1/messages directly is recommended to reduce field mapping and adapter code.

Common Errors and Troubleshooting

  • 401 Unauthorized
    • Check whether Authorization is in Bearer sk-... format.
  • model_not_found
    • Check whether model is in the supported list.
  • 400 Bad Request
    • Check whether fields such as messages, max_tokens, and stream match Anthropic protocol expectations.

Best Practices

  • Store API keys on the server side; never hardcode them in frontend code.
  • For streaming scenarios, set proper timeout and retry logic.
  • In production, log request IDs (such as response id) for easier troubleshooting.