---
page_title: Functions Metadata
description: >-
  The `terraform metadata functions` command prints signatures for all the
  functions available in the current Terraform version.
---

# Functions Metadata

The `terraform metadata functions` command is used to print signatures for the functions available in the current Terraform version.

-> `terraform metadata functions` requires **Terraform v1.4 or later**.

## Usage

Usage: `terraform metadata functions [options]`

The following flags are available:

- `-json` - Displays the function signatures in a machine-readable, JSON format.

Please note that, at this time, the `-json` flag is a _required_ option. In future releases, this command will be extended to allow for additional options.

The output includes a `format_version` key, which as of Terraform 1.4.0 has
value `"1.0"`. The semantics of this version are:

- We will increment the minor version, e.g. `"1.1"`, for backward-compatible
  changes or additions. Ignore any object properties with unrecognized names to
  remain forward-compatible with future minor versions.
- We will increment the major version, e.g. `"2.0"`, for changes that are not
  backward-compatible. Reject any input which reports an unsupported major
  version.

We will introduce new major versions only within the bounds of
[the Terraform 1.0 Compatibility Promises](/language/v1-compatibility-promises).

## Format Summary

The following sections describe the JSON output format by example, using a pseudo-JSON notation.
Important elements are described with comments, which are prefixed with `//`.
To avoid excessive repetition, we've split the complete format into several discrete sub-objects, described under separate headers. References wrapped in angle brackets (like `<block-representation>`) are placeholders which, in the real output, would be replaced by an instance of the specified sub-object.

The JSON output format consists of the following objects and sub-objects:

- [Function Signature Representation](#function-signature-representation) - the top-level object returned by `terraform metadata functions -json`
- [Parameter Representation](#parameter-representation) - a sub-object of signatures that describes their parameters

## Function Signature Representation

```javascript
{
  "format_version": "1.0",

  // "function_signatures" describes the signatures for all
  // available functions.
  "function_signatures": {
    // keys in this map are the function names, such as "abs"
    "example_function": {
      // "description" is an English-language description of
      // the purpose and usage of the function in Markdown.
      "description": "string",

      // "return_type" is a representation of a type specification
      // that the function returns.
      "return_type": "string",

      // "parameters" is an optional list of the positional parameters
      // that the function accepts.
      "parameters": [
        <parameter-representation>,
        …
      ],

      // "variadic_parameter" is an optional representation of the
      // additional arguments that the function accepts after those
      // matching with the fixed parameters.
      "variadic_parameter": <parameter-representation>
    },
    "example_function_two": { … }
  }
}
```

## Parameter Representation

A parameter representation describes a parameter to a function.

```javascript
{
  // "name" is the internal name of the parameter
  "name": "string",

  // "description" is an optional English-language description of
  // the purpose and usage of the parameter in Markdown.
  "description": "string",

  // "type" is a representation of a type specification
  // that the parameter's value must conform to.
  "type": "string"
}
```
