# Speakeasy Terraform provider support matrix
Source: https://speakeasy.com/docs/speakeasy-reference/supported/terraform

import { Table } from "@/mdx/components";



## Provider components

<Table
  data={[
    {
      component: "Resource schemas",
      extension: "`x-speakeasy-entity-operation: MyEntity#create`",
      generation: "Hoists and merges JSON Schemas associated with all create, read, update, and delete operations appropriately.",
      docs: "[Docs link](/docs/terraform/entity-mapping#specify-crud-operations-for-api-endpoints)"
    },
    {
      component: "Data source schemas",
      extension: "`x-speakeasy-entity-operation: MyEntity#read`",
      generation: "Hoists and merges JSON Schemas associated with all read operations into a single data source.",
      docs: "[Docs link](/docs/terraform/entity-mapping#specify-crud-operations-for-api-endpoints)"
    },
    {
      component: "Create methods",
      extension: "`x-speakeasy-entity-operation: MyEntity#create`",
      generation: "Speakeasy generates platform connector logic to invoke all API requests and save responses to the Terraform state.",
      docs: "[Docs link](/docs/terraform/entity-mapping#specify-crud-operations-for-api-endpoints)"
    },
    {
      component: "Read methods",
      extension: "`x-speakeasy-entity-operation: MyEntity#read`",
      generation: "Speakeasy generates platform connector logic to invoke all API requests and save responses to the Terraform state. Also invoked in `CREATE` and `UPDATE` methods for additional data calls, enabling drift detection and import.",
      docs: "[Docs link](/docs/terraform/entity-mapping#specify-crud-operations-for-api-endpoints)"
    },
    {
      component: "Update methods",
      extension: "`x-speakeasy-entity-operation: MyEntity#update`",
      generation: "Speakeasy generates platform connector logic to invoke all API requests and save responses to the Terraform state. Plan modifiers force resource recreation when needed.",
      docs: "[Docs link](/docs/terraform/entity-mapping#specify-crud-operations-for-api-endpoints)"
    },
    {
      component: "Delete methods",
      extension: "`x-speakeasy-entity-operation: MyEntity#delete`",
      generation: "Speakeasy generates platform connector logic to invoke all API requests and save responses to the Terraform state.",
      docs: "[Docs link](/docs/terraform/entity-mapping#specify-crud-operations-for-api-endpoints)"
    },
    {
      component: "Plan validators",
      extension: "`x-speakeasy-plan-validators`",
      generation: "Generated when using restricted OpenAPI data types (for example, JSON fields, date fields). Also generated for specific Speakeasy extensions.",
      docs: "[Docs link](/docs/terraform/validation-dependencies#add-custom-validation-logic)"
    },
    {
      component: "Plan modifiers",
      extension: "`x-speakeasy-plan-modifiers`",
      generation: "Ensures API and `terraform state` and `terraform plan` commands have appropriate semantics, such as [diff-detection](/docs/terraform/plan-modification#suppress-unnecessary-plan-changes).",
      docs: "[Docs link](/docs/terraform/plan-modification#add-custom-plan-modification)"
    },
    {
      component: "Resource imports",
      extension: "n/a",
      generation: "Each `resource` will be inserted into the provider resource list.",
      docs: "[Docs link](/docs/terraform/configuration#custom-resources-or-data-sources)"
    }
  ]}
  columns={[
    { key: "component", header: "Provider components" },
    { key: "extension", header: "Speakeasy extension" },
    { key: "generation", header: "Speakeasy generation" },
    { key: "docs", header: "Full docs" }
  ]}
/>

## Supported OpenAPI semantics

<Table
  data={[
    {
      semantic: "Resource schemas (const)",
      support: "✅ Full support",
      comments: "When an attribute in an OpenAPI document is specified as `const`, it is removed from a Terraform schema and automatically included in requests or assumed in responses."
    },
    {
      semantic: "Resource schemas (default)",
      support: "✅ Full support",
      comments: "When an attribute specifies a default value, this value will be used whenever that attribute is not explicitly set, ensuring consistency and reliability."
    },
    {
      semantic: "Server configuration",
      support: "✅ Full support",
      comments: "The provider includes a `server_url` variable, allowing it to be used with any API server. By default, this variable is set to the first entry in the `servers` field of the OpenAPI document."
    },
    {
      semantic: "Global authentication",
      support: "✅ Full support",
      comments: "All authentication mechanisms that rely on static authorization are supported, with their values automatically configurable in the provider settings."
    },
    {
      semantic: "Query parameter serialization",
      support: "✅ Full support",
      comments: "All query parameter attributes will be available as resource or data source attributes in a Terraform-native format. Might require remapping through `x-speakeasy-match`."
    },
    {
      semantic: "Request headers",
      support: "✅ Full support",
      comments: "All request attributes will be available as resource or data source attributes in a Terraform-native format."
    },
    {
      semantic: "Multiple API requests in one CRUD step",
      support: "✅ Full support",
      comments: "For example, `create` requires two API calls."
    },
    {
      semantic: "JSON Schema `type: string`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: number`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: integer`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: boolean`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: object`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: null`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `required: [requiredPropertyA, ...]`",
      support: "✅ Full support",
      comments: "Combined into `Required` or `Optional` Terraform attribute modifiers."
    },
    {
      semantic: "JSON Schema `enum: [...values...]`",
      support: "✅ Full support",
      comments: "A plan validator is added to assert that only one of the predefined values is set."
    },
    {
      semantic: "JSON Schema `type: array`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: array, minItems: N`",
      support: "✅ Full support",
      comments: "A plan validator is added to ensure the Terraform `ListAttribute` has `N` items set."
    },
    {
      semantic: "JSON Schema `type: array, maxItems: J`",
      support: "✅ Full support",
      comments: "A plan validator is added to ensure the Terraform `ListAttribute` has `J` items set."
    },
    {
      semantic: "JSON Schema `type: array, uniqueItems: true`",
      support: "✅ Full support",
      comments: "A plan validator is added to ensure the Terraform `ListAttribute` has all items as unique values."
    },
    {
      semantic: "JSON Schema `type: number, format: float`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: number, format: double`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: integer, format: int32`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: integer, format: int64`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "JSON Schema `type: string, format: date`",
      support: "✅ Full support",
      comments: "A plan validator is added to ensure that this string value is set to a date in the YYYY-MM-DD format."
    },
    {
      semantic: "JSON Schema `type: string, format: date-time`",
      support: "✅ Full support",
      comments: "A plan validator is added to ensure that this string value is RFC 3339-compatible."
    },
    {
      semantic: "JSON Schema `format: binary`",
      support: "✅ Full support",
      comments: "Accessible as a string attribute."
    },
    {
      semantic: "JSON Schema `nullable: true`",
      support: "✅ Full support",
      comments: "Combined into `Required` or `Optional` Terraform attribute modifiers."
    },
    {
      semantic: "JSON Schema `additionalProperties: true`",
      support: "✅ Full support",
      comments: "A free-form object without `additionalProperties: true` is treated as an empty object."
    },
    {
      semantic: "JSON Schema `additionalProperties: ${JSON Schema}`",
      support: "✅ Full support",
      comments: "Full support for defining schemas for additional properties."
    },
    {
      semantic: "JSON Schema `oneOf: [${JSON Schema}, ...]`",
      support: "✅ Full support",
      comments: "Represented as a nested object with one child attribute for each `oneOf` subschema. A plan validator is added that asserts only one child attribute can be set."
    },
    {
      semantic: "JSON Schema `anyOf: [${JSON Schema}, ...]`",
      support: "✅ Full support",
      comments: "Considered the same as `oneOf`."
    },
    {
      semantic: "JSON Schema `allOf: [${JSON Schema}, ...]`",
      support: "✅ Full support",
      comments: "Constructs an \"uber-type\" by merging the superset of all subschemas."
    },
    {
      semantic: "JSON Schema \"Any\" Type",
      support: "✅ Full support",
      comments: "Requires the `x-speakeasy-type-override: any` annotation. Used as an escape hatch."
    },
    {
      semantic: "OpenAPI `readOnly: true`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "OpenAPI `writeOnly: true`",
      support: "✅ Full support",
      comments: ""
    },
    {
      semantic: "Example generation",
      support: "✅ Full support",
      comments: "Propagates `example` and `examples` into generated Terraform resource examples. Uses a type-appropriate value for other cases."
    },
    {
      semantic: "Operation-specific authentication",
      support: "⚠️ Partial support",
      comments: "Speakeasy doesn't support overriding global authentication on specific operations without advanced techniques like monkey patching."
    },
    {
      semantic: "`label` or `matrix` path param serialization",
      support: "⚠️ No support",
      comments: "Remapping may be required through `x-speakeasy-match`."
    },
    {
      semantic: "XML request body serialization",
      support: "⚠️ Partial support",
      comments: "Full support for JSON data types but no support for XML."
    },
    {
      semantic: "XML response body deserialization",
      support: "⚠️ Partial support",
      comments: "Full support for JSON data types but no support for XML response bodies."
    },
    {
      semantic: "Circular references",
      support: "⚠️ Partial support",
      comments: "`x-speakeasy-type-override: any` enables setting attributes with `jsonencode(...arbitrary data...)`."
    },
    {
      semantic: "Lists of lists of primitives",
      support: "⚠️ Partial support",
      comments: "`x-speakeasy-type-override: any` enables setting lists of lists, but Terraform's `ListAttribute` only supports primitive types."
    }
  ]}
  columns={[
    { key: "semantic", header: "OpenAPI semantics" },
    { key: "support", header: "Speakeasy support" },
    { key: "comments", header: "Comments & limitations" }
  ]}
/>

### Terraform framework types from JSON Schema types

<Table
  data={[
    {
      schemaType: "`type: string`",
      additions: "-",
      terraformType: "`schema.StringAttribute`",
      notes: ""
    },
    {
      schemaType: "`type: number`",
      additions: "-",
      terraformType: "`schema.NumberAttribute`",
      notes: ""
    },
    {
      schemaType: "`type: integer`",
      additions: "-",
      terraformType: "`schema.Int64Attribute`",
      notes: ""
    },
    {
      schemaType: "`type: boolean`",
      additions: "-",
      terraformType: "`schema.BoolAttribute`",
      notes: ""
    },
    {
      schemaType: "`type: array`",
      additions: "-",
      terraformType: "`schema.ListAttribute` or `schema.ListNestedAttribute`",
      notes: "A `ListAttribute` is used when `items` has the primitive `type`."
    },
    {
      schemaType: "`type: array`",
      additions: "`format: set`",
      terraformType: "`schema.SetAttribute` or `schema.SetNestedAttribute`",
      notes: "A `SetAttribute` is used when `items` has the primitive `type`."
    },
    {
      schemaType: "`type: object`",
      additions: "`properties: {...}`",
      terraformType: "`schema.SingleNestedAttribute`",
      notes: ""
    },
    {
      schemaType: "`type: object`",
      additions: "`additionalProperties: {...}`",
      terraformType: "`schema.MapAttribute` or `schema.MapNestedAttribute`",
      notes: "A `MapAttribute` is used when `additionalProperties` has the primitive `type`."
    },
    {
      schemaType: "`type: null`",
      additions: "N/A",
      terraformType: "",
      notes: "Element ignored"
    }
  ]}
  columns={[
    { key: "schemaType", header: "JSON Schema type" },
    { key: "additions", header: "JSON Schema additions" },
    { key: "terraformType", header: "Terraform framework type" },
    { key: "notes", header: "Notes" }
  ]}
/>

### JSON Schema subschema handling

<Table
  data={[
    {
      type: "`oneOf`",
      handling: "A `schema.SingleNestedAttribute` is created with one key for each `oneOf` child. Plan validator ensures that only one subattribute is used.",
      docs: "[Docs link](/docs/terraform/extensions#the-oneof-keyword)"
    },
    {
      type: "`anyOf`",
      handling: "Considered the same as `oneOf`. Speakeasy does not strictly enforce this subschema type in production environments.",
      docs: "[Docs link](/docs/terraform/extensions#the-anyof-keyword)"
    },
    {
      type: "`allOf`",
      handling: "Merges all subschemas. When the subschemas are objects, it creates a composite object with properties from all child schemas.",
      docs: "[Docs link](/docs/terraform/extensions#the-allof-keyword)"
    }
  ]}
  columns={[
    { key: "type", header: "JSON Schema subschema type" },
    { key: "handling", header: "Handling" },
    { key: "docs", header: "Full docs" }
  ]}
/>