Understand Catalog YAML
Understand the basics of Catalog YAML.
Harness IDP marks a significant evolution of the Internal Developer Portal, introducing a Harness-native data model tailored for enterprise-scale environments and strong access control. Going forward, only the Harness-native data model schema will be used and referenced. This guide walks you through the new Harness-native YAML schema and outlines the key changes from the previous schema.
Quick reference: Entity YAML examples
What is new in IDP?
IDP implements a Harness-native entity schema featuring targeted adjustments to previous Backstage-style YAML configurations. These changes primarily introduce scope concepts (project, organization, or account) while enhancing readability based on user feedback.
JSON Schemas for all Catalog entities are available through our API.
⨁ New fields
orgIdentifier(optional)projectIdentifier(optional)
These fields define the entity's scope. For project-scoped entities, both fields will be present. For organization-scoped entities, only orgIdentifier will appear. Account-level entities will have the scope automatically assigned to the account.
♻️ Updated fields
metadata.namebecomesidentifierThis aligns with Harness Entity YAML definitions and enhances UX consistency. Moved to root level due to its importance to entity definition.
metadata.titlebecomesnameAligned with Harness Entity YAML definitions and moved to root level to reflect its critical importance.
spec.typebecomestypeRelocated to root level as it is fundamental to entity definition. The
kindandtypefields define entity behavior and should appear together.
spec.ownerbecomesownerMoved to root level to emphasize its significance. IDP Catalog addresses ownership challenges, warranting prominent placement of this field.
⊖ Removed fields
metadata.namespacePreviously used in Backstage for scoping (typically set as default). With the introduction of Harness Platform Hierarchy,
namespacebecomes redundant. Scope is now determined usingprojectIdentifierandorgIdentifier.
spec.systemandspec.domainThese fields previously helped organize components within systems. Since entities will now exist within Harness projects and organizations, these structures will replace System and Domain functionality.
Unchanged fields
metadatacontinues to be flexible. You can define your own properties within metadata.annotations,description,tags,links,labelsetc. continue to be part of metadata.
Common to all kinds: The envelope
The root object of your Catalog YAML file follows a standard structure. Below are the core properties that can be included in your Catalog YAML, as defined in IDP:
apiVersion
The apiVersion field specifies the version of the specification format that the entity conforms to. It plays a critical role in ensuring compatibility and evolution of the entity schema over time. This field is mandatory for every entity definition, as it allows the parser to correctly interpret the structure and content of the entity.
With IDP, we have introduced a Harness-native entity schema. As part of this change, all entities now use an apiVersion prefixed with harness.io/.
Use the following default value for your catalog entities:
kind
The kind field defines the high-level type of entity being described in the YAML file. When combined with apiVersion, it helps the parser understand how to interpret the rest of the entity’s structure and behavior. This field is also mandatory for every entity definition.
With IDP, you can define the following kind types in your Catalog YAML:
kind: Componentkind: APIkind: Resourcekind: Workflowkind: Systemkind: Group
Each kind represents a different type of entity within the Harness-native data model. Read more about the different entity kinds here.
identifier
The identifier field is a unique, machine-readable reference for the entity. It serves as the primary key for identifying and interacting with the entity. Ensure your identifier follows naming rules. Invalid identifiers may lead to entity registration errors.
Property
Description
Uniqueness
Must be unique per kind (case-sensitive).
Required
✅ Yes, this field is mandatory for all entities.
This field can be reused after an entity is deleted. It must adhere to the format defined in the identifier naming rules.
All entity references across the platform use the identifier.
Example usage:
name
The name field represents the display name of the entity shown in the UI.
Property
Description
Uniqueness
Not required to be unique.
Required
❌ No, this field is optional.
This field supports explanatory or user-friendly strings and may contain special characters.
Example usage:
type
The type field represents the type of entity (e.g., website, service, library, API, etc). The kind and type fields together define entity behavior and should always appear together.
While the catalog accepts any string value here, organizations should maintain a consistent taxonomy. Common examples include:
service- a backend API servicewebsite- a frontend web applicationlibrary- a reusable software component (e.g., npm module, Java library)
Example usage:
projectIdentifier
In IDP, legacy System entities are now mapped to Harness Projects. Thus the projectIdentifier field indicates which project the entity belongs to. It is optional for Org or Account-scope entities, but required for those created at the Project scope.
Example usage:
orgIdentifier
In IDP, legacy Domain entities are now mapped to Harness Orgs. Thus the field orgIdentifier indicates which Org the entity belongs to.
Example usage:
owner
The owner field indicates the owner of that entity and maps to Harness Users or Teams depending on the scope.
While owner is not mandatory, it is strongly recommended to associate entities with logical owning teams.
At Project scope: any User or Team from Project, Org, or Account can be assigned.
At Org scope: assign Users or Teams from Org or Account.
At Account scope: assign from Account-level only.
The spec.owner field supports multiple formats for defining ownership:
You can use a plain value like
backend-team. This is treated as a group by default. If no matching group is found, it is still accepted and displayed as an arbitrary string without validation.For explicit user or group references, use one of the following formats:
user:<scope>/<email-or-username>group:<scope>/<group-name>
Supported scope formats:
accountaccount.<orgIdentifier>account.<orgIdentifier>.<projectIdentifier>
Owner resolution is case-sensitive. Make sure the casing in your reference exactly matches the group names as defined in your account.
In cases where reliable resolution is critical, consider using the user group ID instead of just the name to avoid ambiguity.
metadata
A container for auxiliary data that is not part of the entity’s specification. Additional metadata helps enhance platform-level processing or categorization. See individual entity kind sections for specific structure guidelines.
Go to the metadata descriptor format to learn more.
spec
Defines the actual specification data that describes the entity. This is the core configuration and varies depending on the kind. See individual entity kind sections for specific structure guidelines.
Entity kinds
Kind: Component
A Component describes a software component. It is typically closely tied to the source code that constitutes the component and is what a developer would typically consider a “unit of software,” usually with a distinct deployable or linkable artifact.
Entity structure
All the fields mentioned below are the mandatory parameters required to define a Component:
Field
Value
apiVersion
harness.io/v1
kind
Component
type
You can find out more about the type key here.
spec.lifecycle
You can find out more about the lifecycle key here.
spec.system
Optional. Reference to System entities this Component belongs to.
Example YAML
Kind: System
A System is a high-level catalog entity used to logically group related software components, APIs, and infrastructure resources. It represents a functional or domain-specific boundary such as a module, platform area, or business unit, enabling teams to organize and manage complex software ecosystems more effectively.
Entity structure
All the fields mentioned below are the mandatory parameters required to define a System:
Field
Value
apiVersion
harness.io/v1
kind
System
type
Common values include domain, module, or platform
owner
The team or group responsible for the System
Example YAML
Kind: API
An API describes an interface that can be exposed by a component. APIs can be defined using formats such as OpenAPI, AsyncAPI, GraphQL, gRPC, or others. For type: openapi entities, Harness IDP automatically extracts individual endpoints from the spec and stores them in Ingested Properties, where they can be enriched with custom metadata. See API endpoint extraction and enrichment.
Entity structure
All the fields mentioned below are the mandatory parameters required to define an API:
Field
Value
apiVersion
harness.io/v1
kind
API
type
You can find out more about the type key here.
spec.lifecycle
You can find out more about the lifecycle key here.
spec.definition
You can find out more about the definition key here.
type definition
The type of the API definition as a string (e.g., openapi):
openapi– A definition in YAML or JSON based on OpenAPI v2 or v3.asyncapi– A definition based on the AsyncAPI specification.graphql– A definition using GraphQL schemas.grpc– A definition based on Protocol Buffers for use with gRPC.
Example YAML
Kind: Resource
A Resource describes infrastructure components that a system needs to operate, like BigTable databases, Pub/Sub topics, S3 buckets, or CDNs. Modeling them alongside components and systems helps visualize infrastructure footprint and enables tooling around them.
Entity structure
All the fields mentioned below are the mandatory parameters required to define a Resource:
Field
Value
apiVersion
harness.io/v1
kind
Resource
type
You can find out more about the type key here.
type definition
The type of the Resource as a string (e.g., database). This field is required. There is no enforced list of values; each organization can define names that suit their tech stack.
Common examples include:
databases3-bucketkubernetes-cluster
Example YAML
Kind: Group
Group entities back the Teams you see in the Catalog and in the Teams page. They let you model your organization inside IDP, including squads, departments, and cross-functional units, and they can be marked as the owner of other catalog entities.
Set type to team for a standard Team. Go to Creating a Team for the create flow and the full field reference.
Entity structure
All the fields mentioned below are the parameters required to define a Group:
Field
Value
apiVersion
harness.io/v1
kind
Group
name
Human-readable name for the group
identifier
Unique identifier for the group
type
Common values include team, squad, department
Special spec fields
Field
Description
spec.members
List of users belonging to the group
spec.parent
Reference to a parent group, enabling hierarchy
spec.profile
Additional profile information like email
Example YAML
Kind: Workflow
Workflows enable developer self-service by automating manual tasks and processes. Platform engineering teams can use workflows to:
Automate new service onboarding
Simplify Day 2 operations
Provide developers with golden paths to production, including best practices and guardrails
Workflows are stored in the catalog using kind: Workflow.
Entity structure
All the fields mentioned below are the mandatory parameters required to define a Workflow:
Field
Value
apiVersion
harness.io/v1
kind
Workflow
type
You can find out more about the type key here.
spec.parameters
You can find out more about the parameters key here.
spec.steps
You can find out more about the steps key here.
Example YAML
[Deprecated] kind: Location
The Location entity served as a reference to a YAML path that produced other entities. However, with Harness IDP managing all entities internally, this entity type is no longer required and has been deprecated.
Placeholder resolution
Harness IDP supports substitutions and placeholder resolutions in Catalog entity YAMLs using $text, $json, and $yaml. These placeholders let you dynamically reference and embed external content into your entity YAML definitions.
Placeholders like $json: https://example.com/entity.json are substituted by the content of the referenced file. You can reference files using either an absolute URL or a relative reference:
Absolute URL: If an absolute URL is provided (for example,
https://example.com/entity.yaml), Harness IDP fetches and resolves the content directly from that location.Relative Reference: If a relative path is provided (for example,
./referenced.yaml), it is resolved relative to thebackstage-source-locationof the entity YAML file where the placeholder is defined. In practice, this means the path is evaluated from the directory containing the entity YAML file associated with thatbackstage-source-location.
Harness IDP supports three placeholder types:
$text: Interprets the referenced file as plain text and embeds it as a string.$json: Interprets the referenced file as JSON and embeds the parsed structure.$yaml: Interprets the referenced file as YAML and embeds the parsed structure.
Implementation
For Catalog entities, place the placeholder directly under spec.definition. Choose the placeholder type that matches the format of your need. For example, use $text if you want to embed the raw OpenAPI/Swagger content as a string, or $yaml or $json if you want the referenced file parsed and embedded as structured data.
Example
Load the definition of an API entity from the web and embed it as a string in spec.definition:
With an absolute URL, Harness IDP resolves content from the given location.
With a relative path (e.g.,
./swagger.json), Harness IDP resolves it relative to the entity YAML file’sbackstage-source-location.
Last updated
Was this helpful?