Codex v1.0.47 Enter your Codex API username to load and test protected API calls.

API Documentation

This service exposes a versioned HTTP adapter over the local Codex app-server. The stable surface for browser-based coding agents is under /api/v1. Search is enabled by default, managed projects resume the latest Codex thread for the same workspace, and approval-aware coding flows remain explicit rather than hidden.

Version: v1.0.47. Customer API authentication now treats the Codex API username as the bearer value. For example, a user named g2g-codex-example can call protected client endpoints with Authorization: Bearer g2g-codex-example. User API Keys created from the dashboard also work for integrations. This public documentation intentionally lists customer endpoints only.

Auth Model

Official-Compatible Model APIs

CodexAPI.pro exposes additive compatibility endpoints for coding clients that expect the official OpenAI and Anthropic-style HTTP surfaces. These endpoints use the same wallet, internal rate cards, model-selection policy, and live routing source of truth as the existing CLI endpoints.

API Test Zone

These examples automatically use the bearer value in the field above. When a client opens this page from the dashboard, that value is their Codex API username. Replace the prompt text and project names as needed.

1. Verify your wallet account

          
2. Verify stock Codex model discovery

          
3. Start a browser-agent project

          

Official OpenAI Codex CLI

Use the customer's Codex API username with the official OpenAI package installed by npm install -g @openai/codex@0.142.2. The API compatibility target is Codex CLI 0.142.2. Do not run codex login for CodexAPI.pro; configure CodexAPI.pro as a custom Responses provider and save the username in ~/.codex/config.toml using the dashboard's one-time setup command.

After the one-time setup has written CodexAPI.pro into the normal Codex config, users can return with codex, codex --search, codex resume --search, or any other normal Codex opening command without repeating API setup.

For non-interactive live-search runs, use codex --search exec .... The current official CLI rejects codex exec --search ....

The dashboard returns a token-specific command after creation; the generic provider shape is:

{
  "providerId": "codexapi",
  "providerName": "CodexAPI.pro",
  "officialCliVersion": "0.142.2",
  "officialInstallTag": "0.142.2",
  "officialInstallCommand": "npm install -g @openai/codex@0.142.2",
  "baseUrl": "https://api-chicago.codexapi.pro/v1",
  "envKey": "CODEXAPI_CODEX_API_KEY",
  "wireApi": "responses",
  "model": "gpt-5.5",
  "reasoningEffort": "high",
  "modelsUrl": "https://api-chicago.codexapi.pro/v1/models",
  "responsesUrl": "https://api-chicago.codexapi.pro/v1/responses",
  "codexHome": "$HOME/.codex",
  "configArgs": [
    "-c 'model_provider=\"codexapi\"'",
    "-c 'model_providers.codexapi.name=\"CodexAPI.pro\"'",
    "-c 'model_providers.codexapi.base_url=\"https://api-chicago.codexapi.pro/v1\"'",
    "-c 'model_providers.codexapi.env_key=\"CODEXAPI_CODEX_API_KEY\"'",
    "-c 'model_providers.codexapi.wire_api=\"responses\"'",
    "-c 'model_providers.codexapi.supports_websockets=false'",
    "-c 'model_reasoning_effort=\"high\"'",
    "-c 'features.apps=false'",
    "-c 'approval_policy=\"never\"'",
    "-c 'sandbox_mode=\"danger-full-access\"'"
  ],
  "persistentConfigToml": "model = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\n",
  "linuxSetupAndStartCommand": "set -e\nif ! command -v npm >/dev/null 2>&1; then\n  if command -v apt-get >/dev/null 2>&1; then\n    sudo apt-get update\n    sudo apt-get install -y ca-certificates curl gnupg\n    curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -\n    sudo apt-get install -y nodejs git\n  else\n    echo \"Install Node.js LTS and npm first, then rerun this block.\" >&2\n    exit 1\n  fi\nfi\nnpm install -g @openai/codex@0.142.2\nCODEX_HOME_DIR=\"$HOME/.codex\"\nCONFIG_PATH=\"$CODEX_HOME_DIR/config.toml\"\nmkdir -p \"$CODEX_HOME_DIR\" 2>/dev/null || true\nif [ -e \"$CODEX_HOME_DIR\" ] && [ ! -w \"$CODEX_HOME_DIR\" ]; then\n  echo \"Fixing ownership of $CODEX_HOME_DIR for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown -R \"$(id -u):$(id -g)\" \"$CODEX_HOME_DIR\"; fi\nfi\nif [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; then\n  echo \"Fixing ownership of $CONFIG_PATH for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown \"$(id -u):$(id -g)\" \"$CONFIG_PATH\"; fi\nfi\nmkdir -p \"$CODEX_HOME_DIR\"\nif [ ! -w \"$CODEX_HOME_DIR\" ] || { [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; }; then\n  echo \"Cannot write Codex config at $CONFIG_PATH. Run: sudo chown -R \\\"$(id -u):$(id -g)\\\" \\\"$CODEX_HOME_DIR\\\"\" >&2\n  exit 1\nfi\nrm -rf \"$CODEX_HOME_DIR/cache/codex_apps_tools\" 2>/dev/null || true\nCODEXAPI_BACKUP_TS=\"$(date +%Y%m%d%H%M%S)\"\nCODEXAPI_CONFIG_SNIPPET=\"$(mktemp)\"\ncat > \"$CODEXAPI_CONFIG_SNIPPET\" <<'TOML'\nmodel = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\nTOML\npython3 - \"$CONFIG_PATH\" \"$CODEXAPI_CONFIG_SNIPPET\" <<'PY'\nimport os, re, shutil, sys\nfrom pathlib import Path\n\npath = Path(sys.argv[1]).expanduser()\nsnippet = Path(sys.argv[2]).read_text()\npath.parent.mkdir(parents=True, exist_ok=True)\nif path.exists():\n    shutil.copy2(path, f\"{path}.backup.{os.environ.get('CODEXAPI_BACKUP_TS', 'manual')}\")\noriginal = path.read_text() if path.exists() else \"\"\ntop_keys = {\"model\", \"model_provider\", \"model_reasoning_effort\", \"approval_policy\", \"sandbox_mode\"}\nsection_re = re.compile(r\"^\\s*\\[[^\\]]+\\]\\s*$\")\nkey_re = re.compile(r\"^\\s*([A-Za-z0-9_-]+)\\s*=\")\nsnippet_lines = snippet.strip().splitlines()\nfirst_section = next((i for i, line in enumerate(snippet_lines) if section_re.match(line.strip())), len(snippet_lines))\ntop = snippet_lines[:first_section]\nprovider = []\nfeature_apps = 'apps = false'\ni = first_section\nwhile i < len(snippet_lines):\n    line = snippet_lines[i]\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", line.strip()):\n        provider = snippet_lines[i:]\n        break\n    i += 1\nclean = []\nskip_codexapi = False\nin_section = False\nin_features = False\nfeatures_seen = False\nfor line in original.splitlines():\n    stripped = line.strip()\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", stripped):\n        skip_codexapi = True\n        in_features = False\n        continue\n    if skip_codexapi and section_re.match(stripped):\n        skip_codexapi = False\n    if skip_codexapi:\n        continue\n    if section_re.match(stripped):\n        in_section = True\n        in_features = stripped == '[features]'\n        features_seen = features_seen or in_features\n    if not in_section:\n        m = key_re.match(line)\n        if m and m.group(1) in top_keys:\n            continue\n    if in_features:\n        m = key_re.match(line)\n        if m and m.group(1) == 'apps':\n            continue\n    clean.append(line)\nparts = []\nparts.extend(top)\nparts.append('')\ninserted_feature = False\nfor line in clean:\n    parts.append(line)\n    if line.strip() == '[features]':\n        parts.append(feature_apps)\n        inserted_feature = True\nif not features_seen:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(['[features]', feature_apps])\nif provider:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(provider)\npath.write_text('\\n'.join(line for line in parts if line is not None).rstrip() + '\\n')\nPY\nrm -f \"$CODEXAPI_CONFIG_SNIPPET\"\necho \"CodexAPI.pro is configured. Future sessions can start with codex or codex resume --search.\"\ncodex --search",
  "macosSetupAndStartCommand": "set -e\nBREW_BIN=\"$(command -v brew 2>/dev/null || true)\"\nif [ -z \"$BREW_BIN\" ] && [ -x /opt/homebrew/bin/brew ]; then BREW_BIN=\"/opt/homebrew/bin/brew\"; fi\nif [ -z \"$BREW_BIN\" ] && [ -x /usr/local/bin/brew ]; then BREW_BIN=\"/usr/local/bin/brew\"; fi\nif [ -z \"$BREW_BIN\" ]; then\n  /bin/bash -c \"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)\"\n  if [ -x /opt/homebrew/bin/brew ]; then BREW_BIN=\"/opt/homebrew/bin/brew\"; fi\n  if [ -z \"$BREW_BIN\" ] && [ -x /usr/local/bin/brew ]; then BREW_BIN=\"/usr/local/bin/brew\"; fi\nfi\nif [ -z \"$BREW_BIN\" ]; then echo \"Homebrew installation finished but brew was not found. Open a new Terminal and rerun this setup.\" >&2; exit 1; fi\neval \"$(\"$BREW_BIN\" shellenv)\"\nbrew list node >/dev/null 2>&1 || brew install node\nbrew list git >/dev/null 2>&1 || brew install git\nhash -r 2>/dev/null || true\nif ! npm install -g @openai/codex@0.142.2; then\n  echo \"Global npm install failed. Retrying with a user-owned npm prefix at $HOME/.npm-global.\"\n  mkdir -p \"$HOME/.npm-global\"\n  npm config set prefix \"$HOME/.npm-global\"\n  export PATH=\"$HOME/.npm-global/bin:$PATH\"\n  npm install -g @openai/codex@0.142.2\nfi\nexport PATH=\"$(npm config get prefix)/bin:$PATH\"\nhash -r 2>/dev/null || true\nappend_codexapi_path() {\n  profile=\"$1\"\n  mkdir -p \"$(dirname \"$profile\")\"\n  touch \"$profile\"\n  if ! grep -q \"# BEGIN CODEXAPI_PRO_NPM_PATH\" \"$profile\" 2>/dev/null; then\n    cat >> \"$profile\" <<'ENV'\n# BEGIN CODEXAPI_PRO_NPM_PATH\nexport PATH=\"$HOME/.npm-global/bin:/opt/homebrew/bin:/usr/local/bin:$PATH\"\n# END CODEXAPI_PRO_NPM_PATH\nENV\n  fi\n}\nappend_codexapi_path \"$HOME/.zshrc\"\nappend_codexapi_path \"$HOME/.zprofile\"\nappend_codexapi_path \"$HOME/.bashrc\"\nappend_codexapi_path \"$HOME/.profile\"\ncodex --version\nCODEX_HOME_DIR=\"$HOME/.codex\"\nCONFIG_PATH=\"$CODEX_HOME_DIR/config.toml\"\nmkdir -p \"$CODEX_HOME_DIR\" 2>/dev/null || true\nif [ -e \"$CODEX_HOME_DIR\" ] && [ ! -w \"$CODEX_HOME_DIR\" ]; then\n  echo \"Fixing ownership of $CODEX_HOME_DIR for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown -R \"$(id -u):$(id -g)\" \"$CODEX_HOME_DIR\"; fi\nfi\nif [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; then\n  echo \"Fixing ownership of $CONFIG_PATH for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown \"$(id -u):$(id -g)\" \"$CONFIG_PATH\"; fi\nfi\nmkdir -p \"$CODEX_HOME_DIR\"\nif [ ! -w \"$CODEX_HOME_DIR\" ] || { [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; }; then\n  echo \"Cannot write Codex config at $CONFIG_PATH. Run: sudo chown -R \\\"$(id -u):$(id -g)\\\" \\\"$CODEX_HOME_DIR\\\"\" >&2\n  exit 1\nfi\nrm -rf \"$CODEX_HOME_DIR/cache/codex_apps_tools\" 2>/dev/null || true\nCODEXAPI_BACKUP_TS=\"$(date +%Y%m%d%H%M%S)\"\nCODEXAPI_CONFIG_SNIPPET=\"$(mktemp)\"\ncat > \"$CODEXAPI_CONFIG_SNIPPET\" <<'TOML'\nmodel = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\nTOML\npython3 - \"$CONFIG_PATH\" \"$CODEXAPI_CONFIG_SNIPPET\" <<'PY'\nimport os, re, shutil, sys\nfrom pathlib import Path\n\npath = Path(sys.argv[1]).expanduser()\nsnippet = Path(sys.argv[2]).read_text()\npath.parent.mkdir(parents=True, exist_ok=True)\nif path.exists():\n    shutil.copy2(path, f\"{path}.backup.{os.environ.get('CODEXAPI_BACKUP_TS', 'manual')}\")\noriginal = path.read_text() if path.exists() else \"\"\ntop_keys = {\"model\", \"model_provider\", \"model_reasoning_effort\", \"approval_policy\", \"sandbox_mode\"}\nsection_re = re.compile(r\"^\\s*\\[[^\\]]+\\]\\s*$\")\nkey_re = re.compile(r\"^\\s*([A-Za-z0-9_-]+)\\s*=\")\nsnippet_lines = snippet.strip().splitlines()\nfirst_section = next((i for i, line in enumerate(snippet_lines) if section_re.match(line.strip())), len(snippet_lines))\ntop = snippet_lines[:first_section]\nprovider = []\nfeature_apps = 'apps = false'\ni = first_section\nwhile i < len(snippet_lines):\n    line = snippet_lines[i]\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", line.strip()):\n        provider = snippet_lines[i:]\n        break\n    i += 1\nclean = []\nskip_codexapi = False\nin_section = False\nin_features = False\nfeatures_seen = False\nfor line in original.splitlines():\n    stripped = line.strip()\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", stripped):\n        skip_codexapi = True\n        in_features = False\n        continue\n    if skip_codexapi and section_re.match(stripped):\n        skip_codexapi = False\n    if skip_codexapi:\n        continue\n    if section_re.match(stripped):\n        in_section = True\n        in_features = stripped == '[features]'\n        features_seen = features_seen or in_features\n    if not in_section:\n        m = key_re.match(line)\n        if m and m.group(1) in top_keys:\n            continue\n    if in_features:\n        m = key_re.match(line)\n        if m and m.group(1) == 'apps':\n            continue\n    clean.append(line)\nparts = []\nparts.extend(top)\nparts.append('')\ninserted_feature = False\nfor line in clean:\n    parts.append(line)\n    if line.strip() == '[features]':\n        parts.append(feature_apps)\n        inserted_feature = True\nif not features_seen:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(['[features]', feature_apps])\nif provider:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(provider)\npath.write_text('\\n'.join(line for line in parts if line is not None).rstrip() + '\\n')\nPY\nrm -f \"$CODEXAPI_CONFIG_SNIPPET\"\necho \"CodexAPI.pro is configured. Future macOS sessions can start with codex --search or codex resume --search.\"\ncodex --search",
  "futureStartCommand": "codex\ncodex --search",
  "startCommand": "set -e\nif ! command -v npm >/dev/null 2>&1; then\n  if command -v apt-get >/dev/null 2>&1; then\n    sudo apt-get update\n    sudo apt-get install -y ca-certificates curl gnupg\n    curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -\n    sudo apt-get install -y nodejs git\n  else\n    echo \"Install Node.js LTS and npm first, then rerun this block.\" >&2\n    exit 1\n  fi\nfi\nnpm install -g @openai/codex@0.142.2\nCODEX_HOME_DIR=\"$HOME/.codex\"\nCONFIG_PATH=\"$CODEX_HOME_DIR/config.toml\"\nmkdir -p \"$CODEX_HOME_DIR\" 2>/dev/null || true\nif [ -e \"$CODEX_HOME_DIR\" ] && [ ! -w \"$CODEX_HOME_DIR\" ]; then\n  echo \"Fixing ownership of $CODEX_HOME_DIR for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown -R \"$(id -u):$(id -g)\" \"$CODEX_HOME_DIR\"; fi\nfi\nif [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; then\n  echo \"Fixing ownership of $CONFIG_PATH for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown \"$(id -u):$(id -g)\" \"$CONFIG_PATH\"; fi\nfi\nmkdir -p \"$CODEX_HOME_DIR\"\nif [ ! -w \"$CODEX_HOME_DIR\" ] || { [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; }; then\n  echo \"Cannot write Codex config at $CONFIG_PATH. Run: sudo chown -R \\\"$(id -u):$(id -g)\\\" \\\"$CODEX_HOME_DIR\\\"\" >&2\n  exit 1\nfi\nrm -rf \"$CODEX_HOME_DIR/cache/codex_apps_tools\" 2>/dev/null || true\nCODEXAPI_BACKUP_TS=\"$(date +%Y%m%d%H%M%S)\"\nCODEXAPI_CONFIG_SNIPPET=\"$(mktemp)\"\ncat > \"$CODEXAPI_CONFIG_SNIPPET\" <<'TOML'\nmodel = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\nTOML\npython3 - \"$CONFIG_PATH\" \"$CODEXAPI_CONFIG_SNIPPET\" <<'PY'\nimport os, re, shutil, sys\nfrom pathlib import Path\n\npath = Path(sys.argv[1]).expanduser()\nsnippet = Path(sys.argv[2]).read_text()\npath.parent.mkdir(parents=True, exist_ok=True)\nif path.exists():\n    shutil.copy2(path, f\"{path}.backup.{os.environ.get('CODEXAPI_BACKUP_TS', 'manual')}\")\noriginal = path.read_text() if path.exists() else \"\"\ntop_keys = {\"model\", \"model_provider\", \"model_reasoning_effort\", \"approval_policy\", \"sandbox_mode\"}\nsection_re = re.compile(r\"^\\s*\\[[^\\]]+\\]\\s*$\")\nkey_re = re.compile(r\"^\\s*([A-Za-z0-9_-]+)\\s*=\")\nsnippet_lines = snippet.strip().splitlines()\nfirst_section = next((i for i, line in enumerate(snippet_lines) if section_re.match(line.strip())), len(snippet_lines))\ntop = snippet_lines[:first_section]\nprovider = []\nfeature_apps = 'apps = false'\ni = first_section\nwhile i < len(snippet_lines):\n    line = snippet_lines[i]\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", line.strip()):\n        provider = snippet_lines[i:]\n        break\n    i += 1\nclean = []\nskip_codexapi = False\nin_section = False\nin_features = False\nfeatures_seen = False\nfor line in original.splitlines():\n    stripped = line.strip()\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", stripped):\n        skip_codexapi = True\n        in_features = False\n        continue\n    if skip_codexapi and section_re.match(stripped):\n        skip_codexapi = False\n    if skip_codexapi:\n        continue\n    if section_re.match(stripped):\n        in_section = True\n        in_features = stripped == '[features]'\n        features_seen = features_seen or in_features\n    if not in_section:\n        m = key_re.match(line)\n        if m and m.group(1) in top_keys:\n            continue\n    if in_features:\n        m = key_re.match(line)\n        if m and m.group(1) == 'apps':\n            continue\n    clean.append(line)\nparts = []\nparts.extend(top)\nparts.append('')\ninserted_feature = False\nfor line in clean:\n    parts.append(line)\n    if line.strip() == '[features]':\n        parts.append(feature_apps)\n        inserted_feature = True\nif not features_seen:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(['[features]', feature_apps])\nif provider:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(provider)\npath.write_text('\\n'.join(line for line in parts if line is not None).rstrip() + '\\n')\nPY\nrm -f \"$CODEXAPI_CONFIG_SNIPPET\"\necho \"CodexAPI.pro is configured. Future sessions can start with codex or codex resume --search.\"\ncodex --search",
  "execSmokeTestCommand": "codex --search exec --skip-git-repo-check \"Say hello from CodexAPI.pro.\"",
  "loggedInOverrideCommand": "set -e\nif ! command -v npm >/dev/null 2>&1; then\n  if command -v apt-get >/dev/null 2>&1; then\n    sudo apt-get update\n    sudo apt-get install -y ca-certificates curl gnupg\n    curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -\n    sudo apt-get install -y nodejs git\n  else\n    echo \"Install Node.js LTS and npm first, then rerun this block.\" >&2\n    exit 1\n  fi\nfi\nnpm install -g @openai/codex@0.142.2\nCODEX_HOME_DIR=\"$HOME/.codex\"\nCONFIG_PATH=\"$CODEX_HOME_DIR/config.toml\"\nmkdir -p \"$CODEX_HOME_DIR\" 2>/dev/null || true\nif [ -e \"$CODEX_HOME_DIR\" ] && [ ! -w \"$CODEX_HOME_DIR\" ]; then\n  echo \"Fixing ownership of $CODEX_HOME_DIR for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown -R \"$(id -u):$(id -g)\" \"$CODEX_HOME_DIR\"; fi\nfi\nif [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; then\n  echo \"Fixing ownership of $CONFIG_PATH for this user...\"\n  if command -v sudo >/dev/null 2>&1; then sudo chown \"$(id -u):$(id -g)\" \"$CONFIG_PATH\"; fi\nfi\nmkdir -p \"$CODEX_HOME_DIR\"\nif [ ! -w \"$CODEX_HOME_DIR\" ] || { [ -e \"$CONFIG_PATH\" ] && [ ! -w \"$CONFIG_PATH\" ]; }; then\n  echo \"Cannot write Codex config at $CONFIG_PATH. Run: sudo chown -R \\\"$(id -u):$(id -g)\\\" \\\"$CODEX_HOME_DIR\\\"\" >&2\n  exit 1\nfi\nrm -rf \"$CODEX_HOME_DIR/cache/codex_apps_tools\" 2>/dev/null || true\nCODEXAPI_BACKUP_TS=\"$(date +%Y%m%d%H%M%S)\"\nCODEXAPI_CONFIG_SNIPPET=\"$(mktemp)\"\ncat > \"$CODEXAPI_CONFIG_SNIPPET\" <<'TOML'\nmodel = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\nTOML\npython3 - \"$CONFIG_PATH\" \"$CODEXAPI_CONFIG_SNIPPET\" <<'PY'\nimport os, re, shutil, sys\nfrom pathlib import Path\n\npath = Path(sys.argv[1]).expanduser()\nsnippet = Path(sys.argv[2]).read_text()\npath.parent.mkdir(parents=True, exist_ok=True)\nif path.exists():\n    shutil.copy2(path, f\"{path}.backup.{os.environ.get('CODEXAPI_BACKUP_TS', 'manual')}\")\noriginal = path.read_text() if path.exists() else \"\"\ntop_keys = {\"model\", \"model_provider\", \"model_reasoning_effort\", \"approval_policy\", \"sandbox_mode\"}\nsection_re = re.compile(r\"^\\s*\\[[^\\]]+\\]\\s*$\")\nkey_re = re.compile(r\"^\\s*([A-Za-z0-9_-]+)\\s*=\")\nsnippet_lines = snippet.strip().splitlines()\nfirst_section = next((i for i, line in enumerate(snippet_lines) if section_re.match(line.strip())), len(snippet_lines))\ntop = snippet_lines[:first_section]\nprovider = []\nfeature_apps = 'apps = false'\ni = first_section\nwhile i < len(snippet_lines):\n    line = snippet_lines[i]\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", line.strip()):\n        provider = snippet_lines[i:]\n        break\n    i += 1\nclean = []\nskip_codexapi = False\nin_section = False\nin_features = False\nfeatures_seen = False\nfor line in original.splitlines():\n    stripped = line.strip()\n    if re.match(r\"^\\[model_providers\\.codexapi\\]\\s*$\", stripped):\n        skip_codexapi = True\n        in_features = False\n        continue\n    if skip_codexapi and section_re.match(stripped):\n        skip_codexapi = False\n    if skip_codexapi:\n        continue\n    if section_re.match(stripped):\n        in_section = True\n        in_features = stripped == '[features]'\n        features_seen = features_seen or in_features\n    if not in_section:\n        m = key_re.match(line)\n        if m and m.group(1) in top_keys:\n            continue\n    if in_features:\n        m = key_re.match(line)\n        if m and m.group(1) == 'apps':\n            continue\n    clean.append(line)\nparts = []\nparts.extend(top)\nparts.append('')\ninserted_feature = False\nfor line in clean:\n    parts.append(line)\n    if line.strip() == '[features]':\n        parts.append(feature_apps)\n        inserted_feature = True\nif not features_seen:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(['[features]', feature_apps])\nif provider:\n    if parts and parts[-1] != '':\n        parts.append('')\n    parts.extend(provider)\npath.write_text('\\n'.join(line for line in parts if line is not None).rstrip() + '\\n')\nPY\nrm -f \"$CODEXAPI_CONFIG_SNIPPET\"\necho \"CodexAPI.pro is configured. Future sessions can start with codex or codex resume --search.\"\ncodex --search",
  "loggedInOverrideExecSmokeTestCommand": "codex --search exec --skip-git-repo-check \"Say hello from CodexAPI.pro.\"",
  "resumeLastCommand": "codex resume --search\ncodex resume --last --search",
  "windowsDependencyInstallCommand": "# Run PowerShell as Administrator for this dependency step.\nwinget source update\nwinget install --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements\nwinget install --id Git.Git -e --accept-package-agreements --accept-source-agreements\nSet-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force\n# Close PowerShell, open a new PowerShell window, then run the verification step.",
  "windowsVerifyDependenciesCommand": "node --version\nnpm --version\ngit --version",
  "windowsCodexInstallCommand": "npm install -g @openai/codex@0.142.2\ncodex --version",
  "windowsFullInstallCommand": "# Run PowerShell as Administrator for this dependency step.\nwinget source update\nwinget install --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements\nwinget install --id Git.Git -e --accept-package-agreements --accept-source-agreements\nSet-ExecutionPolicy -Scope CurrentUser RemoteSigned -Force\n# Close PowerShell, open a new PowerShell window, then run the verification step.\n\n# After reopening PowerShell:\nnode --version\nnpm --version\ngit --version\nnpm install -g @openai/codex@0.142.2\ncodex --version",
  "windowsSetupAndStartCommand": "$ErrorActionPreference = \"Stop\"\nwinget source update\nif (-not (Get-Command node -ErrorAction SilentlyContinue)) { winget install --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements }\nif (-not (Get-Command git -ErrorAction SilentlyContinue)) { winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements }\nnpm install -g @openai/codex@0.142.2\n$CodexHome = \"$env:USERPROFILE\\.codex\"\n$ConfigPath = Join-Path $CodexHome \"config.toml\"\nNew-Item -ItemType Directory -Force -Path $CodexHome | Out-Null\n$ConfigProbe = Join-Path $CodexHome \".codexapi-write-test\"\ntry {\n  \"ok\" | Set-Content -Path $ConfigProbe -Encoding utf8 -Force\n  Remove-Item $ConfigProbe -Force\n} catch {\n  Write-Error \"Cannot write to $CodexHome. Open PowerShell as your normal Windows user, or fix folder ownership if this .codex folder was created by an Administrator shell.\"\n  throw\n}\nif (Test-Path $ConfigPath) {\n  Copy-Item $ConfigPath \"$ConfigPath.backup.$((Get-Date).ToString('yyyyMMddHHmmss'))\" -Force\n}\n$CodexAppsCache = Join-Path $CodexHome \"cache\\codex_apps_tools\"\nRemove-Item -Recurse -Force -ErrorAction SilentlyContinue $CodexAppsCache\n$CodexApiBackupStamp = (Get-Date).ToString('yyyyMMddHHmmss')\n$CodexApiConfigSnippet = @'\nmodel = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\n'@\nif (Test-Path $ConfigPath) { Copy-Item $ConfigPath \"$ConfigPath.backup.$CodexApiBackupStamp\" -Force }\n$ExistingConfig = if (Test-Path $ConfigPath) { Get-Content $ConfigPath -Raw } else { \"\" }\n$Lines = @()\n$SkipCodexApi = $false\n$InSection = $false\n$InFeatures = $false\n$FeaturesSeen = $false\nforeach ($Line in ($ExistingConfig -split \"`r?`n\")) {\n  $Trimmed = $Line.Trim()\n  if ($Trimmed -match '^\\[model_providers\\.codexapi\\]\\s*$') { $SkipCodexApi = $true; $InFeatures = $false; continue }\n  if ($SkipCodexApi -and $Trimmed -match '^\\[[^\\]]+\\]\\s*$') { $SkipCodexApi = $false }\n  if ($SkipCodexApi) { continue }\n  if ($Trimmed -match '^\\[[^\\]]+\\]\\s*$') { $InSection = $true; $InFeatures = ($Trimmed -eq '[features]'); if ($InFeatures) { $FeaturesSeen = $true } }\n  if (-not $InSection -and $Trimmed -match '^(model|model_provider|model_reasoning_effort|approval_policy|sandbox_mode)\\s*=') { continue }\n  if ($InFeatures -and $Trimmed -match '^apps\\s*=') { continue }\n  if ($Line.Trim().Length -gt 0) { $Lines += $Line }\n}\n$SnippetLines = $CodexApiConfigSnippet.Trim() -split \"`r?`n\"\n$FirstSection = $SnippetLines.Count\nfor ($i = 0; $i -lt $SnippetLines.Count; $i++) { if ($SnippetLines[$i].Trim() -match \"^\\[[^\\]]+\\]\\s*$\") { $FirstSection = $i; break } }\n$Top = @($SnippetLines[0..($FirstSection - 1)]) | Where-Object { $_ -ne $null }\n$ProviderStart = -1\nfor ($i = 0; $i -lt $SnippetLines.Count; $i++) { if ($SnippetLines[$i].Trim() -match \"^\\[model_providers\\.codexapi\\]\\s*$\") { $ProviderStart = $i; break } }\n$Provider = if ($ProviderStart -ge 0) { @($SnippetLines[$ProviderStart..($SnippetLines.Count - 1)]) } else { @() }\n$Out = @()\n$Out += $Top\n$Out += ''\n$InsertedFeatures = $false\nforeach ($Line in $Lines) { $Out += $Line; if ($Line.Trim() -eq '[features]') { $Out += 'apps = false'; $InsertedFeatures = $true } }\nif (-not $FeaturesSeen) { $Out += ''; $Out += '[features]'; $Out += 'apps = false' }\n$Out += ''\n$Out += $Provider\n($Out -join \"`n\").Trim() + \"`n\" | Set-Content -Path $ConfigPath -Encoding UTF8\nWrite-Host \"CodexAPI.pro is configured. Future sessions can start with codex or codex resume --search.\"\ncodex --search",
  "windowsSetupCommand": "$ErrorActionPreference = \"Stop\"\nwinget source update\nif (-not (Get-Command node -ErrorAction SilentlyContinue)) { winget install --id OpenJS.NodeJS.LTS -e --accept-package-agreements --accept-source-agreements }\nif (-not (Get-Command git -ErrorAction SilentlyContinue)) { winget install --id Git.Git -e --accept-package-agreements --accept-source-agreements }\nnpm install -g @openai/codex@0.142.2\n$CodexHome = \"$env:USERPROFILE\\.codex\"\n$ConfigPath = Join-Path $CodexHome \"config.toml\"\nNew-Item -ItemType Directory -Force -Path $CodexHome | Out-Null\n$ConfigProbe = Join-Path $CodexHome \".codexapi-write-test\"\ntry {\n  \"ok\" | Set-Content -Path $ConfigProbe -Encoding utf8 -Force\n  Remove-Item $ConfigProbe -Force\n} catch {\n  Write-Error \"Cannot write to $CodexHome. Open PowerShell as your normal Windows user, or fix folder ownership if this .codex folder was created by an Administrator shell.\"\n  throw\n}\nif (Test-Path $ConfigPath) {\n  Copy-Item $ConfigPath \"$ConfigPath.backup.$((Get-Date).ToString('yyyyMMddHHmmss'))\" -Force\n}\n$CodexAppsCache = Join-Path $CodexHome \"cache\\codex_apps_tools\"\nRemove-Item -Recurse -Force -ErrorAction SilentlyContinue $CodexAppsCache\n$CodexApiBackupStamp = (Get-Date).ToString('yyyyMMddHHmmss')\n$CodexApiConfigSnippet = @'\nmodel = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nexperimental_bearer_token = \"<CODEXAPI_API_KEY>\"\nwire_api = \"responses\"\nsupports_websockets = false\n'@\nif (Test-Path $ConfigPath) { Copy-Item $ConfigPath \"$ConfigPath.backup.$CodexApiBackupStamp\" -Force }\n$ExistingConfig = if (Test-Path $ConfigPath) { Get-Content $ConfigPath -Raw } else { \"\" }\n$Lines = @()\n$SkipCodexApi = $false\n$InSection = $false\n$InFeatures = $false\n$FeaturesSeen = $false\nforeach ($Line in ($ExistingConfig -split \"`r?`n\")) {\n  $Trimmed = $Line.Trim()\n  if ($Trimmed -match '^\\[model_providers\\.codexapi\\]\\s*$') { $SkipCodexApi = $true; $InFeatures = $false; continue }\n  if ($SkipCodexApi -and $Trimmed -match '^\\[[^\\]]+\\]\\s*$') { $SkipCodexApi = $false }\n  if ($SkipCodexApi) { continue }\n  if ($Trimmed -match '^\\[[^\\]]+\\]\\s*$') { $InSection = $true; $InFeatures = ($Trimmed -eq '[features]'); if ($InFeatures) { $FeaturesSeen = $true } }\n  if (-not $InSection -and $Trimmed -match '^(model|model_provider|model_reasoning_effort|approval_policy|sandbox_mode)\\s*=') { continue }\n  if ($InFeatures -and $Trimmed -match '^apps\\s*=') { continue }\n  if ($Line.Trim().Length -gt 0) { $Lines += $Line }\n}\n$SnippetLines = $CodexApiConfigSnippet.Trim() -split \"`r?`n\"\n$FirstSection = $SnippetLines.Count\nfor ($i = 0; $i -lt $SnippetLines.Count; $i++) { if ($SnippetLines[$i].Trim() -match \"^\\[[^\\]]+\\]\\s*$\") { $FirstSection = $i; break } }\n$Top = @($SnippetLines[0..($FirstSection - 1)]) | Where-Object { $_ -ne $null }\n$ProviderStart = -1\nfor ($i = 0; $i -lt $SnippetLines.Count; $i++) { if ($SnippetLines[$i].Trim() -match \"^\\[model_providers\\.codexapi\\]\\s*$\") { $ProviderStart = $i; break } }\n$Provider = if ($ProviderStart -ge 0) { @($SnippetLines[$ProviderStart..($SnippetLines.Count - 1)]) } else { @() }\n$Out = @()\n$Out += $Top\n$Out += ''\n$InsertedFeatures = $false\nforeach ($Line in $Lines) { $Out += $Line; if ($Line.Trim() -eq '[features]') { $Out += 'apps = false'; $InsertedFeatures = $true } }\nif (-not $FeaturesSeen) { $Out += ''; $Out += '[features]'; $Out += 'apps = false' }\n$Out += ''\n$Out += $Provider\n($Out -join \"`n\").Trim() + \"`n\" | Set-Content -Path $ConfigPath -Encoding UTF8\nWrite-Host \"CodexAPI.pro is configured. Future sessions can start with codex or codex resume --search.\"\ncodex --search",
  "windowsStartCommand": "codex\ncodex --search",
  "windowsResumeLastCommand": "codex resume --search\ncodex resume --last --search",
  "windowsExecSmokeTestCommand": "codex --search exec --skip-git-repo-check \"Say hello from CodexAPI.pro.\"",
  "macosStartCommand": "codex\ncodex --search",
  "macosResumeLastCommand": "codex resume --search\ncodex resume --last --search",
  "macosExecSmokeTestCommand": "codex --search exec --skip-git-repo-check \"Say hello from CodexAPI.pro.\"",
  "configToml": "model = \"gpt-5.5\"\nmodel_provider = \"codexapi\"\nmodel_reasoning_effort = \"high\"\napproval_policy = \"never\"\nsandbox_mode = \"danger-full-access\"\n\n[features]\napps = false\n\n[model_providers.codexapi]\nname = \"CodexAPI.pro\"\nbase_url = \"https://api-chicago.codexapi.pro/v1\"\nenv_key = \"CODEXAPI_CODEX_API_KEY\"\nwire_api = \"responses\"\nsupports_websockets = false\n",
  "clientModelLabel": "Deepseek v4 Budget",
  "displayModel": "Deepseek v4 Budget",
  "modelDisplayName": "Deepseek v4 Budget"
}

Windows users must use PowerShell syntax, not Bash exports. The live /api/v1/cli/public-codex payload includes a complete PowerShell setup block that installs dependencies when needed, writes %USERPROFILE%\.codex\config.toml, saves the wallet username as the provider bearer token, and starts codex --search.

Managed Defaults

Codex 0.135.0 Notes

Primary Flow

Wallet Billing

Resume, Isolation, and Approvals

Each managed project_id maps to one stable workspace directory. When the same user returns to that project, the API resumes the latest Codex thread for that workspace instead of creating a fresh conversation.

Project-scoped approval handling stays explicit:

Customer API Calls

This catalogue is generated from the live FastAPI route table and filtered to customer-facing endpoints. public calls need no bearer token, and api calls accept the System Token, customer username, or a user-created API key.

Method Path Access Tags Summary
GET/api/core/releases/currentapireleasesRead the current synced stable Codex release
GET/api/modelsapirpcList visible Codex models
POST/api/projects/openapithreadsOpen a project by cwd, resuming the latest matching thread when present
GET/api/threadsapithreadsList Codex threads
POST/api/threadsapithreadsStart a new thread
GET/api/threads/{thread_id}apithreadsRead a thread by id
POST/api/threads/{thread_id}/resumeapithreadsResume an existing thread
POST/api/turnsapiturnsStart a new turn on a thread
POST/api/turns/{turn_id}/interruptapiturnsInterrupt an active turn
GET/api/v1/agent/statusapiagentRead the managed Codex account state and default coding-agent configuration
GET/api/v1/auth/google/callbackpublicauthComplete Google sign-up or sign-in for a CodexAPI.pro wallet account
GET/api/v1/auth/google/startpublicauthStart Google sign-up or sign-in for a CodexAPI.pro wallet account
POST/api/v1/auth/loginpublicauthAuthenticate a CodexAPI.pro CLI user and issue a wallet-linked API key
GET/api/v1/auth/ssopublicauthOpen the customer dashboard from a signed notification link
POST/api/v1/auth/web-loginpublicauthAuthenticate a CodexAPI.pro dashboard user after Cloudflare Turnstile verification
POST/api/v1/auth/web-login/2fapublicauthComplete CodexAPI.pro dashboard login with a Google Authenticator code
GET/api/v1/billing/token-usageapibillingRead token usage transactions and daily spend for the current wallet
POST/api/v1/cash-wallet/stripe/checkoutapibillingCreate a Stripe Checkout Session to load real-money Cash Wallet balance
POST/api/v1/cash-wallet/stripe/confirmapibillingConfirm a paid Stripe Checkout Session and reconcile Cash Wallet balance
POST/api/v1/cash-wallet/token-purchaseapibillingUse Cash Wallet balance to buy a Token Wallet top-up package
GET/api/v1/cli/versionpublicsystemRead the current CodexAPI.pro Codex CLI release metadata
GET/api/v1/codexclaude/versionpublicsystemRead the required CodexAPI.pro codexclaude launcher version
POST/api/v1/customer/registerpublicauthCreate a CodexAPI.pro customer account and issue a wallet-linked API key
GET/api/v1/daily-checkinapibillingRead the current wallet's Daily Check-in reward status
POST/api/v1/daily-checkin/claimapibillingClaim today's Daily Check-in wallet reward
GET/api/v1/desktop-chat/bootstrapapidesktop-chatLoad CodexAPI.pro Desktop Chat conversations, models, and free daily quota
POST/api/v1/desktop-chat/conversationsapidesktop-chatCreate a CodexAPI.pro Desktop Chat conversation
GET/api/v1/desktop-chat/conversationsapidesktop-chatList CodexAPI.pro Desktop Chat conversations
DELETE/api/v1/desktop-chat/conversations/{conversation_id}apidesktop-chatDelete a CodexAPI.pro Desktop Chat conversation
GET/api/v1/desktop-chat/conversations/{conversation_id}/messagesapidesktop-chatRead CodexAPI.pro Desktop Chat conversation messages
POST/api/v1/desktop-chat/conversations/{conversation_id}/messagesapidesktop-chatSend a CodexAPI.pro Desktop Chat prompt with saved conversation context
GET/api/v1/desktop-chat/messages/{message_id}/research.pdfapidesktop-chatDownload a completed Desktop Chat Deep Research analysis as a PDF
GET/api/v1/desktop-chat/shoutbox/bootstrapapidesktop-chatLoad the shared CodexAPI.pro Desktop Chat Shoutbox
GET/api/v1/desktop-chat/shoutbox/messagesapidesktop-chatList shared CodexAPI.pro Desktop Chat Shoutbox messages
POST/api/v1/desktop-chat/shoutbox/messagesapidesktop-chatSend a shared CodexAPI.pro Desktop Chat Shoutbox message
POST/api/v1/desktop-chat/shoutbox/profileapidesktop-chatSet the user's shared Desktop Chat Shoutbox username
GET/api/v1/desktop/bootstrapapidesktopVerify a CodexAPI.pro token and return Windows desktop setup payloads
POST/api/v1/desktop/bug-reportapidesktopSend a customer desktop bug report to CodexAPI.pro support
GET/api/v1/desktop/coder/projectsapidesktopList Windows Desktop Coding Mode projects and managed databases
POST/api/v1/desktop/coder/projectsapidesktopCreate or resume a Windows Desktop Coding Mode project
POST/api/v1/desktop/coder/projects/purchase-slotapidesktopBuy one additional Windows Desktop Coding Mode project slot from Token Wallet credit
DELETE/api/v1/desktop/coder/projects/{project_name}apidesktopDelete a Windows Desktop Coding Mode project and its managed database
GET/api/v1/desktop/coding-sessionapidesktopLoad the saved CodexAPI.pro Desktop coding conversation history
PUT/api/v1/desktop/coding-sessionapidesktopPersist CodexAPI.pro Desktop coding conversation history
POST/api/v1/desktop/presenceapidesktopRecord a live Desktop Setup Client heartbeat
POST/api/v1/gumroad/registerpublicauthCreate a Gumroad.com buyer account and load $200 Token Wallet credit
GET/api/v1/meapiauthRead the current CodexAPI.pro customer wallet and CLI configuration
POST/api/v1/me/2fa/disableapiauthDisable Google Authenticator 2FA for the current dashboard user
POST/api/v1/me/2fa/enableapiauthEnable Google Authenticator 2FA after verifying the setup code
POST/api/v1/me/2fa/setupapiauthStart Google Authenticator 2FA setup for the current dashboard user
POST/api/v1/me/api-keysapiauthCreate a wallet-linked User API Key for the current customer
GET/api/v1/me/api-keysapiauthList the current customer's System Token and wallet-linked User API Keys
DELETE/api/v1/me/api-keys/{key_id}apiauthRevoke one of the current customer's User API Keys
POST/api/v1/me/api-token/rotateapiauthRotate the current customer's Codex API username/token once every 24 hours
POST/api/v1/me/edge-regionapiauthSet the current customer's preferred Canada or Chicago API server
POST/api/v1/me/emailapiauthSave the required customer email address for the current CodexAPI.pro wallet
POST/api/v1/me/passwordapiauthChange the current CodexAPI.pro dashboard password
POST/api/v1/me/profile-nameapiauthSave the customer profile first name and surname
POST/api/v1/me/profile-name/dismissapiauthRecord that the customer skipped the profile name modal
POST/api/v1/me/sso-linkapiauthCreate a short-lived one-click dashboard sign-on link for the current customer
GET/api/v1/messagesapiauthList the current customer's inbox messages
POST/api/v1/messages/{message_id}/readapiauthMark a customer inbox message read
GET/api/v1/permissionsapiagentRead Codex permission profile presets for API clients
POST/api/v1/projectsapiprojectsCreate a managed project workspace for a web coding session
GET/api/v1/projectsapiprojectsList managed isolated project workspaces
GET/api/v1/projects/{project_id}apiprojectsRead managed project metadata and its latest Codex thread summary
GET/api/v1/projects/{project_id}/approvalsapiagentList pending approval requests for the latest managed project thread
POST/api/v1/projects/{project_id}/approvals/{request_id}/resolveapiagentResolve a pending project-scoped approval request
GET/api/v1/projects/{project_id}/eventsapiagentStream project-scoped Codex notifications over SSE
GET/api/v1/projects/{project_id}/files/contentapiprojectsRead a file from a managed project workspace
PUT/api/v1/projects/{project_id}/files/contentapiprojectsWrite a file inside a managed project workspace
GET/api/v1/projects/{project_id}/files/treeapiprojectsList files inside a managed project workspace
POST/api/v1/projects/{project_id}/openapiagentOpen or resume a managed project and optionally start an initial turn
GET/api/v1/projects/{project_id}/stateapiagentRead project metadata, latest thread state, and pending project-scoped approvals
GET/api/v1/projects/{project_id}/threadapiagentRead the latest Codex thread for a managed project
POST/api/v1/projects/{project_id}/turnsapiagentStart a project-scoped Codex turn using the web-coding defaults
POST/api/v1/projects/{project_id}/turns/{turn_id}/interruptapiagentInterrupt an active turn for a managed project
POST/api/v1/reddit/conversionpublicanalyticsSend a server-side Reddit Conversions API website event
GET/api/v1/referralapibillingRead the current CodexAPI.pro VIP Referral Club and Cash Wallet status
GET/api/v1/share-creditapibillingRead the one-time CodexAPI.pro share-credit offer for the current wallet
POST/api/v1/share-credit/claimapibillingClaim the one-time CodexAPI.pro share credit after sharing the public site
GET/api/v1/skillsapiagentList Codex skills available to API-backed Codex sessions
POST/api/v1/stripe/webhookpublicbillingReceive Stripe wallet payment events
GET/api/v1/telegram/google/callbackpublicauthComplete Telegram Google account linking
GET/api/v1/telegram/google/startpublicauthStart Google sign-in for linking an existing CodexAPI.pro account to Telegram
POST/api/v1/telegram/webhookpublicauthReceive Telegram Bot API webhook updates for dashboard actions
GET/api/v1/toolboxapiauthRead the current customer Toolbox settings
POST/api/v1/toolboxapiauthUpdate the current customer Toolbox settings
GET/api/v1/vipapiauthRead the current customer's VIP Priority server access
POST/api/v1/wallet/auto-topupapibillingConfigure automatic wallet top-up for the current CodexAPI.pro user
GET/api/v1/wallet/statusapibillingRead a lightweight wallet balance snapshot for CLI launchers
POST/api/v1/wallet/stripe/checkoutapibillingCreate a Stripe Checkout Session for a CodexAPI.pro wallet credit pack
POST/api/v1/wallet/stripe/confirmapibillingConfirm a paid Stripe Checkout Session and reconcile wallet credit
POST/api/v1/wallet/top-upapibillingLoad credit onto the current CodexAPI.pro wallet after a plan payment
POST/api/v1/wallet/topup-discountapibillingValidate a user-scoped top-up bonus code
POST/api/v1/wallet/topupemail-session-discountapibillingIssue a time-boxed top-up email discount
POST/v1/chat/completionsapiopenai-compatibleCreate an OpenAI-compatible Chat Completion using the active CodexAPI.pro routing policy
GET/v1/chat/completionsapiopenai-compatibleList locally cached Chat Completions for this bearer
DELETE/v1/chat/completions/{completion_id}apiopenai-compatibleDelete a locally cached Chat Completion
GET/v1/chat/completions/{completion_id}apiopenai-compatibleRetrieve a locally cached Chat Completion
PATCH/v1/chat/completions/{completion_id}apiopenai-compatibleUpdate metadata for a locally cached Chat Completion
POST/v1/completionsapiopenai-compatibleCreate a legacy OpenAI-compatible text completion using the active Responses route
POST/v1/messagesapianthropic-compatibleProxy Claude Code CLI Messages API traffic through CodexAPI.pro wallet billing
POST/v1/messages/{subpath:path}apianthropic-compatibleProxy Claude Code CLI auxiliary Messages API traffic
GET/v1/modelsapiopenai-compatibleList CodexAPI.pro models for stock public Codex CLI
GET/v1/models/{model_id:path}apiopenai-compatibleRetrieve one CodexAPI.pro model descriptor
POST/v1/responsesapiopenai-compatibleProxy stock public Codex CLI Responses API traffic through CodexAPI.pro wallet billing
POST/v1/responses/count_tokensapiopenai-compatibleEstimate input tokens for an OpenAI-compatible Responses payload
DELETE/v1/responses/{response_id}apiopenai-compatibleDelete a locally cached OpenAI-compatible Responses object
GET/v1/responses/{response_id}apiopenai-compatibleRetrieve a locally cached OpenAI-compatible Responses object
POST/v1/responses/{response_id}/cancelapiopenai-compatibleCancel a Responses request if it is still pending
POST/v1/responses/{response_id}/compactapiopenai-compatibleReturn a compacted summary of a locally cached Responses object
GET/v1/responses/{response_id}/input_itemsapiopenai-compatibleList input items captured for a locally cached Responses object