External Publication
Visit Post

ChatGPT App Submission Json Schema returns a 404

OpenAI Developer Community May 12, 2026
Source

For those who are interested I tried to generate it myself, seem to work, but I don’t know if there are more fields that could be filled

{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "$id": "https://developers.openai.com/apps-sdk/schemas/chatgpt-app-submission.v1.json",
  "title": "ChatGPT App Submission",
  "description": "Shape of the JSON file accepted by the OpenAI Apps SDK submission form's \"chatgpt-app-submission.json\" upload box. Mirrors the output contract of the Codex `chatgpt-app-submission` skill in openai/plugins.",
  "type": "object",
  "additionalProperties": false,
  "required": ["tools"],
  "properties": {
    "$schema": {
      "type": "string",
      "format": "uri",
      "description": "Identifier only — the URL is not fetched by the importer."
    },
    "schema_version": {
      "type": "integer",
      "const": 1
    },
    "app_info": {
      "type": "object",
      "additionalProperties": false,
      "properties": {
        "display_name": {
          "type": "string",
          "description": "Public app name shown in ChatGPT and the Apps Directory."
        },
        "subtitle": {
          "type": "string",
          "maxLength": 30,
          "description": "Short functional phrase. 30 characters max."
        },
        "description": {
          "type": "string",
          "description": "Public description."
        },
        "category": {
          "type": "string",
          "description": "Single category. Maps to dashapi `version.categories[0]`.",
          "enum": [
            "BUSINESS",
            "COLLABORATION",
            "DESIGN",
            "DEVELOPER_TOOLS",
            "EDUCATION",
            "ENTERTAINMENT",
            "FINANCE",
            "FOOD",
            "LIFESTYLE",
            "NEWS",
            "PRODUCTIVITY",
            "SHOPPING",
            "TRAVEL"
          ]
        }
      }
    },
    "tools": {
      "type": "object",
      "description": "Map of MCP tool name → annotation hints + justifications.",
      "minProperties": 1,
      "additionalProperties": { "$ref": "#/definitions/tool" }
    },
    "test_cases": {
      "type": "array",
      "description": "Positive test cases. Form requires ≥5.",
      "items": { "$ref": "#/definitions/testCase" }
    },
    "negative_test_cases": {
      "type": "array",
      "description": "Negative test cases. Form requires ≥3.",
      "items": { "$ref": "#/definitions/negativeTestCase" }
    }
  },
  "definitions": {
    "tool": {
      "type": "object",
      "additionalProperties": false,
      "required": ["annotations", "justifications"],
      "properties": {
        "annotations": {
          "type": "object",
          "additionalProperties": false,
          "required": ["readOnlyHint", "openWorldHint", "destructiveHint"],
          "properties": {
            "readOnlyHint": {
              "type": "boolean",
              "description": "True only when the tool strictly fetches/lists/computes without changing state."
            },
            "openWorldHint": {
              "type": "boolean",
              "description": "True if the tool can change publicly visible internet state or external third-party systems."
            },
            "destructiveHint": {
              "type": "boolean",
              "description": "True if the tool can delete, overwrite, revoke access, or perform irreversible admin actions."
            }
          }
        },
        "justifications": {
          "type": "object",
          "additionalProperties": false,
          "required": [
            "read_only_justification",
            "open_world_justification",
            "destructive_justification"
          ],
          "properties": {
            "read_only_justification":   { "type": "string", "minLength": 1 },
            "open_world_justification":  { "type": "string", "minLength": 1 },
            "destructive_justification": { "type": "string", "minLength": 1 }
          }
        }
      }
    },
    "testCase": {
      "type": "object",
      "additionalProperties": false,
      "required": ["description", "user_prompt"],
      "properties": {
        "description": {
          "type": "string",
          "description": "Scenario — describe the use case to test."
        },
        "user_prompt": {
          "type": "string",
          "description": "Exact prompt or interaction to begin the test."
        },
        "tools_triggered": {
          "type": ["string", "null"],
          "description": "Exact MCP tool name(s). Use arrows for sequences (e.g. \"list-teams → list-projects\")."
        },
        "expected_output": {
          "type": ["string", "null"],
          "description": "Output or experience expected from the MCP server."
        }
      }
    },
    "negativeTestCase": {
      "type": "object",
      "additionalProperties": false,
      "required": ["description", "user_prompt"],
      "properties": {
        "description": {
          "type": "string",
          "description": "Scenario where the app should NOT trigger."
        },
        "user_prompt": {
          "type": "string",
          "description": "Example prompt where the app should not trigger."
        }
      }
    }
  }
}

Discussion in the ATmosphere

Loading comments...