【OpenAI API】curlコマンドで叩いてみた

OpenAI

OpenAI APIの使い方を確認する意味で、curlコマンドを使って基本的な操作をしてみました。

Just a moment...

OpenAI PlatformのAPI Referenceでは、curlコマンドのサンプルとレスポンスのサンプルが、テキスト送信・画像送信・ファイル送信等のケース別に掲載されているので、非常に親切です。

リファレンスはこうあるべきですね。

curlコマンド以外にも、執筆時点(2025/12/09)では、javascript/python/c#のコード例が掲載されています。

これからやること

  • OpenAI PlatformでのOrganization IDの確認
  • OpenAI PlatformでのAdmin key作成
  • OpenAI Platformでのプロジェクト作成
  • OpenAI PlatformでのAPIキー作成⇒プロジェクトへの割り当て
  • 利用可能モデルの一覧取得
  • Responses API経由でのメッセージ送信/レスポンス取得
  • 使用量(消費トークン)/使用料金の取得

前提条件

  • Ubuntu24.04.3 LTS (WSL2 on Windows11) 上で作業していきます
  • OpenAI Platformのアカウント登録済(筆者はGoogleアカウントで登録済)
  • OpenAI APIの利用は有料(プリペイド制。筆者はとりあえず$5チャージ済。)

※クレジットのチャージは一回で$5~$100で1年間の有効期限があります。オートリチャージの設定も可能です。

▼APIの使用料金

Just a moment...

チャット用APIの種類

OpenAI APIでは、チャット用のAPIが何種類かあります。

執筆時点(2025/12/09)で使用可能なAPIは

▼ChatGPT先生の教え

ChatGPT - API機能の違いと用途
ChatGPT helps you get answers, find inspiration, and be more productive.

今回はチャットではResponsesだけを使います。

Responsesのドキュメント抜粋

OpenAIのモデル応答生成における最先端のインターフェースです。テキストおよび画像入力、テキスト出力をサポートします。モデルに対して、前の応答の出力を入力として状態型の相互作用を作成します。ファイル検索、ウェブ検索、コンピュータ利用などの組み込みツールでモデルの機能を拡張しましょう。モデルが関数呼び出しを使って外部システムやデータにアクセスできるようにします。

OpenAI PlatformでのOrganization ID確認

画面右上「Settings」(歯車アイコン)から設定画面に遷移し、

サイドメニュー「General」を選択します。

「Organization ID」をコピーして別の場所に保存しておきましょう。

後でcurlでAPIを叩く際に使います。

OpenAI PlatformでのAdmin key作成

使用量(消費トークン)や使用料金をOrganizationレベルで取得する際には、Admin keyが必要です。

画面右上「Settings」>サイドメニュー「Admin keys」を選択します。

「+ Create new Admin key」ボタンを押下します。

モーダルが表示されるので、名前を入力し、適切な「Permissions」を選択(今回はAll)します。

「Permissions」で「Restricted」を選択すると細かい設定ができます。

が、今回は「All」を選択して「Create admin key」ボタンを押下します。

Admin keyが作成されたら、コピーして別の場所に保存しておきましょう。

この場を逃すと二度と確認できません。その場合は削除して再作成しましょう。

OpenAI Platformでのプロジェクト作成

APIを使うには、まずプロジェクトが必要です。

アカウント作成時に、自動で「Default Project」が作成され適用されています。

ツールや用途によってプロジェクトを使い分けることで、次のことができるようになります。

  • 複数のAPIキーの使い分け(プロジェクト毎に異なるAPIキー)
  • プロジェクト単位でのログ収集
  • 消費トークンや使用料金のプロジェクト単位での確認

OpenAI Platform にログインした状態で画面左上の「Default Project」のプルダウンから

「+ Create project」を選択します。

※「Manage projects」>「+ Create project」でも同じ

※画面右上の「Settings」>サイドメニュー「Projects」>「+ Create project」でも同じ

プロジェクト名を入力して「Create」ボタンを押下します。

プロジェクト一覧(「Manage projects」または「Settings」>「Projects」で表示)

に作成されたプロジェクトが表示されます。

ここで表示される「ID」(project id)は、後でAPIを叩く際に使います。

APIキー作成

続いて、APIキーを作成して、プロジェクトに割り当てていきます。

サイドメニューの「API Keys」をクリックし、「+ Create new secret key」ボタンを押下します。

モーダルが表示されるので、キー名称を入力し、プロジェクトを選択し、適切なPermissions(今回はAll)を選択します。

「Permissions」で「Restricted」を選択すると、かなり細かい設定ができます。

が、今回は「All」にしておきます。

「Create secret key」ボタンを押下します。

APIキーが作成されるので、コピーして別の場所に保存しておきましょう。

この場を逃すと二度と確認できないので、逃した場合は削除して再作成しておきましょう。

.envの準備

前段で作成・取得した情報を「.env」にでもまとめて記録して使うことにします。

# Organization ID
OPENAI_ORG_ID=org-****

# Admin Key
OPENAI_ADMIN_KEY=sk-admin-****

# Project: test project 01
OPENAI_PROJECT=proj_****

# API Key:Test 01
OPENAI_API_KEY=sk-proj-****

利用可能モデルの一覧取得

毎回curlコマンドを複数行で実行するのも面倒なので、シェルスクリプトにまとめて実行することします。

このリクエストによるAPI使用料金の発生はありません。

▼「list_models.sh」

#!/bin/bash

OPENAI_ORG_ID=`cat .env | grep OPENAI_ORG_ID | cut -d '=' -f2`
OPENAI_API_KEY=`cat .env | grep OPENAI_API_KEY | cut -d '=' -f2`
OPENAI_PROJECT=`cat .env | grep OPENAI_PROJECT | cut -d '=' -f2`

curl -s https://api.openai.com/v1/models \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -H "OpenAI-Organization: $OPENAI_ORG_ID" \
  -H "OpenAI-Project: $OPENAI_PROJECT"

▼実行

bash ./list_models.sh

▼実行結果

{
  "object": "list",
  "data": [
    {
      "id": "gpt-4-0613",
      "object": "model",
      "created": 1686588896,
      "owned_by": "openai"
    },
    {
      "id": "gpt-4",
      "object": "model",
      "created": 1687882411,
      "owned_by": "openai"
    },

・・・(中略)・・・

   {
      "id": "whisper-1",
      "object": "model",
      "created": 1677532384,
      "owned_by": "openai-internal"
    },
    {
      "id": "text-embedding-ada-002",
      "object": "model",
      "created": 1671217299,
      "owned_by": "openai-internal"
    }
  ]
}

Responses API経由でのメッセージ送信/レスポンス取得

このリクエストではトークン数に応じた使用料金が発生します。

これもシェルスクリプトにして実行してみます。

▼「response_api_test01.sh」

#!/bin/bash

OPENAI_API_KEY=`cat .env | grep OPENAI_API_KEY | cut -d '=' -f2`
OPENAI_PROJECT=`cat .env | grep OPENAI_PROJECT | cut -d '=' -f2`

curl https://api.openai.com/v1/responses \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -d '{
    "model": "gpt-5.1",
    "input": [
      {
        "role": "user",
        "content": "OpenAIとChatGPTの未来について、あなたの推測を教えてください。"
      }
    ],
    "reasoning": {
      "effort": "high"
    }
  }'

※せっかくの「gpt-5.1」なので「reasoning.effort」を「high」にしてみました。

※「gpt-5.1-codex」のみ「reasoning.effort」で「xhigh」をサポートしています。

ドキュメントの「reasoning.effort」の項目抜粋

推論モデルの推論にかかる労力を制限します。現在サポートされているのは、noneminimallowmediumhighxhighです。推論の努力を減らすことで、応答の速さや推論に使われるトークンの削減につながります。

🔵gpt-5.1はデフォルトで none となり、推論は行われません。gpt-5.1のサポート推論値は、nonelowmediumhigh です。gpt-5.1ではすべての推論値に対してツール呼び出しがサポートされています。
🔵gpt-5.1以前のすべてのモデルはデフォルトで medium 程度の推論努力を用いており、none はサポートしていません。
🔵gpt-5-proモデルはデフォルトで high レベルの思考(そしてそれのみサポート)を行います。
🔵xhigh は現在gpt-5.1-codex-maxのみでサポートされています。

▼実行

bash ./responses_api_test01.sh

▼実行結果

{
  "id": "resp_02f50a9665c627e5006938278168a08190840cab1aab43859f",
  "object": "response",
  "created_at": 1765287809,
  "status": "completed",
  "background": false,
  "billing": {
    "payer": "developer"
  },
  "error": null,
  "incomplete_details": null,
  "instructions": null,
  "max_output_tokens": null,
  "max_tool_calls": null,
  "model": "gpt-5.1-2025-11-13",
  "output": [
    {
      "id": "rs_02f50a9665c627e500693827827c508190b12a08329bd628ac",
      "type": "reasoning",
      "summary": []
    },
    {
      "id": "msg_02f50a9665c627e50069382785f3688190bee376628ef3f7ed",
      "type": "message",
      "status": "completed",
      "content": [
        {
          "type": "output_text",
          "annotations": [],
          "logprobs": [],
          "text": "\u4ee5\u4e0b\u306f・・・(中略)・・・"
        }
      ],
      "role": "assistant"
    }
  ],
  "parallel_tool_calls": true,
  "previous_response_id": null,
  "prompt_cache_key": null,
  "prompt_cache_retention": null,
  "reasoning": {
    "effort": "high",
    "summary": null
  },
  "safety_identifier": null,
  "service_tier": "default",
  "store": true,
  "temperature": 1.0,
  "text": {
    "format": {
      "type": "text"
    },
    "verbosity": "medium"
  },
  "tool_choice": "auto",
  "tools": [],
  "top_logprobs": 0,
  "top_p": 1.0,
  "truncation": "disabled",
  "usage": {
    "input_tokens": 24,
    "input_tokens_details": {
      "cached_tokens": 0
    },
    "output_tokens": 2205,
    "output_tokens_details": {
      "reasoning_tokens": 136
    },
    "total_tokens": 2229
  },
  "user": null,
  "metadata": {}
}

レスポンスの内容が長いので省略しました。

詳細は、OpenAI Platformの「Logs」>「Responses」で見れます。

このリクエストだけで2,229トークン消費、$0.02に相当。

使用量(消費トークン)の取得

このリクエストでは使用料金は発生しません。

ここで必要なのは「Admin key」のみです。

オプションとして、「Project ID」の指定もできます。

使用量(消費トークン数)は日別データとして返ってきます。

「start_time」の指定が必須で、UNIXタイムスタンプでの指定になります。

「end_time」の指定が無い場合は今日までのデータが返ってきます。

▼「usage_test01.sh」

#!/bin/bash

OPENAI_ADMIN_KEY=`cat .env | grep OPENAI_ADMIN_KEY | cut -d '=' -f2`
OPENAI_PROJECT=`cat .env | grep OPENAI_PROJECT | cut -d '=' -f2`

# 指定日時のUNIXタイムスタンプ
START_TIME=`date -d "2025/12/07 00:00:00" +%s`

# トークン使用量
curl "https://api.openai.com/v1/organization/usage/completions?start_time=${START_TIME}&project_ids=${OPENAI_PROJECT}" \
  -H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
  -H "Content-Type: application/json"

▼実行

bash ./usage_test01.sh

▼実行結果

{
  "object": "page",
  "data": [
    {
      "object": "bucket",
      "end_time": 1765065600,
      "end_time_iso": "2025-12-07T00:00:00+00:00",
      "results": [],
      "start_time": 1764979200,
      "start_time_iso": "2025-12-06T00:00:00+00:00"
    },
    {
      "object": "bucket",
      "end_time": 1765152000,
      "end_time_iso": "2025-12-08T00:00:00+00:00",
      "results": [],
      "start_time": 1765065600,
      "start_time_iso": "2025-12-07T00:00:00+00:00"
    },
    {
      "object": "bucket",
      "end_time": 1765238400,
      "end_time_iso": "2025-12-09T00:00:00+00:00",
      "results": [],
      "start_time": 1765152000,
      "start_time_iso": "2025-12-08T00:00:00+00:00"
    },
    {
      "object": "bucket",
      "end_time": 1765324800,
      "end_time_iso": "2025-12-10T00:00:00+00:00",
      "results": [
        {
          "object": "organization.usage.completions.result",
          "project_id": null,
          "num_model_requests": 1,
          "user_id": null,
          "api_key_id": null,
          "model": null,
          "batch": null,
          "service_tier": null,
          "input_tokens": 24,
          "output_tokens": 2205,
          "input_cached_tokens": 0,
          "input_uncached_tokens": 24,
          "input_text_tokens": 24,
          "output_text_tokens": 2205,
          "input_cached_text_tokens": 0,
          "input_audio_tokens": 0,
          "input_cached_audio_tokens": 0,
          "output_audio_tokens": 0,
          "input_image_tokens": 0,
          "input_cached_image_tokens": 0,
          "output_image_tokens": 0
        }
      ],
      "start_time": 1765238400,
      "start_time_iso": "2025-12-09T00:00:00+00:00"
    }
  ],
  "has_more": false,
  "next_page": null
}

期間の総使用量(消費トークン数)は、日別データの配列について、results配列内の

「input_tokens」と「output_tokens」を合計すればOKですね。

使用料金の取得

このリクエストでは使用料金は発生しません。

ここで必要なのは「Admin key」のみです。

オプションとして、「Project ID」の指定もできます。

使用料金は日別データとして返ってきます。

「start_time」の指定が必須で、UNIXタイムスタンプでの指定になります。

「end_time」の指定が無い場合は今日までのデータが返ってきます。

▼「costs_test01.sh」

#!/bin/bash

OPENAI_ADMIN_KEY=`cat .env | grep OPENAI_ADMIN_KEY | cut -d '=' -f2`
OPENAI_PROJECT=`cat .env | grep OPENAI_PROJECT | cut -d '=' -f2`

# 指定日時のUNIXタイムスタンプ
START_TIME=`date -d "2025/12/07 00:00:00" +%s`

# 使用料金
curl "https://api.openai.com/v1/organization/costs?start_time=${START_TIME}&project_ids=${OPENAI_PROJECT}" \
  -H "Authorization: Bearer $OPENAI_ADMIN_KEY" \
  -H "Content-Type: application/json"

▼実行

bash ./costs_test01.sh

▼実行結果

{
  "object": "page",
  "has_more": false,
  "next_page": null,
  "data": [
    {
      "object": "bucket",
      "start_time": 1764979200,
      "end_time": 1765065600,
      "start_time_iso": "2025-12-06T00:00:00+00:00",
      "end_time_iso": "2025-12-07T00:00:00+00:00",
      "results": []
    },
    {
      "object": "bucket",
      "start_time": 1765065600,
      "end_time": 1765152000,
      "start_time_iso": "2025-12-07T00:00:00+00:00",
      "end_time_iso": "2025-12-08T00:00:00+00:00",
      "results": []
    },
    {
      "object": "bucket",
      "start_time": 1765152000,
      "end_time": 1765238400,
      "start_time_iso": "2025-12-08T00:00:00+00:00",
      "end_time_iso": "2025-12-09T00:00:00+00:00",
      "results": []
    },
    {
      "object": "bucket",
      "start_time": 1765238400,
      "end_time": 1765324800,
      "start_time_iso": "2025-12-09T00:00:00",
      "end_time_iso": "2025-12-10T00:00:00",
      "results": [
        {
          "object": "organization.costs.result",
          "amount": {
            "value": "0.02208000000000000000000000000",
            "currency": "usd"
          },
          "line_item": null,
          "user_id": null,
          "project_id": "proj_bXZ57WOvwUyMmbSpjnDZzFAI",
          "organization_id": "org-kdyapFvRN9QqMDwuO09eML0M",
          "project_name": "Default project",
          "organization_name": "Personal",
          "user_email": null
        }
      ]
    }
  ]
}

期間内の総コストは、日別データについて、「amount.value」を合計すればOKですね。

今回は以上です。次回はシステムプロンプトやファイル入力など、もう少し深堀した使い方をしていきます。

  • 0
  • 0
  • 0
  • 0

コメント

タイトルとURLをコピーしました