Environments within a resolved organization + project — one level deeper than ProjectsController. Every route here carries `{org}`, so ResolveTenantFilter has already resolved + access-checked it before any action runs. `{project}` is resolved key-or-guid, scoped to the resolved org, via ResolveProjectIdAsync for every action (list needs it too, unlike ProjectsController's org-only list). `{env}` (get/update/delete) is then resolved key-or-guid, scoped to the resolved project, via ResolveEnvironmentIdAsync. Dispatched commands/queries always use the resolved GUIDs, never the raw route strings. Writes (create/update/delete) require at least Member (RequireRole); a Viewer attempting one gets a 403 `forbidden` envelope. Deleting a project's last environment surfaces the existing `LAST_ENVIRONMENT` guard (DeleteEnvironmentCommandHandler) as-is — it throws the custom ValidationException, which PublicApiExceptionFilterAttribute maps to a 400 `validation_failed` envelope automatically, so Delete doesn't special-case it. ListEnvironmentsQuery has no `Skip`/`Take` (unlike `ListProjectsQuery`) — a project's environment count is small, so List fetches the full set and paginates in-memory to still expose the standard cursor contract.
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we
store it to create your key and to recognise you if you sign in with another
provider. See our Privacy Policy and
Terms.
openapi: 3.2.0
info:
title: Management Environments API
description: 'Programmatic access to Featureflip — projects, environments, feature flags, variations, targeting, segments, and SDK keys. Authenticate with a Personal Access Token or Service Token via the Authorization: Bearer header.'
version: v1
servers:
- url: https://api.featureflip.io
description: Production
security:
- Bearer: []
tags:
- name: Environments
description: 'Environments within a resolved organization + project — one level deeper than
ProjectsController. Every route here carries `{org}`, so
ResolveTenantFilter has already resolved + access-checked
it before any action runs. `{project}` is resolved key-or-guid, scoped to the resolved
org, via ResolveProjectIdAsync for every action (list
needs it too, unlike ProjectsController''s org-only list). `{env}`
(get/update/delete) is then resolved key-or-guid, scoped to the resolved project, via
ResolveEnvironmentIdAsync. Dispatched commands/queries
always use the resolved GUIDs, never the raw route strings. Writes (create/update/delete)
require at least Member (RequireRole);
a Viewer attempting one gets a 403 `forbidden` envelope. Deleting a project''s last
environment surfaces the existing `LAST_ENVIRONMENT` guard
(DeleteEnvironmentCommandHandler) as-is — it throws the custom
ValidationException, which
PublicApiExceptionFilterAttribute maps to a 400
`validation_failed` envelope automatically, so Delete doesn''t special-case it.
ListEnvironmentsQuery has no `Skip`/`Take` (unlike
`ListProjectsQuery`) — a project''s environment count is small, so List
fetches the full set and paginates in-memory to still expose the standard cursor contract.'
paths:
/api/v1/orgs/{org}/projects/{project}/environments:
post:
tags:
- Environments
summary: Creates an environment in the resolved project
description: 'Requires at least Member. An environment past
the plan''s per-project environment cap is a 403 `plan_limit_reached`.'
parameters:
- name: org
in: path
required: true
schema:
type: string
- name: project
in: path
required: true
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PublicCreateEnvironmentRequest'
text/json:
schema:
$ref: '#/components/schemas/PublicCreateEnvironmentRequest'
application/*+json:
schema:
$ref: '#/components/schemas/PublicCreateEnvironmentRequest'
responses:
'201':
description: Created
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicEnvironmentResponse'
'403':
description: Forbidden
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'404':
description: Not Found
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'400':
description: The request is malformed, or it carries an If-Match header, which this endpoint can't evaluate. Send no If-Match, or `*`.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'401':
description: Authentication is required, or the supplied API token is invalid or expired.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'429':
description: Rate limit exceeded. Retry after the interval indicated by the Retry-After header.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
operationId: postApiV1OrgsByOrgProjectsByProjectEnvironments
x-operation-id-source: derived
get:
tags:
- Environments
summary: Lists environments in the resolved project, cursor-paginated
parameters:
- name: org
in: path
required: true
schema:
type: string
- name: project
in: path
required: true
schema:
type: string
- name: limit
in: query
schema:
type: integer
format: int32
- name: cursor
in: query
schema:
type: string
responses:
'200':
description: OK
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicEnvironmentResponsePagedResult'
'404':
description: Not Found
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'401':
description: Authentication is required, or the supplied API token is invalid or expired.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'429':
description: Rate limit exceeded. Retry after the interval indicated by the Retry-After header.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
operationId: getApiV1OrgsByOrgProjectsByProjectEnvironments
x-operation-id-source: derived
/api/v1/orgs/{org}/projects/{project}/environments/{env}:
get:
tags:
- Environments
summary: Gets an environment in the resolved project by key or id
parameters:
- name: org
in: path
required: true
schema:
type: string
- name: project
in: path
required: true
schema:
type: string
- name: env
in: path
required: true
schema:
type: string
- name: If-Match
in: header
description: Optional. An ETag of this resource. The response is 200 only if it is still the current one; otherwise 412 `precondition_failed`. `*` or no header always reads.
schema:
type: string
responses:
'200':
description: OK
headers:
ETag:
description: 'Strong ETag of the resource''s whole body as sent to this caller: it changes whenever anything in the body does. Send it back as If-Match on a PUT.'
schema:
type: string
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicEnvironmentResponse'
'404':
description: Not Found
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'412':
description: The resource's current ETag is not the If-Match one.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'401':
description: Authentication is required, or the supplied API token is invalid or expired.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'429':
description: Rate limit exceeded. Retry after the interval indicated by the Retry-After header.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
operationId: getApiV1OrgsByOrgProjectsByProjectEnvironmentsByEnv
x-operation-id-source: derived
put:
tags:
- Environments
summary: Updates an environment's name/color/sort order
description: Requires at least Member.
parameters:
- name: org
in: path
required: true
schema:
type: string
- name: project
in: path
required: true
schema:
type: string
- name: env
in: path
required: true
schema:
type: string
- name: If-Match
in: header
description: Optional. The ETag from a GET of this resource. The write applies only if the resource still has that ETag, meaning nothing in its body has changed since; otherwise 412 `precondition_failed`. `*` or no header applies the write unconditionally.
schema:
type: string
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/PublicUpdateEnvironmentRequest'
text/json:
schema:
$ref: '#/components/schemas/PublicUpdateEnvironmentRequest'
application/*+json:
schema:
$ref: '#/components/schemas/PublicUpdateEnvironmentRequest'
responses:
'412':
description: The resource changed since the If-Match ETag.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'204':
description: No Content
headers:
ETag:
description: 'Strong ETag of the resource''s whole body as sent to this caller: it changes whenever anything in the body does. Send it back as If-Match on a PUT.'
schema:
type: string
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
'403':
description: Forbidden
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'404':
description: Not Found
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'401':
description: Authentication is required, or the supplied API token is invalid or expired.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'429':
description: Rate limit exceeded. Retry after the interval indicated by the Retry-After header.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
operationId: putApiV1OrgsByOrgProjectsByProjectEnvironmentsByEnv
x-operation-id-source: derived
delete:
tags:
- Environments
summary: Deletes an environment
description: 'Requires at least Member. Deleting a project''s last environment
throws the existing `LAST_ENVIRONMENT`ValidationException, which the
exception filter maps to a 400 `validation_failed` envelope.'
parameters:
- name: org
in: path
required: true
schema:
type: string
- name: project
in: path
required: true
schema:
type: string
- name: env
in: path
required: true
schema:
type: string
responses:
'204':
description: No Content
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
'400':
description: The request is malformed, or it carries an If-Match header, which this endpoint can't evaluate. Send no If-Match, or `*`.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'403':
description: Forbidden
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'404':
description: Not Found
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'401':
description: Authentication is required, or the supplied API token is invalid or expired.
headers:
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
'429':
description: Rate limit exceeded. Retry after the interval indicated by the Retry-After header.
headers:
Retry-After:
description: Number of seconds to wait before retrying the request.
schema:
type: integer
X-RateLimit-Limit:
$ref: '#/components/headers/X-RateLimit-Limit'
X-RateLimit-Remaining:
$ref: '#/components/headers/X-RateLimit-Remaining'
X-RateLimit-Reset:
$ref: '#/components/headers/X-RateLimit-Reset'
content:
application/json:
schema:
$ref: '#/components/schemas/PublicApiErrorEnvelope'
operationId: deleteApiV1OrgsByOrgProjectsByProjectEnvironmentsByEnv
x-operation-id-source: derived
components:
schemas:
PublicApiErrorEnvelope:
required:
- error
- message
- docs_url
type: object
properties:
error:
type:
- string
- 'null'
message:
type:
- string
- 'null'
docs_url:
type:
- string
- 'null'
fields:
type:
- object
- 'null'
additionalProperties:
type: array
items:
type: string
retry_after:
type:
- integer
- 'null'
format: int32
did_you_mean:
type:
- array
- 'null'
items:
type: string
next_actions:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/NextAction'
connection_id:
type:
- string
- 'null'
format: uuid
plan_limit:
$ref: '#/components/schemas/PublicPlanLimit'
additionalProperties: false
description: 'The frozen public-API error contract. `error` codes are stable snake_case strings. Wire keys
are frozen snake_case too (`error`, `message`, `docs_url`, `fields`,
`retry_after`) — the global camelCase naming policy would otherwise emit
`docsUrl`/`retryAfter`, breaking the published spec. !:JsonPropertyName
always wins over the policy, so these are pinned explicitly rather than relying on the
property names already being lowercase for the single-word ones.
`did_you_mean`, `next_actions` and `connection_id` are ADDITIVE optional keys
(null → omitted via the global `DefaultIgnoreCondition = WhenWritingNull`), so
pre-existing error bodies are byte-for-byte unchanged when they''re absent.
`connection_id` is present only on the `sso_required` error: the organization
requires single sign-on, and this credential didn''t come through its identity provider.
`connection_id` identifies which SSO connection to sign in with.
`plan_limit` is present only on the `plan_limit_reached` error: which plan cap the
request would have exceeded, so a client can branch on it without parsing `message`.'
example:
error: not_found
message: Flag 'new-checkout-flw' was not found in project 'checkout'.
docs_url: https://featureflip.io/docs/management-api/errors/not_found
did_you_mean:
- new-checkout-flow
next_actions:
- method: GET
path: /api/v1/orgs/acme/projects/checkout/flags
PublicCreateEnvironmentRequest:
required:
- key
- name
type: object
properties:
key:
type:
- string
- 'null'
name:
type:
- string
- 'null'
color:
type:
- string
- 'null'
sortOrder:
type: integer
format: int32
additionalProperties: false
description: 'Request body for `POST /api/v1/orgs/{org}/projects/{project}/environments`. Named
distinctly from the dashboard''s own `CreateEnvironmentRequest`
— both controllers share one Swagger document (see `Program.cs`''s `AddSwaggerGen``DocInclusionPredicate` override), and Swashbuckle''s default schemaId is the bare type
name, so an identical name in either namespace throws a schemaId collision at
`--export-openapi` time.'
example:
key: production
name: Production
color: '#16A34A'
sortOrder: 2
PublicEnvironmentResponsePagedResult:
required:
- items
type: object
properties:
items:
type:
- array
- 'null'
items:
$ref: '#/components/schemas/PublicEnvironmentResponse'
next_cursor:
type:
- string
- 'null'
_actions:
type: object
additionalProperties:
$ref: '#/components/schemas/ActionCapability'
description: 'Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller''s role and the resource''s state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.'
additionalProperties: false
description: 'A page of results plus an opaque cursor for the next page, or null when this is the last
page. Wire keys are frozen: `items` (already lowercase under the camelCase policy) and
`next_cursor` (pinned explicitly — the policy alone would emit `nextCursor`).'
PublicPlanLimit:
required:
- resource
- plan
- max
type: object
properties:
resource:
type:
- string
- 'null'
plan:
type:
- string
- 'null'
max:
type: integer
format: int32
additionalProperties: false
description: 'The cap behind a `plan_limit_reached` error. `resource` is the capped collection
(`projects`, `environments`, `flags`, `webhooks`, `members`);
`plan` is the plan''s wire name, as `GET /api/v1/orgs/{org}` returns it; `max` is
the cap. The environment and flag caps are per project.'
PublicUpdateEnvironmentRequest:
required:
- name
type: object
properties:
name:
type:
- string
- 'null'
color:
type:
- string
- 'null'
sortOrder:
type: integer
format: int32
additionalProperties: false
description: 'Request body for `PUT /api/v1/orgs/{org}/projects/{project}/environments/{env}`. See
PublicCreateEnvironmentRequest for why this is named distinctly from the
dashboard''s `UpdateEnvironmentRequest`.'
PublicEnvironmentResponse:
required:
- id
- key
- name
- sortOrder
type: object
properties:
id:
type: string
format: uuid
key:
type:
- string
- 'null'
name:
type:
- string
- 'null'
color:
type:
- string
- 'null'
sortOrder:
type: integer
format: int32
_actions:
type: object
additionalProperties:
$ref: '#/components/schemas/ActionCapability'
description: 'Capability hints: which operations the authenticated caller may perform on this resource, each with allowed + optional reason. Computed from the caller''s role and the resource''s state. Injected at runtime; safe to ignore. Present only on top-level resource responses — nested occurrences (e.g. a rule inside a targeting-config response) do not carry it.'
additionalProperties: false
description: 'Public representation of an environment, returned by
`GET /api/v1/orgs/{org}/projects/{project}/environments` (list),
`GET .../environments/{env}` (detail), and the body of a successful create/update. Drops
internal fields (e.g. `ProjectId` is implicit in the route) — mirrors
`ProjectResponse`''s minimal shape. Named `PublicEnvironmentResponse` rather than
`EnvironmentResponse` (unlike the sibling `ProjectResponse`, which didn''t collide)
because the dashboard already has its own
`EnvironmentResponse` — see
PublicCreateEnvironmentRequest for the schemaId-collision rationale.'
example:
id: 0197b69f-2b3c-7d4e-9f5a-6b7c8d9e0f1a
key: production
name: Production
color: '#16A34A'
sortOrder: 2
ActionCapability:
type: object
properties:
allowed:
type: boolean
reason:
type:
- string
- 'null'
additionalProperties: false
description: 'One entry in a resource''s `_actions` block: may the caller perform it, and if not, why.'
NextAction:
required:
- method
- path
type: object
properties:
method:
type:
- string
- 'null'
path:
type:
- string
- 'null'
additionalProperties: false
headers:
X-RateLimit-Remaining:
description: The number of requests remaining in the current rate-limit window.
schema:
type: integer
X-RateLimit-Reset:
description: The UTC time at which the current rate-limit window resets, as a Unix timestamp in seconds.
schema:
type: integer
X-RateLimit-Limit:
description: The maximum number of requests permitted per rate-limit window for this caller.
schema:
type: integer
securitySchemes:
Bearer:
type: apiKey
description: JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token in the text input below.
name: Authorization
in: header
x-provenance:
method: harvested
publisher: Featureflip
source: https://featureflip.io/openapi/public-v1.json
note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
stamped by stamp-openapi-provenance.py (roadmap#793)