{
  "openapi": "3.0.3",
  "info": {
    "title": "Support for `additionalProperties` declarations",
    "description": "https://github.com/OAI/OpenAPI-Specification/blob/master/versions/3.0.3.md#schema-object",
    "version": "1.0.0"
  },
  "servers": [
    {
      "url": "https://httpbin.org"
    }
  ],
  "paths": {
    "/post": {
      "post": {
        "summary": "Should allow additionalProperties in JSON schema",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "object with `additionalProperties: true`": {
                    "type": "object",
                    "additionalProperties": true
                  },
                  "object with `additionalProperties: false` and no other properties": {
                    "type": "object",
                    "additionalProperties": false
                  },
                  "object with `additionalProperties: { type: integer }`": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "integer"
                    }
                  },
                  "object with `additionalProperties: { type: object, properties: ... }`": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "integer"
                        },
                        "text": {
                          "type": "string"
                        }
                      }
                    }
                  },
                  "object with `additionalProperties: { type: object, properties: ... }` and custom title": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "object",
                      "properties": {
                        "code": {
                          "type": "integer"
                        },
                        "text": {
                          "type": "string"
                        }
                      },
                      "title": "This is a custom title"
                    }
                  },
                  "object with `additionalProperties: { type: array, items: { type: integer } }`": {
                    "type": "object",
                    "additionalProperties": {
                      "type": "array",
                      "items": {
                        "type": "integer"
                      }
                    }
                  },
                  "object with `additionalProperties: $ref, simple`": {
                    "type": "object",
                    "additionalProperties": {
                      "$ref": "#/components/schemas/ref"
                    }
                  },
                  "object with `additionalProperties: $ref, with $ref`": {
                    "type": "object",
                    "additionalProperties": {
                      "$ref": "#/components/schemas/ref-with-ref"
                    }
                  },
                  "object with `additionalProperties: anyOf` (polymorphic)": {
                    "type": "object",
                    "additionalProperties": {
                      "anyOf": [
                        {
                          "type": "string"
                        },
                        {
                          "$ref": "#/components/schemas/ref"
                        },
                        {
                          "$ref": "#/components/schemas/ref-with-ref"
                        }
                      ]
                    }
                  },
                  "object with `additionalPropeties` within an allOf": {
                    "description": "Technically this is not valid to the spec. The `additionalProperties` rejections should cancel out each others new field but we indicate we want this to work by enabling [json-schema-merge-allof](https://npm.im/json-schema-merge-allof)'s `ignoreAdditionalProperties` option",
                    "allOf": [
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "primitiveProperty": {
                            "type": "string"
                          }
                        }
                      },
                      {
                        "type": "object",
                        "additionalProperties": false,
                        "properties": {
                          "alt_primitiveProperty": {
                            "type": "string"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "object with `additionalProperties: true`": {
                      "type": "object",
                      "additionalProperties": true
                    },
                    "object with `additionalProperties: { type: integer }`": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "integer"
                      }
                    },
                    "object with `additionalProperties: { type: object, properties: ... }`": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "object",
                        "properties": {
                          "code": {
                            "type": "integer"
                          },
                          "text": {
                            "type": "string"
                          }
                        }
                      }
                    },
                    "object with `additionalProperties: { type: object, properties: ... }` and custom title": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "object",
                        "properties": {
                          "code": {
                            "type": "integer"
                          },
                          "text": {
                            "type": "string"
                          }
                        },
                        "title": "This is a custom title"
                      }
                    },
                    "object with `additionalProperties: { type: array, items: { type: integer } }`": {
                      "type": "object",
                      "additionalProperties": {
                        "type": "array",
                        "items": {
                          "type": "integer"
                        }
                      }
                    },
                    "object with `additionalProperties: $ref, simple`": {
                      "type": "object",
                      "additionalProperties": {
                        "$ref": "#/components/schemas/ref"
                      }
                    },
                    "object with `additionalProperties: $ref, with $ref`": {
                      "type": "object",
                      "additionalProperties": {
                        "$ref": "#/components/schemas/ref-with-ref"
                      }
                    },
                    "object with `additionalProperties: anyOf` (polymorphic)": {
                      "type": "object",
                      "additionalProperties": {
                        "anyOf": [
                          {
                            "type": "string"
                          },
                          {
                            "$ref": "#/components/schemas/ref"
                          },
                          {
                            "$ref": "#/components/schemas/ref-with-ref"
                          }
                        ]
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ref": {
        "type": "integer"
      },
      "ref-with-ref": {
        "type": "object",
        "properties": {
          "code": {
            "type": "integer"
          },
          "text": {
            "type": "string"
          },
          "array": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ref"
            }
          }
        }
      }
    }
  }
}
