Extracting value from API interactions often requires more than a single call to an endpoint to achieve the outcome desired. Until recently, the standards and specifications community offered little guidance on how to feasibly articulate multi-call expeditions across the endpoints exposed by either a single, or multiple APIs. Even when working with popular API specifications such as OpenAPI, teams often must craft human-centric guides to help improve an API consumers ability to achieve their integration work. To tackle this and other common practical challenges across the API landscape, projects like the OpenAPI initiative (OAI), expanded their areas of focus with the establishment of Special Interest Groups (SIGs), otherwise known as working groups. One such working group, focused on multi-step workflow scenarios, and their work resulted in the evolution of the OpenAPI Initiative into a multi-specification project with the launch of the Arazzo Specification 1.0.0 in May 2024. 
In fact, in 2024, the OAI set a new bar for activity with the release of not just Arazzo 1.0.0, but also Overlay 1.0.0, alongside two important patch versions of the OpenAPI Specification: 3.1.1 and 3.0.4. This momentum has carried forward into 2025, marked by the recent patch release for Arazzo  1.0.1. 
The Broader Use-Cases for Arazzo 
While Arazzo is a key enabler of AI-based API consumption, it also addresses several major challenges for API producers and consumers today: 
	- Provide Deterministic API Consumption Recipes: Standardize workflows to ensure repeatable, structured API interactions. 
- Act as Living Workflow Documentation: Keep API workflows up to date without relying on outdated or external documentation. 
- Automate Consumer-facing Documentation: Reduce reliance on out-of-band documentation by generating developer portal docs dynamically. 
- Enable End-to-End Test Automation: Define API workflows that can be used for automated testing. 
- Streamline Regulatory Compliance Validation: Automate checks to verify API interactions against compliance requirements. 
- Empower Next-Generation API SDK Generation: Enable workflow-aware SDKs for improved developer experiences that focus on specific use cases. 
- Enable Agentic API Consumption: Provide a consistent and interoperable mechanism for AI models and agents to interact with APIs. 
The Arazzo Specification does not mandate a specific development process such as  design-first  or code-first. Instead, it facilitates either technique by establishing clear workflow interactions with HTTP APIs described using the OpenAPI Specification (and in the future it’s planned to expand to event-based protocols and the AsyncAPI specification).
Now that we’ve grounded ourselves in some of the many use cases for Arazzo, let’s dive in and take a closer look at the specification itself.  
 
Figure 1 - The Arazzo Specification Logo 
The Arazzo Specification Structure 
The Arazzo Specification describes an approach to document use-case oriented workflows in a programmatically readable format. The formats supported by Arazzo are YAML and JSON, thus they are machine-readable while also being sufficiently human-readable. When we talk about a workflow in the context of Arazzo, we define it as a series of API calls that, when woven together accomplish some business objective. 
The additional human readable nature of Arazzo improves the ability of API providers to tell the story of their API(s) in a manner that can improve consumer experiences. Arazzo deliberately caters to human developers and improves their developer experience (DX). At the same time, Arazzo is fully aware of the needs of AI-agents and simultaneously improves the agent experience (AX) by providing the deterministic semantics needed for them to parse and execute complex and/or sensitive API workflows. 
If you are familiar with the OpenAPI Specification (OAS), or indeed its sister specification AsyncAPI, then the Arazzo Specification should feel familiar to you. One noticeable deviation relates to how referencing reusable components works within Arazzo. Rather than using the OpenAPI $ref mechanism (which clashes with the JSON Schema keyword $ref), Arazzo uses a runtime expression syntax to specify references which are not a JSON Schema object (for JSON Schema object referencing, continue to use $ref as that’s well defined in the JSON Schema). Rather than put the details here, you can check out the GitHub issue for more information. 
In most cases, the various conventions and patterns around metadata objects, reusable components, and the specification’s language itself should feel familiar. 
Even the image below (a specification on a page style) should look familiar to you! 
 
Figure 2 - Arazzo Specification - 1.0.1 
Crafting an Arazzo description means we will create (either by hand or preferably as the output of low-code, no-code, or natural language processing tooling) a YAML or JSON document which conforms to the Arazzo Specification. This means that at a minimum, for a document to be classified as a valid Arazzo document, it must contain a valid Arazzo Specification field (e.g. `arazzo: 1.0.1`), an `info` field, a `sourcesDescriptions` field with at least one defined Source Description Object, and there must be at least one Workflow defined in the `workflows` field.  
In the sections below, we’ll cover all of this. Don’t worry, it’s not complicated! 
The Arazzo Specification Object 
This is the root object of the Arazzo description. It identifies the version of the Arazzo Specification used, various metadata, and the workflows which represent what can be parsed, rendered, and/or executed by the processing software. 
 
Figure 3 - Arazzo Specification Object - Minimal Example 
The example above provides a minimalist example of a valid Arazzo document. The document contains a valid `arazzo` version, it specifies a `sourceDescriptions` which in this case references an OpenAPI description on a remote sever, and it defines a workflow which has at least one step.  
The Arazzo specification is versioned using a major.minor.patch versioning scheme. At the time of writing, the available versions of Arazzo are 1.0.1 (released Jan 2025) and 1.0.0 (released May 2024).  
	
		
			| Field Name  | Description  | Required  | 
		
			| arazzo  | The version of the Arazzo Specification that the Arazzo Description uses.  | Yes  | 
		
			| info  | Provides metadata about the workflows contain within the Arazzo Description.   | Yes  | 
		
			| sourceDescriptions  |  A list of source descriptions (such as an OpenAPI description) the workflow defined will apply to.   | Yes  | 
		
			| workflows  | A list of workflows to be applied to various API endpoints defined in the sourceDescriptions.  | Yes  | 
		
			| components  | Various reusable elements/schemas for the Arazzo Description – help reduce verbosity.  | No  | 
	
Arazzo Structure – Info Object 
The Info Object contains metadata about the defined Arazzo document. The information is useful for discoverability, building up a catalog or marketplace for use-case orientated capabilities that have been described using Arazzo.  
 
Figure 4 - Arazzo Specification - Info Example 
The example above provides a rich Info Object example, where the title, summary, and description fields set clear context for consumers so they can understand what is possible with the current Arazzo Document. The version field represents the version of the current document which is not to be confused with the version of the Arazzo Specification itself! 
	
		
			| Field Name  | Description  | Required  | 
		
			| title  | A human readable title for the Arazzo document.  | Yes  | 
		
			| summary  | A short summary of what can be achieved.  | No  | 
		
			| description  | A description of the purpose of the workflows defined.  | No  | 
		
			| version  | The version identifier of the document (this is not the version of the Specification to which the document conforms).  | Yes  | 
	
Arazzo Structure – Source Description Object 
An Arazzo document contains a sourceDescriptions property which is an array of Source Description Objects. It lists the source descriptions, which can either be an OpenAPI description or another Arazzo document and can be referenced by one or more of the workflows defined. From a programming language perspective, it’s best to think of these akin to namespaces or imports. They set the scope (or boundary) to which workflows in the entry Arazzo document can be applied to.
 
Figure 5 - Arazzo Specification - SourceDescriptions Example 
In the example above, two OpenAPI sourceDescriptions are specified. Any workflow defined can have steps which interact with operations in either or both OpenAPI descriptions referenced. This is very powerful! 
	
		
			| Field Name  | Description  | Required  | 
		
			| name  | A unique name for the source description.  | Yes  | 
		
			| url  | A URL to a source description to be used by a workflow. It can be relative to the Arazzo document.  | Yes  | 
		
			| type  | The type of source description. Possible values are "openapi" or "arazzo". It’s planned to add “asyncapi” into the future!  | No  | 
	
Arazzo Structure – Workflow Object 
An Arazzo document can contain one of more Workflow Objects which are specified in the workflows property. These describe the workflows to be taken across one or more APIs to achieve a specific objective or outcome. What’s powerful about workflows is that the steps they defined can comprise of calls to API endpoints/operations hosted across multiple APIs. The steps within a workflow may also call other workflows, meaning that it’s trivial to chain complex multi-workflow orchestrations together while still ensuring modularity, better maintenance, and testability. 
 
Figure 6 - Arazzo Specification - Workflows Example 
In the partial example above a single workflow is defined. The workflowId uniquely defines the workflow, while the summary and description, give consumers context for what use case is covered by the workflow.  
In the sections below, we’ll jump into the details of the other properties. 
	
		
			| Field Name  | Description  | Required  | 
		
			| workflowId  | Unique string to represent the workflow.  | Yes  | 
		
			| summary  | Specifies the purpose or objective of the workflow.  | No  | 
		
			| description  | A description of the workflow.  | No  | 
		
			| inputs  | Inputs needed by the workflow to function (e.g. an API Key or a token, or a destination you want to fly to). What’s needed is described using JSON Schema.  | No  | 
		
			| dependsOn  | A list of workflows that need be completed before this workflow can be processed.  | No  | 
		
			| steps  | An ordered list of steps. Each step represents a call to an API operation or to another workflow.  | Yes  | 
		
			| successActions  | A list of success actions that are applicable for all steps described under this workflow. Think of these as things to do if a step succeed (maybe we to raise an event upon every successful step completion).  | No  | 
		
			| failureActions  | A list of failure actions that are applicable for all steps in this workflow. A good example is that if a step fails because an authentication token is expired, then let’s refresh the token and retry the step. Rather than having this in each step, we have it here for convenience!  | No  | 
		
			| outputs  | These are things to return from the workflow and can processed by the calling software application or agent.  | No  | 
		
			| parameters  | A list of parameters that are applicable for all steps described under this workflow.  | No  | 
	
Arazzo Structure – Workflow Inputs 
It’s common that a workflow might need to be provided various inputs that it cannot determine itself. For example, if I wanted to book a trip away, then I would need to provide a destination, dates, cost range (and many more) human inputs. Additionally, the software executing the workflow might needed to also pass in secure credentials for API invocation etc. Arazzo caters for this flexibly by allowing the inputs to be described using an JSON Schema object. 
 
Figure 7 - Arazzo Specification - Workflow Inputs Example 
In the example above, a JSON Schema object describes the expected inputs for the workflow. In this case, four string inputs are specified with three of them being required. 
Arazzo Structure – Step Object 
The steps within a workflow represent the most important part of the Arazzo document. Each step represents either a call to an API operation, or to another workflow. The latter enabling workflows to be modular and allowing authors build more complex workflows by leveraging other predefined or discoverable workflows at the step level. As an example, if a workflow exists for obtaining an OAuth 2.0 Bearer Token, then it would be advantageous to leverage that rather than having to inline the fully Authorization Code Flow negotiation into each workflow created.  
 
Figure 8 - Arazzo Specification - Steps Example 
In the partial example above, we have a searchPets step containing a clear description. The step is going to call the getPets operation within the petsAPI defined in the sourceDescriptions. The syntax here is following the runtime expression syntax of the Arazzo Specification. 
	
		
			| Field Name  | Description  | Required  | 
		
			| stepId  | Unique string to represent the step.  | Yes  | 
		
			| description  | A description of the step.  | No  | 
		
			| operationId  | A operationIddefined within an API referenced in thesourceDescriptions. | conditional:  operationIdoroperationPathorworkflowIdmust be defined | 
		
			| operationPath  | A JSON Pointer reference to an API referenced within the sourceDescriptions(asoperationIdis not mandatory in OpenAPI we have to have other ways to reference operations L ). | conditional:  operationIdoroperationPathorworkflowIdmust be defined | 
		
			| workflowId  | A workflowIddefined within an Arazzo workflow referenced in thesourceDescriptions(or another workflow in the current Arazzo doc). | conditional:  operationId or operationPathorworkflowIdmust be defined | 
		
			| parameters  | A list of parameters that  MUST  be passed to an operation or workflow referenced in this step  | No  | 
		
			| requestBody  | The request body to pass to an operation if referenced.  | No  | 
		
			| successCriteria  | A list of assertions to determine the success of the step.  | No  | 
		
			| onSuccess  | An array of success action objects that specify what to do upon step success (maybe we can jump to the last step if certain conditions hold true).  | No  | 
		
			| onFailure  | An array of failure action objects that specify what to do upon step failure (can we recover and retry or call another workflow first etc.).  | No  | 
		
			| outputs  | These are things to return from the step and can processed subsequent steps in the workflow or mapped to workflow outputs.  | No  | 
	
Arazzo Structure – Step Parameters 
When defining an Arazzo step that will call an API, it’s normal that you may have to specify certain parameters on the operation. These could be HTTP headers, query parameters, path parameters etc. Arazzo caters for this via the Parameters Object. 
 
Figure 9 - Arazzo Specification - Step Parameters Example 
In the example above, four query parameters are defined. The values for the first three parameters are dynamic and mapped from properties defined in the inputs. The status property value is a literal string (e.g. “available”). 
	
		
			| Field Name  | Description  | Required  | 
		
			| name  | The name of the parameter.  | Yes  | 
		
			| in  | The location of the parameter. Possible values are "path", "query", "header", or "cookie". When the step in context specifies a  workflowId, then all parameters map to workflow inputs. | conditional: required if operationIdoroperationPathare specified in the step. | 
		
			| value  | The value to pass in the parameter. The value can be a constant or a Runtime Expression.  | Yes  | 
	
Arazzo Structure – Step Success Criteria 
To decide on what to do once a step completes, we need to know if the step is successful or not. This could be a simple check, or it could be more complex like checking the HTTP Status Code returned by an API call as well as inspecting certain contents in the response payload. The successCriteria specifies the list of conditions to be verified. If all the specified assertions pass, then a step can be deemed successful. 
 
Figure 10 - Arazzo Specification - Step Success Criteria Example 
In the example above, two criteria are specified. Both must evaluate to true for the step to be deemed successful. The first condition specifies that the HTTP status code returned from the API call must be 200. The second condition specifies that the response from the API must contain a response body, which is expected to be of type application/json, and that within the payload there will be a root level pets array - the length of which should be greater than zero. 
	
		
			| Field Name  | Description  | Required  | 
		
			| context  | A Runtime Expression used to set the context for the condition to be applied on.  | conditional:   If typeis specified, then the context  MUST  be provided | 
		
			| condition  | The condition to apply. Conditions can be simple (e.g. $statusCode == 200 which applies an operator on a value obtained from a runtime expression), or a regex, or a JSONPath expression. For regex or JSONPath, the type and context  MUST  be specified.  | Yes  | 
		
			| type  | The type of condition to be applied. If specified, the options allowed are  simple, regex, jsonpathorxpath. |  | 
	
Arazzo Structure – Failure Action Object 
As is life, API calls do not always go as we expect. Being able to deal with the non-happy path, is a particular strength of the Arazzo Specification. The onFailure property within a step lets us to specify what should be done if an API returns something that does not meet the conditions defined within the successCriteria property. If none are specified, then the overall workflow will stop at the point of failure. 
 
Figure 11 - Arazzo Specification - Failure Action Example 
The example above specifies a retry type of failure action which will be executed if the API referenced by the step returns an HTTP Status Code of 503 (e.g. server unavailable). Based on the configuration, the current step should be retried after 1 second (as specified by the retryAfter), and if the API continues to return a 503-status code, we should stop the retries after 5 attempts (as specified by the retryLimit). 
	
		
			| Field Name  | Description  | Required  | 
		
			| name  | The name of the failure action.  | Yes  | 
		
			| type  | The type of action to take. Possible values are "end", "retry", or "goto". | Yes  | 
		
			| workflowId  | The workflowIdreferencing an existing workflow to transfer to upon failure of the step. This field is only relevant when the type field value is "goto" or "retry". A common example would be if an API returned a HTTP 401 due to an expired token, you could reference a refresh token workflow here. | No  | 
		
			| stepId  | The stepIdto transfer to upon failure of the step. This field is only relevant when the type field value is "goto" or "retry". | No  | 
		
			| retryAfter  | The number of seconds to delay after the step failure before another attempt is to be made.  |  | 
		
			| retryLimit  | An integer indicating how many attempts to retry the step  MAY  be attempted before failing the overall step.  | No  | 
		
			| criteria  | A list of assertions to determine if this action  SHALL  be executed.  | No  | 
	
There are three possible values for the type field. 
	- end- The workflow ends, and context returns to the caller with applicable outputs.
- retry- The current step will be retried. The retry can be constrained by the- retryAfterand- retryLimitfields.
- goto- A one-way transfer of workflow control to the specified label (either a- workflowIdor- stepId).
Arazzo Structure – Success Action Object 
By default, the steps specified within a workflow will execute in sequential order. In certain situations, we may be able to determine that we have the information required to be able to skip several steps and speed up the execution, letting us reap the value on offer faster! The onSuccess property enables this type of control. 
 
Figure 12 - Arazzo Specification - Success Action Object 
In the example above, we have a goto type success action. What the example demonstrates is that if we get back at least one pet matching the criteria in the request to the API, then we can jump to the joinWaitingList step. 
	
		
			| Field Name  | Description  | Required  | 
		
			| name  | The name of the success action.  | Yes  | 
		
			| type  | The type of action to take. Possible values are "end" or "goto". | Yes  | 
		
			| stepId
 | The stepId to transfer to upon success of the step. This field is only relevant when the type field value is "goto". | No  | 
		
			| criteria  | A list of assertions to determine if this action  SHALL  be executed.  | No  | 
	
There are two possible values for the type field. 
	- end- The workflow ends, and context returns to the caller with applicable outputs.
- goto- A one-way transfer of workflow control to the specified label (either a- workflowIdor- stepId).
Arazzo Structure – Step Outputs 
When we execute a workflow step, we often want to make information available to subsequent steps within the workflow. For example, if we searched for a product, then we might want to make the identifier of that product available for the next step to add it to our shopping basket. The step outputs are array contains a map between a single name and a dynamic output value.  
 
Figure 13 - Arazzo Specification - Step Outputs Example 
In the simple example above, we return an output with a unique name of petId, and its value is defined by a runtime expression which will be evaluated by the software processing the step to make the actual identifier of the pet available for subsequent steps in the workflow. 
Arazzo Structure – Workflow Outputs 
Workflow outputs follow the very same principal as those within a step. The only difference is that from a processing perspective, workflow outputs are returned to the calling context. If a software application was executing a workflow, then the outputs would be returned to the application for evaluation, storage, or rendering. 
 
Figure 14 - Arazzo Specification - Workflow Outputs Example 
 
Figure 15 - Other Reusable Objects within Arazzo 
Example 
Let’s run through a simple fictitious example of how a company can take advantage of the Arazzo Specification to enhance their API products and capabilities for consumers. To do so, we’ll assume the identity of a fictional company called PetCo. 
 
Problem Statement: 
We’ve identified a business problem. We’re being overwhelmed by the number of pets being abandoned at our pet store. 
Proposed Solution: 
Following extensive research, we’ve decided to create the capabilities to search for and adopt pets that we catalog. We’ll offer this adoption service through our website and make the APIs available with wider eco-system of pet shelters, pet charities, and pet orphanages who expressed a need for such a service in our research. 
Our APIs: 
Based on our organization structure, we have set up a new team who will manage the adoption APIs and they are separate to the core Pets catalog facility. Thus, APIs we have on offer are as follows: 
	- Pets API – offering resources and methods required for cataloging pets. 
- Adoptions API – offering resources and methods to initiate and manage adoptions. 
 
Figure 16 - Example Pets API 
 
Figure 17 - Example Adoptions API 
The Workflow 
To streamline the understanding and consumption for the wider eco-system of consumers, we want to articulate the process involved in adopting a pet that matches certain criteria. To do so, we’ll leverage the Arazzo Specification to describe the following required steps. 
	- Search for a pet based on certain criteria. 
- Initiate an adoption request. 
- Confirm adoption by updating the adoption status. 
- Verify the adoption has been completed by ensuring the pet catalog entry no longer has the pet tagged as available. 
In the video below, we showcase how we can leverage our public Arazzo Specification GPT to fast-track the creation of the Arazzo Document, and to prepare our API Hub Developer Portal with the ‘Adopt Pet’ product including step-by-step developer documentation and client code samples. 
 
Figure 18 - Arazzo Specification GPT by SmartBear
Conclusion 
The Arazzo Specification is poised to play an important role in the future of API technology. With a rising demand for sophisticated APIs that interconnect across many digital ecosystems, the specification will need to handle intricate scenarios, accommodate emerging technologies (like AI). In fact, the shift towards AI-driven API consumption is accelerating the need for deterministic API workflows!  
Whether you're automating workflows, enabling AI consumption, or enhancing API governance, Arazzo is the key to unlocking the next generation of API-driven innovation. By being an open standard within the OpenAPI Initiative under the Linux Foundation, Arazzo is positioned to evolve in an open and collaborative manner and continue supporting the needs of the industry. 
There’s a vibrant tooling eco-system emerging with support for Arazzo and we’re busy working on broad support for Arazzo across our API Hub offering at SmartBear. If you can’t wait for us to drop that, you should check out Spectral for linting Arazzo documents, and play with our Arazzo GPT in the OpenAI GPT store.