# no-schema-type-mismatch

Ensures that a schema's structural properties match its declared `type`. In particular:

- A schema of type `object` **must not** include an `items` field.
- A schema of type `array` **must not** include a `properties` field.


| OAS | Compatibility |
|  --- | --- |
| 2.0 | ✅ |
| 3.0 | ✅ |
| 3.1 | ✅ |
| 3.2 | ✅ |


| AsyncAPI | Compatibility |
|  --- | --- |
| 2.6 | ✅ |
| 3.0 | ✅ |


| Arazzo | Compatibility |
|  --- | --- |
| 1.0 | ✅ |



```mermaid
flowchart TD
  Schema -->|if type is object| CheckItems["'items' field exists?"]
  Schema -->|if type is array| CheckProps["'properties' field exists?"]
```

## API design principles

When designing an API schema, the defined `type` should be consistent with its structure:

- **Objects** are collections of key/value pairs. They should be defined using `properties` (or additionalProperties) and must not use `items`.
- **Arrays** are ordered lists of items and must use `items` to define their content. Including `properties` is invalid.


This rule helps catch typos and misconfigurations early in your API definition.

## Configuration

| Option | Type | Description |
|  --- | --- | --- |
| severity | string | Possible values: `off`, `warn`, `error`. Default is `error` in the recommended configuration. |


Example configuration:


```yaml
rules:
  no-schema-type-mismatch: error
```

## Examples

### Incorrect Examples

#### Object type with an `items` field


```yaml
properties:
  user:
    type: object
    properties:
      id:
        type: string
    items:
      type: number
```

*Error:* An `object` type should not include an `items` field.

#### Array type with a `properties` field


```yaml
properties:
  tags:
    type: array
    properties:
      name:
        type: string
```

*Error:* An `array` type should not include a `properties` field.

### Correct Examples

#### Object type with proper `properties`


```yaml
properties:
  user:
    type: object
    properties:
      id:
        type: string
      name:
        type: string
```

#### Array type with proper `items`


```yaml
properties:
  tags:
    type: array
    items:
      type: string
```

## Related rules

- [no-enum-type-mismatch](/docs/cli/rules/common/no-enum-type-mismatch)
- [no-mixed-number-range-constraints](/docs/cli/rules/common/no-mixed-number-range-constraints)
- [no-required-schema-properties-undefined](/docs/cli/rules/common/no-required-schema-properties-undefined)
- [configurable rules](/docs/cli/rules/configurable-rules)
- [no-invalid-media-type-examples](/docs/cli/rules/oas/no-invalid-media-type-examples)
- [no-invalid-parameter-examples](/docs/cli/rules/oas/no-invalid-parameter-examples)
- [no-invalid-schema-examples](/docs/cli/rules/oas/no-invalid-schema-examples)


## Resources

- [Rule source](https://github.com/Redocly/redocly-cli/blob/main/packages/core/src/rules/common/no-schema-type-mismatch.ts)