Algolia's API specs follow the OpenAPI specification, version 3.1.
Starting from an existing specification really eases the contribution process and is recommended (e.g. search)
Do not edit the files in specs/bundled they are the generated from the manually written specifications, and only used to generate API clients.
A specification is used to generate the API client, its tests and code snippets, but is most importantly served by the Algolia public documentation, please read our API Documentation guidelines to properly document your specification.
Structure your specification
Each API specification follows a consistent structure.
specs/common/
This common directory contains schemas and parameters that are common to multiple Algolia APIs, for example: search parameters or indexName definitions.
specs/<apiName>/
Each API must be contained in its own directory, for example: the Search API.
specs/<apiName>/spec.yml
This file is the main entrypoint of your specification and should describe your API, including the servers, securitySchemes and paths properties.
specs/<apiName>/common/
This directory contains schemas and parameters that are common to your API.
For schemas that are shared between multiple APIs please use the global specs/common directory.
specs/<apiName>/paths/
This directory contains the descriptions of the endpoints of your API.
The paths themselves are defined in the spec.yml file.
specs/<apiName>/paths/<operation>.yml
Operations are endpoints combined with an HTTP method (GET, POST, etc.).
Each operation must have a unique operationID property.
Operations for the same endpoint may share the same file, for example, the GET and DELETE request for the same endpoint.
Filenames
Follow these conventions:
- If the file only contains one operation, use
<operationId>.ymlas filename. - If the file contains multiple operations, use a more generic name, for example
rule.ymlfor theGET,PUT, andDELETErequest for a rule.
Summaries and descriptions
Every operation must have a summary and description property (they will be used in the generated API clients, and the Algolia documentation).
For information about documenting operations, see Operation summaries and Operation descriptions.
Access Control Lists (ACL)
Each operation should include an x-acl property
to document the ACL required to make the request.
The x-acl property is an array of strings, the allowed values are: search, browse, addObject, deleteObject, listIndexes, deleteIndex, settings, editSettings, analytics, recommendation, usage, logs, setUnretrievableAttributes, admin.
For operations that require the admin API key, use admin
Complex objects
The following objects must not be inlined, but referenced with $ref:
- Nested arrays
- Nested objects
oneOfallOfenum
This is required for accurate naming of the generated code objects. It also improves the readability of the specs.
Properties and parameters
-
Create separate objects and reference them for complex objects.
-
The
formatparameter for strings isn't supported. -
For nullable properties, use the following syntax:
nullableProp:
default: null
oneOf:
- type: string
description: Some value
- type: 'null'
description: The single quotes are required.
For information about documenting properties and parameters, see Properties and parameters.
CLI Commands
Use the CLI to generate build your specs:
Troubleshooting
Explicit names for request bodies
In some cases, the generated name for the requestBody property might be wrong.
This can happen in these cases:
-
The type is too complex or too broad to be correctly generated, for example, an object with
additionalProperties. -
The type is an alias of its model, for example, a list of
model.
To provide a name for the request body, add the x-codegen-request-body-name property to the root of the operation's spec file.
For an example, see pull request #896.
Send additional options to the templates
To send additional information to the generators,
you can add properties starting with x- to the root level of your spec.
These are available in the templates as part of the vendorExtensions object.
For an example, see search.yml