Every API here is available over the APIs.io API and to AI agents over MCP.
openapi: 3.2.0
info:
description: Integrate your application with Endor Labs using the REST API.
title: Endor Labs REST API Reference License Service API
version: '1.0'
servers:
- description: US (default)
url: https://api.endorlabs.com
- description: EU (data residency)
url: https://api.eu.endorlabs.com
tags:
- name: LicenseService
paths:
/v1/namespaces/{object.tenant_meta.namespace}/licenses:
patch:
description: Updates the license.
operationId: LicenseService_UpdateLicense
parameters:
- description: 'Namespaces are a way to organize organizational units into virtual
groupings of resources. Namespaces must be a fully qualified name,
for example, the child namespace of namespace "endor.prod" called "app"
is called "endor.prod.app".'
in: path
name: object.tenant_meta.namespace
required: true
schema:
type: string
x-endor-name: Namespace
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/LicenseServiceUpdateLicenseBody'
required: true
x-originalParamName: body
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/endorv1License'
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/googlerpcStatus'
description: An unexpected error response.
summary: UpdateLicense
tags:
- LicenseService
x-internal: true
/v1/namespaces/{tenant_meta.namespace}/licenses:
get:
description: Lists all licenses in a namespace.
operationId: LicenseService_ListLicenses
parameters:
- description: 'Namespaces are a way to organize organizational units into virtual
groupings of resources. Namespaces must be a fully qualified name,
for example, the child namespace of namespace "endor.prod" called "app"
is called "endor.prod.app".'
in: path
name: tenant_meta.namespace
required: true
schema:
type: string
x-endor-name: Namespace
- description: 'String of conditions to filter resources by.
Filters may include any attribute along with the following operators:
"==", "!=", ">", ">=", "<", "<=", "Contains", "In", "Matches", and
"Exists". The logical operators "And" and "Or" are also supported.
Expressions may be combined and grouped with parentheses.
Examples:
"spec.value == 5",
"spec.value in ["a", "b", "c"]",
"(meta.name == "xyz" and "spec.value in ["a","b"]) or (spec.value ==
"c")".'
in: query
name: list_parameters.filter
schema:
type: string
- description: 'Set the page token to start from.
Use page tokens to page through list results or list specific pages.'
in: query
name: list_parameters.page_token
schema:
format: int32
type: integer
- description: 'Set the page size to limit the number of results returned.
Default: 100. Max: 500.'
in: query
name: list_parameters.page_size
schema:
format: int32
type: integer
- description: Action to be executed with a request. Not supported for all endpoints.
in: query
name: list_parameters.action
schema:
type: string
- description: List of fields to return (all fields are returned by default).
in: query
name: list_parameters.mask
schema:
type: string
- description: Get data from any child namespaces as well.
in: query
name: list_parameters.traverse
schema:
type: boolean
- description: Field to sort objects by, for example, meta.name.
in: query
name: list_parameters.sort.path
schema:
type: string
- description: 'Sort order. Default: ASC.'
in: query
name: list_parameters.sort.order
schema:
default: SORT_ENTRY_ORDER_UNSPECIFIED
enum:
- SORT_ENTRY_ORDER_UNSPECIFIED
- SORT_ENTRY_ORDER_ASC
- SORT_ENTRY_ORDER_DESC
type: string
- description: 'Return the number of objects matching the given list parameters.
If count is set to true, the response is a CountResponse.
Can be used together with filter and traverse.'
in: query
name: list_parameters.count
schema:
type: boolean
- description: 'Group the objects based on this field.
If there are multiple fields then the objects are grouped
based on the uniqueness of all fields.
Supports composite paths.
Supports arrays and maps.'
in: query
name: list_parameters.group.aggregation_paths
schema:
type: string
- description: 'Return the UUID of each object in each group as specified by
aggregation_paths.'
in: query
name: list_parameters.group.show_aggregation_uuids
schema:
type: boolean
- description: 'List of fields for which we want the unique count.
Supports arrays and maps.'
in: query
name: list_parameters.group.unique_count_paths
schema:
type: string
- description: 'List of fields for which we want the unique values.
Supports arrays and maps.'
in: query
name: list_parameters.group.unique_value_paths
schema:
type: string
- description: Only return objects from PR scans that match this context id.
in: query
name: list_parameters.ci_run_uuid
schema:
type: string
- description: Page ID to retrieve.
in: query
name: list_parameters.page_id
schema:
type: string
- description: 'Group the objects based on this time field,
for example, meta.create_time.'
in: query
name: list_parameters.group_by_time.aggregation_paths
schema:
type: string
- description: Return the UUIDs of the objects in each group.
in: query
name: list_parameters.group_by_time.show_aggregation_uuids
schema:
type: boolean
- description: Interval unit by which the objects should be grouped.
in: query
name: list_parameters.group_by_time.interval
schema:
default: GROUP_BY_TIME_INTERVAL_UNSPECIFIED
enum:
- GROUP_BY_TIME_INTERVAL_UNSPECIFIED
- GROUP_BY_TIME_INTERVAL_YEAR
- GROUP_BY_TIME_INTERVAL_QUARTER
- GROUP_BY_TIME_INTERVAL_MONTH
- GROUP_BY_TIME_INTERVAL_WEEK
- GROUP_BY_TIME_INTERVAL_DAY
- GROUP_BY_TIME_INTERVAL_HOUR
- GROUP_BY_TIME_INTERVAL_MINUTE
- GROUP_BY_TIME_INTERVAL_SECOND
type: string
- description: 'Size of the time interval to group the objects by,
for example, to group objects by 2-week intervals, set interval
to GROUP_BY_TIME_INTERVAL_WEEK and group_size to 2.'
in: query
name: list_parameters.group_by_time.group_size
schema:
format: int32
type: integer
- description: 'Beginning of the time period to group objects.
Defaults to the beginning of time.'
in: query
name: list_parameters.group_by_time.start_time
schema:
format: date-time
type: string
- description: 'End of the time period to group objects.
Defaults to the current time.'
in: query
name: list_parameters.group_by_time.end_time
schema:
format: date-time
type: string
- description: 'The mode determines how the matching objects are counted
in the produced time-series. Values allowed are:
count (default) : is the number of items matching in every interval.
sum: is the total number of items matching since the beginning of the
aggregation time.'
in: query
name: list_parameters.group_by_time.mode
schema:
type: string
- description: 'The aggregation_field is a field on the matched objects that we want to
perform some operation in each interval (example : min, max, avg)'
in: query
name: list_parameters.group_by_time.aggregation_value_field
schema:
type: string
- description: 'The aggreation_operator is the operator that we should use for the
aggregation. Allowed values are: min, max, sum, avg'
in: query
name: list_parameters.group_by_time.aggregation_operator
schema:
type: string
- description: 'If true, the results will not be paginated and
only the first page will be returned. The order
of the results is not guaranteed.'
in: query
name: list_parameters.disable_pagination
schema:
type: boolean
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/v1ListLicenseResponse'
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/googlerpcStatus'
description: An unexpected error response.
summary: ListLicenses
tags:
- LicenseService
x-internal: true
post:
description: Creates a license.
operationId: LicenseService_CreateLicense
parameters:
- description: 'Namespaces are a way to organize organizational units into virtual
groupings of resources. Namespaces must be a fully qualified name,
for example, the child namespace of namespace "endor.prod" called "app"
is called "endor.prod.app".'
in: path
name: tenant_meta.namespace
required: true
schema:
type: string
x-endor-name: Namespace
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/LicenseServiceCreateLicenseBody'
required: true
x-originalParamName: body
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/endorv1License'
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/googlerpcStatus'
description: An unexpected error response.
summary: CreateLicense
tags:
- LicenseService
x-internal: true
/v1/namespaces/{tenant_meta.namespace}/licenses/{uuid}:
delete:
description: Deletes the license identified by the UUID.
operationId: LicenseService_DeleteLicense
parameters:
- description: 'Namespaces are a way to organize organizational units into virtual
groupings of resources. Namespaces must be a fully qualified name,
for example, the child namespace of namespace "endor.prod" called "app"
is called "endor.prod.app".'
in: path
name: tenant_meta.namespace
required: true
schema:
type: string
x-endor-name: Namespace
- description: The UUID of the resource to be deleted.
in: path
name: uuid
required: true
schema:
type: string
- description: Action to be executed with delete request.
in: query
name: delete_parameters.action
schema:
type: string
- description: 'Force will force the deletion of the resource if any
checks fail.'
in: query
name: delete_parameters.force
schema:
type: boolean
responses:
'200':
content:
application/json:
schema:
type: object
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/googlerpcStatus'
description: An unexpected error response.
summary: DeleteLicense
tags:
- LicenseService
x-internal: true
get:
description: Fetches the license specified by the UUID.
operationId: LicenseService_GetLicense
parameters:
- description: 'Namespaces are a way to organize organizational units into virtual
groupings of resources. Namespaces must be a fully qualified name,
for example, the child namespace of namespace "endor.prod" called "app"
is called "endor.prod.app".'
in: path
name: tenant_meta.namespace
required: true
schema:
type: string
x-endor-name: Namespace
- description: The UUID of the requested resource.
in: path
name: uuid
required: true
schema:
type: string
- description: List of fields to return (all fields are returned by default).
in: query
name: get_parameters.mask
schema:
type: string
responses:
'200':
content:
application/json:
schema:
$ref: '#/components/schemas/endorv1License'
description: A successful response.
default:
content:
application/json:
schema:
$ref: '#/components/schemas/googlerpcStatus'
description: An unexpected error response.
summary: GetLicense
tags:
- LicenseService
x-internal: true
components:
schemas:
LicenseServiceUpdateLicenseBody:
description: Request to update a license.
properties:
object:
description: Represents a license in the system.
properties:
meta:
$ref: '#/components/schemas/v1Meta'
propagate:
description: Indicates that the object should be visible in child namespaces.
type: boolean
spec:
$ref: '#/components/schemas/v1LicenseSpec'
tenant_meta:
description: Licenses live in the system namespace.
title: Licenses live in the system namespace.
type: object
uuid:
description: The UUID of a license.
readOnly: true
type: string
type: object
request:
$ref: '#/components/schemas/v1UpdateRequest'
required:
- meta
- spec
type: object
v1ListLicenseResponse:
description: Response to the request to list licenses.
properties:
count_response:
$ref: '#/components/schemas/v1CountResponse'
group_response:
$ref: '#/components/schemas/v1GroupResponse'
list:
$ref: '#/components/schemas/v1ListLicenseResponseList'
type: object
LicenseServiceCreateLicenseBody:
description: Represents a license in the system.
properties:
meta:
$ref: '#/components/schemas/v1Meta'
propagate:
description: Indicates that the object should be visible in child namespaces.
type: boolean
spec:
$ref: '#/components/schemas/v1LicenseSpec'
tenant_meta:
description: Licenses live in the system namespace.
title: Licenses live in the system namespace.
type: object
uuid:
description: The UUID of a license.
readOnly: true
type: string
required:
- meta
- spec
type: object
v1ListResponse:
description: Response to a list request.
properties:
next_page_id:
description: The UUID of last message retrieved.
type: string
next_page_token:
description: Pagination token that can be used to retrieve the next page of results.
format: int32
type: integer
type: object
v1UpdateRequest:
description: Message used for all update requests.
properties:
force:
description: 'Force will force the update of the resource if any
checks fail.'
type: boolean
update_mask:
description: Fields to update. Defaults to all fields.
type: string
type: object
googleprotobufAny:
additionalProperties: {}
description: "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(&foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := &pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := &pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": <string>,\n \"lastName\": <string>\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }"
properties:
'@type':
description: "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics."
type: string
type: object
v1IndexData:
description: 'IndexData is used to index the resource for search. It''s an internal
object.'
properties:
data:
items:
type: string
readOnly: true
type: array
search_score:
description: search_score is the score of the resource for search. Internal use only.
format: float
readOnly: true
type: number
tenant:
readOnly: true
type: string
will_be_deleted_at:
description: Time that the resource will be deleted.
format: date-time
readOnly: true
type: string
type: object
v1GroupResponse:
description: Response to a list group request.
properties:
groups:
additionalProperties:
$ref: '#/components/schemas/GroupResponseGroupData'
description: 'Map indexed by values of the fields specified in aggregation_paths,
for example, {"[{"key":"meta.kind","value":"Project"}]": {
"aggregation_count": { "count": 1649 } } }.'
type: object
type: object
GroupResponseGroupData:
description: Information about objects matching the given key.
properties:
aggregation_count:
$ref: '#/components/schemas/v1CountResponse'
aggregation_uuids:
description: 'List of UUIDs of the objects in the group.
Only populated if show_aggregation_uuids is set.'
items:
type: string
type: array
aggregation_value:
$ref: '#/components/schemas/v1GroupAggregationValueResponse'
unique_counts:
additionalProperties:
$ref: '#/components/schemas/v1CountResponse'
description: 'Map of counts for the given unique_count_paths fields.
Only populated if unique_count_paths is set.'
type: object
unique_values:
additionalProperties:
items:
type: object
type: array
description: 'Map of values for the given unique_value_paths fields.
Only populated if unique_value_paths is set.'
type: object
type: object
v1GroupAggregationValueResponse:
description: 'GroupAggregationValueResponse returns the value of the aggregation if
requested.'
properties:
value:
format: float
type: number
type: object
endorv1License:
description: Represents a license in the system.
properties:
meta:
$ref: '#/components/schemas/v1Meta'
propagate:
description: Indicates that the object should be visible in child namespaces.
type: boolean
spec:
$ref: '#/components/schemas/v1LicenseSpec'
tenant_meta:
$ref: '#/components/schemas/v1TenantMeta'
uuid:
description: The UUID of a license.
readOnly: true
type: string
required:
- meta
- spec
type: object
googlerpcStatus:
description: 'The `Status` type defines a logical error model that is suitable for
different programming environments, including REST APIs and RPC APIs. It is
used by [gRPC](https://github.com/grpc). Each `Status` message contains
three pieces of data: error code, error message, and error details.
You can find out more about this error model and how to work with it in the
[API Design Guide](https://cloud.google.com/apis/design/errors).'
properties:
code:
description: 'The status code, which should be an enum value of
[google.rpc.Code][google.rpc.Code].'
format: int32
type: integer
details:
description: 'A list of messages that carry the error details. There is a common set of
message types for APIs to use.'
items:
$ref: '#/components/schemas/googleprotobufAny'
type: array
message:
description: 'A developer-facing error message, which should be in English. Any
user-facing error message should be localized and sent in the
[google.rpc.Status.details][google.rpc.Status.details] field, or localized
by the client.'
type: string
type: object
v1ListLicenseResponseList:
properties:
objects:
items:
$ref: '#/components/schemas/endorv1License'
type: array
response:
$ref: '#/components/schemas/v1ListResponse'
type: object
v1CountResponse:
description: Response to a list count request.
properties:
count:
description: Number of objects matching the given list parameters.
format: int32
type: integer
type: object
v1Meta:
description: Common fields for all Endor Labs resources.
properties:
annotations:
additionalProperties:
type: string
description: 'Annotations can be used to attach metadata to a resource message.
Annotation values can be small or large, structured or unstructured,
and may include characters not permitted by labels.
The keys may contain alphanumerics, underscores (_), dots (.) and dashes
(-). The values of an annotation must be 16384 bytes or smaller.'
type: object
create_time:
description: 'Time the resource was created.
Format: 2017-01-15T01:30:15.01Z
RFC 3339: https://www.ietf.org/rfc/rfc3339.txt.'
format: date-time
readOnly: true
type: string
created_by:
description: 'Name and authentication source of the user who created the object,
for example, ewok@endor.ai@google@api-key.'
readOnly: true
type: string
description:
description: Resource description. Must be less than 1024 bytes.
type: string
index_data:
$ref: '#/components/schemas/v1IndexData'
kind:
description: 'Resource kind, for example, HelloResponse.
Auto-generated using the protobuf message proto.MessageName().Name().'
readOnly: true
type: string
name:
description: Resource name. Must be 63 characters or less.
type: string
parent_kind:
description: Parent object resource kind, for example, Project.
type: string
parent_uuid:
description: Parent object UUID.
type: string
references:
additionalProperties:
$ref: '#/components/schemas/googleprotobufAny'
description: Map of objects referenced in a query API.
readOnly: true
type: object
tags:
description: 'List of tags attached to the resource.
Tags can be used to select objects and to find collections of objects that
satisfy certain conditions. A tag must be 255 characters or less.'
items:
type: string
type: array
update_time:
description: 'Time the resource was last updated.
Note: Updated on all create/patch/delete operations.
Format: 2017-01-15T01:30:15.01Z
RFC 3339: https://www.ietf.org/rfc/rfc3339.txt.'
format: date-time
readOnly: true
type: string
updated_by:
description: 'Name and authentication source of the last user who updated the object,
for example, vulnerabilityingestor@endor.ai@x509.'
readOnly: true
type: string
upsert_time:
description: 'Time the resource was last upserted.
Note:
create_time is only set the first time the resource is created.
upsert_time is set every time the resource is upseted.
Format: 2017-01-15T01:30:15.01Z
RFC 3339: https://www.ietf.org/rfc/rfc3339.txt.'
format: date-time
readOnly: true
type: string
version:
description: Message version.
readOnly: true
type: string
required:
- name
type: object
v1LicenseSpec:
description: Specification mostly follows the SPDX data format.
properties:
additional_info:
description: Links to additional information.
items:
type: string
type: array
category:
type: string
is_deprecated:
type: boolean
is_osi_approved:
type: boolean
license_id:
type: string
license_name:
type: string
license_text:
type: string
short_name:
type: string
required:
- license_id
- license_name
- license_text
type: object
v1TenantMeta:
description: Tenant related data for the tenant containing the resource.
properties:
namespace:
description: 'Namespaces are a way to organize organizational units into virtual
groupings of resources. Namespaces must be a fully qualified name,
for example, the child namespace of namespace "endor.prod" called "app"
is called "endor.prod.app".'
type: string
required:
- namespace
type: object
x-provenance:
method: harvested
publisher: Endor Labs
source: https://docs.endorlabs.com/api-reference/openapi.full.v3.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)