← OpenAI DevelopersCONTENT HISTORY

Update to OpenAI Developers

Snapshot Nov 11, 2026 · 00:08 UTC · version 1.3.16

WHAT CHANGED

Package or technical metadata updated

Package or technical metadata updated

Observed in package metadata. These changes alone do not establish a new customer-facing feature.

Save OpenAI Developers and check future changes in Following.

Up to 3 plugins free · no card required.

All fields and original values.

These are saved file metadata. Open a changed file to read its text edits.

Package file

Before

Nov 9, 2026 · 00:11 UTC

9243063ec92cefcaf0a95d163ed38db30e1e6feea570012df1fcd80ea9e4a221

After

Nov 11, 2026 · 00:08 UTC

d3943fc37e3b7069842ee6a5d9d3061b75475c95c3da92417ec43c0000eb5151

Package file

Before

Nov 9, 2026 · 00:11 UTC

109

After

Nov 11, 2026 · 00:08 UTC

108

Package file

Before

Nov 9, 2026 · 00:11 UTC

0e43c8a02449c62684ffc47cf03c2a1023a68e614194fc16eea872bf543e2d44

After

Nov 11, 2026 · 00:08 UTC

2cff5c9d30e496ebbb8b4862da87ea3b1c8dfa01c7155236b6bd6564506332cd

Package file

Before

Nov 9, 2026 · 00:11 UTC

2085

After

Nov 11, 2026 · 00:08 UTC

2069

Compare saved observations

Download comparison JSON

mcp/server.mjs

− removed · + added

--- before
+++ after
@@ -82,6 +82,25 @@
   },
   annotations: { ...TOOL_ANNOTATIONS, idempotentHint: false },
 };
+const PROMO_ORG_INPUT = "organization";
+const PROMO_DISCLOSURE_INPUT = "disclosure";
+const PROMO_DISCLOSURE_FORM = {
+  mode: "form",
+  message: "Codex usage through API keys",
+  requestedSchema: {
+    type: "object",
+    properties: {
+      acknowledged: {
+        type: "boolean",
+        default: false,
+        title: "I understand this limitation.",
+        description:
+          "Claiming these credits disables Codex access through the selected API Organization’s API keys, including usage paid for with purchased API credits. Restoring access requires canceling this benefit. This does not impact Codex usage through your subscription and does not impact regular API usage.",
+      },
+    },
+    required: ["acknowledged"],
+  },
+};
 const JsonRpcError = {
   METHOD_NOT_FOUND: -32601,
   INVALID_PARAMS: -32602,
@@ -113,7 +132,12 @@
 
 // Sign each prompt with its chat and form. Retries reuse the prompt UUID as
 // the credit-link operation ID without keeping abandoned prompts in memory.
-async function elicit(id, params, form) {
+async function elicit(
+  id,
+  params,
+  form,
+  { inputKey = "confirmation", context, previousPromptId, stateData } = {},
+) {
   if (protocol !== PROTOCOL) return (await request("elicitation/create", form)) ?? { action: "cancel" };
 
   const { name, arguments: args, _meta, requestState, inputResponses } = params;
@@ -127,15 +151,20 @@
   }
   requireNonEmptyString(_meta.threadId, "threadId");
   const call = [_meta.threadId, _meta.sessionId, _meta.itemId, _meta.callId];
-  const promptId = typeof requestState === "string" ? requestState.split(".", 1)[0] : randomUUID();
+  const promptId = previousPromptId ?? (
+    typeof requestState === "string" ? requestState.split(".", 1)[0] : randomUUID()
+  );
+  const statePrefix = stateData === undefined
+    ? `${promptId}.${inputKey}`
+    : `${promptId}.${inputKey}.${stateData}`;
   const signature = createHmac("sha256", continuationKey)
-    .update(JSON.stringify([promptId, name, args?.workspacePath, form, call]))
+    .update(JSON.stringify([statePrefix, name, args?.workspacePath, call, form, context]))
     .digest("base64url");
-  const state = `${promptId}.${signature}`;
-  if (requestState === undefined && inputResponses === undefined) {
+  const state = `${statePrefix}.${signature}`;
+  if (previousPromptId !== undefined || (requestState === undefined && inputResponses === undefined)) {
     sendResult(id, {
       resultType: "input_required",
-      inputRequests: { confirmation: { method: "elicitation/create", params: form } },
+      inputRequests: { [inputKey]: { method: "elicitation/create", params: form } },
       requestState: state,
     });
     return;
@@ -146,7 +175,7 @@
   ) {
     throw new Error("Confirmation does not belong to this tool call.");
   }
-  const response = inputResponses?.confirmation;
+  const response = inputResponses?.[inputKey];
   if (!["accept", "decline", "cancel"].includes(response?.action)) {
     throw new Error("Missing or invalid confirmation response.");
   }
@@ -213,6 +242,13 @@
   });
 }
 
+function sendPromoConfirmation(id, result) {
+  sendResult(id, {
+    content: [{ type: "text", text: JSON.stringify(result) }],
+    structuredContent: result,
+  });
+}
+
 async function handlePromoOrgConfirmation(id, params) {
   const args = params.arguments;
   if (!Array.isArray(args?.destinations) || args.destinations.length === 0 || Object.keys(args).length !== 1) {
@@ -238,34 +274,55 @@
       title: destination.display_name ? `${destination.display_name} (${orgId})` : orgId,
     };
   });
-  const elicitation = await elicit(id, params, {
-    mode: "form",
-    message:
-      "Your ChatGPT subscription includes free API credits. Choose the API organization that will receive them. You can't change the organization for this claim later.",
-    requestedSchema: {
-      type: "object",
-      properties: {
-        destination_account_id: { type: "string", title: "Platform organization", oneOf: choices },
+  const stateParts = protocol === PROTOCOL && typeof params.requestState === "string"
+    ? params.requestState.split(".", 3)
+    : [];
+  let selectedIndex;
+  let previousPromptId;
+  if (stateParts[1] === PROMO_DISCLOSURE_INPUT) {
+    selectedIndex = Number(stateParts[2]);
+    if (choices[selectedIndex] === undefined) {
+      throw new Error("Confirmation does not identify an available Platform organization.");
+    }
+  } else {
+    const picker = await elicit(id, params, {
+      mode: "form",
+      message:
+        "Your ChatGPT subscription includes free API credits. Choose the API organization that will receive them. You can't change the organization for this claim later.",
+      requestedSchema: {
+        type: "object",
+        properties: {
+          destination_account_id: { type: "string", title: "Platform organization", oneOf: choices },
+        },
+        required: ["destination_account_id"],
       },
-      required: ["destination_account_id"],
+    }, { inputKey: PROMO_ORG_INPUT });
+    if (!picker) return;
+    selectedIndex = choices.findIndex(({ const: orgId }) => orgId === picker.content?.destination_account_id);
+    if (picker.action !== "accept" || selectedIndex === -1) {
+      return sendPromoConfirmation(id, { status: "not_approved" });
+    }
+    previousPromptId = picker.promptId;
+  }
+
+  // Carry the confirmed org in the signed state while the disclosure is open.
+  const disclosure = await elicit(id, params, PROMO_DISCLOSURE_FORM, {
+    inputKey: PROMO_DISCLOSURE_INPUT,
+    context: choices,
+    previousPromptId,
+    stateData: selectedIndex,
+  });
+  if (!disclosure) return;
+  if (disclosure.action !== "accept" || disclosure.content?.acknowledged !== true) {
+    return sendPromoConfirmation(id, { status: "not_approved" });
+  }
+  sendPromoConfirmation(id, {
+    status: "approved",
+    link_arguments: {
+      destination_account_id: choices[selectedIndex].const,
+      operation_id: protocol === PROTOCOL ? disclosure.promptId : randomUUID(),
     },
   });
-  if (!elicitation) return;
-  const orgId = elicitation.content?.destination_account_id;
-  const result =
-    elicitation.action === "accept" && orgIds.has(orgId)
-      ? {
-          status: "approved",
-          link_arguments: {
-            destination_account_id: orgId,
-            operation_id: protocol === PROTOCOL ? elicitation.promptId : randomUUID(),
-          },
-        }
-      : { status: "not_approved" };
-  sendResult(id, {
-    content: [{ type: "text", text: JSON.stringify(result) }],
-    structuredContent: result,
-  });
 }
 
 async function handleToolCall(id, params) {
Full technical diff · 15 changed fields

changed /files/.app.json/sha256

BEFORE
"9243063ec92cefcaf0a95d163ed38db30e1e6feea570012df1fcd80ea9e4a221"
AFTER
"d3943fc37e3b7069842ee6a5d9d3061b75475c95c3da92417ec43c0000eb5151"

changed /files/.app.json/size

BEFORE
109
AFTER
108

changed /files/.codex-plugin~1plugin.json/sha256

BEFORE
"0e43c8a02449c62684ffc47cf03c2a1023a68e614194fc16eea872bf543e2d44"
AFTER
"2cff5c9d30e496ebbb8b4862da87ea3b1c8dfa01c7155236b6bd6564506332cd"

changed /files/.codex-plugin~1plugin.json/size

BEFORE
2085
AFTER
2069

changed /files/README.md/sha256

BEFORE
"13c6a79c4ce01c9248856a1e4106e3b6f0c0da55156d766dc2a8902752847702"
AFTER
"f97cac42361e932287304e84b53129702a785a920beddb009bcde6e3c2026ced"

changed /files/README.md/size

BEFORE
2728
AFTER
2814

removed /files/assets~1composer-icon.png

BEFORE
{
  "sha256": "d21ae220edb899366b33f2e5fb61b7a4fd0d9f2aef33f99a0fde46a7eb3784e6",
  "size": 3861
}
AFTER
Field is absent

changed /files/mcp~1server.mjs/sha256

BEFORE
"7ef272c5fffdae3ff96b4db424ab1a167f452e4d5391493d0c7dc0b4c8bd1feb"
AFTER
"a30d0510497deddbb40cb9c986833ab9ff03fe8d9109aca6a1fea5e13ea84304"

changed /files/mcp~1server.mjs/size

BEFORE
14894
AFTER
17028

changed /files/skills~1openai-platform-api-key~1SKILL.md/sha256

BEFORE
"927b1befa10920784e3131783e804dc0cc671fabfb6391f2b4eb4fb016e768d6"
AFTER
"8198e7497978ad1581fa8dcc01c2c5a88c3fb0a87dbfb505547dea012c985adc"

changed /files/skills~1openai-platform-api-key~1SKILL.md/size

BEFORE
13300
AFTER
14331

changed /files/skills~1openai-platform-api-key~1references~1evals.md/sha256

BEFORE
"494067ababa6cb60658ccbc53307d73c7dbd108d2778ecea5991d8319b26bb5e"
AFTER
"8d1a249acb71e4caf485269a0d8384c5c8fe9545dc201be070ac3d7dc127bc0d"

changed /files/skills~1openai-platform-api-key~1references~1evals.md/size

BEFORE
12913
AFTER
13671

changed /files/tests~1openai-platform-api-key.test.mjs/sha256

BEFORE
"29d2b98a82649530b39a889ac0c1f379237473b6028485167fe88a02ce96307f"
AFTER
"910397b0d00b840ae80f09d6990af2f5f462f7f9e5742dc36c9e842fd9ff376d"

changed /files/tests~1openai-platform-api-key.test.mjs/size

BEFORE
46553
AFTER
50168
Full snapshot data
{
  "files": {
    ".app.json": {
      "sha256": "d3943fc37e3b7069842ee6a5d9d3061b75475c95c3da92417ec43c0000eb5151",
      "size": 108
    },
    ".codex-plugin/plugin.json": {
      "sha256": "2cff5c9d30e496ebbb8b4862da87ea3b1c8dfa01c7155236b6bd6564506332cd",
      "size": 2069
    },
    ".mcp.json": {
      "sha256": "fdd030232730a6979b9e1c3bbc10892b01b41372b8c2d8354fc776bd32e0c1c8",
      "size": 451
    },
    "README.md": {
      "sha256": "f97cac42361e932287304e84b53129702a785a920beddb009bcde6e3c2026ced",
      "size": 2814
    },
    "assets/logo.png": {
      "sha256": "d21ae220edb899366b33f2e5fb61b7a4fd0d9f2aef33f99a0fde46a7eb3784e6",
      "size": 3861
    },
    "assets/openai-platform.png": {
      "sha256": "f2f8832878739a84d60fc6a6acf8dc5681fac3ed8318a70d37aa1f8fffacb537",
      "size": 17940
    },
    "mcp/server.mjs": {
      "sha256": "a30d0510497deddbb40cb9c986833ab9ff03fe8d9109aca6a1fea5e13ea84304",
      "size": 17028
    },
    "scripts/openai-platform-api-key.mjs": {
      "sha256": "7dd08001d0712226b443bdd00f45f99a90a58bdf10e25595da29850849a2fa23",
      "size": 13600
    },
    "skills/agents/SKILL.md": {
      "sha256": "1918f74c7509ef03916f0a5c6fd85a35c66faba65e26948e41cd2351cf61f334",
      "size": 6830
    },
    "skills/agents/agents/openai.yaml": {
      "sha256": "881f62164a8fe0807bc6d3d14f6992c653c4929e4e99dfe40bd79a7ee656ed84",
      "size": 178
    },
    "skills/agents/references/agents-sdk.md": {
      "sha256": "592e15f2148ea837383ea63bec1dcda45e0385e757e276001dc0aa337414f028",
      "size": 4628
    },
    "skills/agents/references/app-template.md": {
      "sha256": "8500bf9a04082fc183e7014b4b58829a8df9da3fa29b494046f98683a5130150",
      "size": 2018
    },
    "skills/agents/references/evals.md": {
      "sha256": "02517754e1a3f51af9e9ca9d0cf7440ce9f6480e9cae567f16df49343839b460",
      "size": 2371
    },
    "skills/agents/references/sandbox-providers.md": {
      "sha256": "e505f78f437224a36131edccfdc001d7d92ed2d2c151ca4d07b942b80b2b25bc",
      "size": 3453
    },
    "skills/devday-guide/SKILL.md": {
      "sha256": "ce990a4ea0a0bdba54c1a361aeedad17809048c862c6ac979333a6fba961d774",
      "size": 4554
    },
    "skills/devday-guide/agents/openai.yaml": {
      "sha256": "8020d5f8690fe05202e1d6d4f5c40e017d2d053d0c251ec8c6283461c034a865",
      "size": 224
    },
    "skills/devday-guide/references/devday-2026-attendee-guide.md": {
      "sha256": "ec81cbd120ec889ef10d7b75c66c4dab9b5033ae3d57dcaa316e7e5e6ac115ad",
      "size": 5416
    },
    "skills/openai-api-migration/SKILL.md": {
      "sha256": "164c5bbb64ca525d78a730256cf43d60ed6fcfe9ef1344a1ba72c89b75f3a3f8",
      "size": 12483
    },
    "skills/openai-api-migration/agents/openai.yaml": {
      "sha256": "00fabd89d7d4829b2143a6c0a2ffec205af53437d2093a7cc63d6fd47c73657e",
      "size": 697
    },
    "skills/openai-api-migration/assets/migration-ledger-template.md": {
      "sha256": "3437f0a13cdb3ceee8e0bb23654195b4f227d7a4dd4e6a860beeef901c07f699",
      "size": 14524
    },
    "skills/openai-api-migration/references/evals.md": {
      "sha256": "ab4bce79ad161fab8b4d99a9b11f101c5daaded9a36d253c4a9234966f45da2c",
      "size": 66222
    },
    "skills/openai-api-migration/references/provider-framework-guidance.md": {
      "sha256": "167ed81bb9718bbb3746eb1625ce647f92287ea00310f9b206839315647a2349",
      "size": 4060
    },
    "skills/openai-api-migration/references/responses-api-guidance.md": {
      "sha256": "cd470e2330198b8dacfb980675e6be97056864ac4a471194bfe3dce84f4e681f",
      "size": 18770
    },
    "skills/openai-api-troubleshooting/SKILL.md": {
      "sha256": "63d0a10934b6f999aa85fee64ef6086907e2cfeff15e614b5ce5b07d421d6956",
      "size": 3928
    },
    "skills/openai-api-troubleshooting/agents/openai.yaml": {
      "sha256": "8e58c04d41496c3c426db0f83802e5546414524dd38f560581e45f38eb7548af",
      "size": 136
    },
    "skills/openai-api-troubleshooting/references/evals.md": {
      "sha256": "9921d77b49038df2ca7e3dba8d29b76fa8ba612f1b6f0a4eb63b966b4f09f1f3",
      "size": 8193
    },
    "skills/openai-computer-use/SKILL.md": {
      "sha256": "632b415596fadfccf4432901614e989837bdf524aedf79cdea0dcd6caecd918f",
      "size": 3382
    },
    "skills/openai-computer-use/agents/openai.yaml": {
      "sha256": "f9c670708bf549506f51cf4595fdcb25383b5f1fa29a2ee8560b249f07249236",
      "size": 232
    },
    "skills/openai-platform-api-key/SKILL.md": {
      "sha256": "8198e7497978ad1581fa8dcc01c2c5a88c3fb0a87dbfb505547dea012c985adc",
      "size": 14331
    },
    "skills/openai-platform-api-key/agents/openai.yaml": {
      "sha256": "fc27a29c74c453e85c2f79fb0ee729336f5df2376bf792b82598eacd0437d842",
      "size": 117
    },
    "skills/openai-platform-api-key/references/evals.md": {
      "sha256": "8d1a249acb71e4caf485269a0d8384c5c8fe9545dc201be070ac3d7dc127bc0d",
      "size": 13671
    },
    "skills/setup/SKILL.md": {
      "sha256": "3c0b83ba6cc134011b1fb5c9bf544f129d619bf7fd2616a57365c747aa065c63",
      "size": 6291
    },
    "skills/setup/agents/openai.yaml": {
      "sha256": "9763cb1e01479669d15e69f5eb3bfa5284997687a65ed41767ee3c585e719506",
      "size": 139
    },
    "skills/setup/scripts/verify-responses.mjs": {
      "sha256": "89d93f37b752d847805dcc784971d810fabb5d554c708b18a56a4acdb2eb91df",
      "size": 4315
    },
    "tests/openai-platform-api-key.test.mjs": {
      "sha256": "910397b0d00b840ae80f09d6990af2f5f462f7f9e5742dc36c9e842fd9ff376d",
      "size": 50168
    },
    "tests/setup.test.mjs": {
      "sha256": "030a1380d71557e1140b922109272e550727c24aece7a1a0087fe54d57ad9e9e",
      "size": 5487
    }
  }
}

SHA-256 of public snapshot: 97f4b64f822c383de7c6ab26426def6b230dcdcf958c5a8fcc580763bfaef0d8