ConfigHub · Schema

Link

Link connects two config Units in a dependency / producer-consumer relationship. A Link indicates that selected config data from the upstream To Unit (the producer) should be propagated to the downstream From Unit (the consumer). Links must be created in the same Space as the From Unit.

CompanyConfigurationDevOpsKubernetesGitOpsPlatform

Properties

Name Type Description
Annotations object An optional map of Annotation key/value pairs for tools to attach information to entities.
AutoUpdate boolean Automatically update the downstream Unit when the upstream Unit changes. A Link created without an UpdateType is a NeedsProvides Link with AutoUpdate set, which is what such a Link has always done.
BackingUnitID string
Bindings object The needs/provides attribute bindings resolution found for this Link and keeps up to date: one for each needed attribute of the downstream Unit it matched with an attribute the upstream Unit provides.
Clearance object
CreatedAt string The timestamp when the entity was created in "2023-01-01T12:00:00Z" format.
DeleteGates object An optional set of gates that, if any is present, will block deletion.
DisplayName string Friendly name for the entity.
DownstreamLastMergedRevisionNum integer The sequence number of the revision of the downstream unit created by the last merge.
DownstreamPaths array Values to write to the downstream Unit when resolving a TransformPaths Link. Each entry evaluates Expression (a Go template or CEL expression, per Evaluator) with the named upstream values (UpstreamPa
DownstreamSetters array Mutating function invocations to run on the downstream Unit. String arguments are template-expanded using the upstream values listed in Parameters (plus Space/Unit metadata) in scope. Each function mu
EntityType string The type of entity.
FromUnitID string Unique identifier of the downstream (consumer) Unit. Links must be in the same space as the source unit.
Guards object Guards to record on the paths this link's resolve writes, naming the reasons those paths hold what they hold, so a later operation must be cleared for them before overwriting. Sibling to Protect: Prot
Hash string SHA256 hash of the resolution-relevant Link fields, used to detect changes that require re-resolution.
HiddenReason string The reason the entity is hidden, if it is. A hidden entity is left out of List and Search results, and of what bulk operations act on, unless the include_hidden parameter names its reason or is *, or
Labels object An optional map of Label key/value pairs to specify identifying attributes of entities for the purpose of grouping and filtering them.
LinkID string Unique identifier for a Link.
ManualBindings object The needs/provides attribute bindings stated for this Link, which resolution uses as they are. Each Binding maps one needed attribute in the downstream Unit to one provided attribute in the upstream U
MergeEnableSubtraction boolean Enables the subtraction (override-preservation) step of the merge performed when resolving this Link. When false (the default), the source patch is applied without subtraction and the downstream Unit'
OrganizationID string Unique identifier for an organization.
Permissions object Permissions to access this link.
Protect boolean Records the paths this Link's resolve writes as protected local overrides, so a later merge from upstream does not overwrite them. Without it the resolve claims nothing, as any other change does. Refu
Slug string Unique URL-safe identifier for the entity.
SpaceID string Unique identifier for a space.
SpaceSlug string Slug of the Space this entity belongs to. (readonly)
Squash boolean Merge this Link's range as one rebased diff in one Revision instead of walking it. By default a resolve replays the source's recorded function invocations against this Unit where they can be re-execut
Stale boolean The upstream Unit has finished a change this Link has not taken: its head Revision is past UpstreamLastMergedRevisionNum and it is not partway through a ChangeSet, whose Revisions are a prefix of a ch
ToSpaceID string Unique identifier of the Space of the upstream Unit.
ToUnitID string Unique identifier of the upstream (producer) Unit.
TransformInvocationID string Identifier of an Invocation whose function is executed on the upstream Unit's data before the result is inserted into or upserted into the downstream Unit. Only valid when UpdateType is Insert or Upse
UpdateType string The ConfigHub operation performed using this Link. Valid values are NeedsProvides, MergeUnits, UpgradeUnit, None, Insert, Upsert, and TransformPaths. A create that omits it gets NeedsProvides with Aut
UpdatedAt string The timestamp when the entity was last updated in "2023-01-01T12:00:00Z" format.
UpstreamGetters array Getter function invocations whose first AttributeValue Value is exposed to DownstreamPaths expressions and DownstreamSetters argument templates by Name, alongside UpstreamPaths. Each function must be
UpstreamLastMergedRevisionNum integer The RevisionNum of the last merged upstream revision.
UpstreamLinkID string Link ID of the link this link was cloned from (if any).
UpstreamPaths array Values to read from the upstream Unit when resolving a TransformPaths Link. Each NamedPath is read via get-paths and made available to DownstreamPaths expressions by its Name. Only valid when UpdateTy
UpstreamSpaceID string Space ID of the link this link was cloned from (if any).
Version integer An entity-specific sequence number used for optimistic concurrency control. The value read must be sent in calls to Update.
WhereMutation string Where expression selecting Mutations of the downstream Unit whose paths this Link's merges must not overwrite. Unioned with the Protected values stored on the downstream Unit's MutationSources, so it
WhereResource string Where expression used to select which resources of the upstream Unit should be eligible for propagation to the downstream Unit.
View JSON Schema on GitHub

JSON Schema

confighub-link-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/confighub/json-schema/confighub-link-schema.json",
  "title": "Link",
  "description": "Link connects two config Units in a dependency / producer-consumer relationship.\nA Link indicates that selected config data from the upstream To Unit (the producer)\nshould be propagated to the downstream From Unit (the consumer).\nLinks must be created in the same Space as the From Unit.",
  "x-generated": "2026-10-29",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/confighub-openapi.json#/components/schemas/Link",
  "required": [
    "Slug",
    "FromUnitID",
    "ToUnitID"
  ],
  "type": "object",
  "properties": {
    "Annotations": {
      "type": "object",
      "additionalProperties": {
        "maxLength": 1024,
        "pattern": "^(.|\\n)*$",
        "type": "string"
      },
      "description": "An optional map of Annotation key/value pairs for tools to attach information to entities.",
      "x-confighub-where": {
        "dataType": "map[string]string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "AutoUpdate": {
      "type": "boolean",
      "description": "Automatically update the downstream Unit when the upstream Unit changes. A Link created without an UpdateType is a NeedsProvides Link with AutoUpdate set, which is what such a Link has always done.",
      "x-confighub-where": {
        "dataType": "bool"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "BackingUnitID": {
      "type": "string",
      "format": "uuid",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Unit"
      }
    },
    "Bindings": {
      "allOf": [
        {
          "$ref": "#/$defs/BindingList"
        }
      ],
      "description": "The needs/provides attribute bindings resolution found for this Link and keeps up to date: one for each needed attribute of the downstream Unit it matched with an attribute the upstream Unit provides. Set by the server, and rebuilt by each resolve. A needed attribute that a binding in ManualBindings names is not matched again.",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "JSON"
      }
    },
    "Clearance": {
      "$ref": "#/$defs/Clearance"
    },
    "CreatedAt": {
      "type": "string",
      "description": "The timestamp when the entity was created in \"2023-01-01T12:00:00Z\" format.",
      "format": "date-time",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "time"
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "DeleteGates": {
      "type": "object",
      "additionalProperties": {
        "type": "boolean"
      },
      "description": "An optional set of gates that, if any is present, will block deletion.",
      "x-confighub-where": {
        "dataType": "map[string]bool"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "DisplayName": {
      "type": "string",
      "description": "Friendly name for the entity.",
      "x-confighub-where": {
        "dataType": "string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "DownstreamLastMergedRevisionNum": {
      "type": "integer",
      "description": "The sequence number of the revision of the downstream unit created by the last merge.",
      "format": "int64",
      "x-confighub-where": {
        "dataType": "int"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "DownstreamPaths": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/PathExpression"
      },
      "description": "Values to write to the downstream Unit when resolving a TransformPaths Link. Each entry evaluates Expression (a Go template or CEL expression, per Evaluator) with the named upstream values (UpstreamPaths and UpstreamGetters) and Space/Unit metadata in scope, coerces the result to DataType, and writes it via set-attributes. Only valid when UpdateType is TransformPaths.",
      "x-confighub-where": {
        "dataType": "JSON"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "DownstreamSetters": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/ParameterizedFunction"
      },
      "description": "Mutating function invocations to run on the downstream Unit. String arguments are template-expanded using the upstream values listed in Parameters (plus Space/Unit metadata) in scope. Each function must be mutating. Worker functions are not supported. Only valid when UpdateType is TransformPaths.",
      "x-confighub-where": {
        "dataType": "JSON"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "EntityType": {
      "type": "string",
      "description": "The type of entity.",
      "readOnly": true,
      "x-go-type-skip-optional-pointer": true
    },
    "FromUnitID": {
      "type": "string",
      "description": "Unique identifier of the downstream (consumer) Unit. Links must be in the same space as the source unit.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Unit",
        "expandable": true
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "Guards": {
      "allOf": [
        {
          "$ref": "#/$defs/GuardStamp"
        }
      ],
      "description": "Guards to record on the paths this link's resolve writes, naming the reasons those paths hold what they hold, so a later operation must be cleared for them before overwriting. Sibling to Protect: Protect claims the paths, Guards say why. Add and overwrite only -- retiring a guard is the /guard API (cub unit set-guard --remove-guard). Refused on UpgradeUnit and MergeUnits links, whose guards arrive by propagation from upstream.",
      "x-confighub-where": {
        "dataType": "map[string]string"
      }
    },
    "Hash": {
      "type": "string",
      "description": "SHA256 hash of the resolution-relevant Link fields, used to detect changes that require re-resolution.",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "HiddenReason": {
      "maxLength": 64,
      "pattern": "^([A-Za-z0-9]([\\-_.A-Za-z0-9]*[A-Za-z0-9])?)?$",
      "type": "string",
      "description": "The reason the entity is hidden, if it is. A hidden entity is left out of List and Search results, and of what bulk operations act on, unless the include_hidden parameter names its reason or is *, or the where parameter names the entity by Slug or ID. ConfigHub/YAML Units are created hidden with the reason BackingUnit unless given another.",
      "x-confighub-where": {
        "dataType": "string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "Labels": {
      "type": "object",
      "additionalProperties": {
        "maxLength": 128,
        "pattern": "^[\\-_@/#$%&~+=!?.,:;(){}\\[\\]<>|A-Za-z0-9](([\\-_@/#$%&~+=!?.,:;(){}\\[\\]<>|A-Za-z0-9]| )*[\\-_@/#$%&~+=!?.,:;(){}\\[\\]<>|A-Za-z0-9])?$",
        "type": "string"
      },
      "description": "An optional map of Label key/value pairs to specify identifying attributes of entities for the purpose of grouping and filtering them.",
      "x-confighub-where": {
        "dataType": "map[string]string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "LinkID": {
      "type": "string",
      "description": "Unique identifier for a Link.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid"
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "ManualBindings": {
      "allOf": [
        {
          "$ref": "#/$defs/BindingList"
        }
      ],
      "description": "The needs/provides attribute bindings stated for this Link, which resolution uses as they are. Each Binding maps one needed attribute in the downstream Unit to one provided attribute in the upstream Unit. An Insert Link has exactly one, which identifies only the needed attribute (NeededResource and NeededPath) and whose DataType selects how the upstream Unit is inserted: string, the default, inserts it verbatim as text; the downstream Unit's own configuration format inserts it as configuration data.",
      "x-confighub-where": {
        "dataType": "JSON"
      }
    },
    "MergeEnableSubtraction": {
      "type": "boolean",
      "description": "Enables the subtraction (override-preservation) step of the merge performed when resolving this Link. When false (the default), the source patch is applied without subtraction and the downstream Unit's local differences are preserved by the stored Mutation Protected values alone, widened by WhereMutation if it is set. When true, the merge additionally subtracts the downstream Unit's local differences from the source patch and the stored values are not consulted. Only meaningful for UpgradeUnit and MergeUnits Links.",
      "x-confighub-where": {
        "dataType": "bool"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "OrganizationID": {
      "type": "string",
      "description": "Unique identifier for an organization.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Organization",
        "expandable": true
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "Permissions": {
      "allOf": [
        {
          "$ref": "#/$defs/Permissions"
        }
      ],
      "description": "Permissions to access this link.",
      "x-confighub-where": {
        "dataType": "map[string]map[string]map[uuid]bool"
      }
    },
    "Protect": {
      "type": "boolean",
      "description": "Records the paths this Link's resolve writes as protected local overrides, so a later merge from upstream does not overwrite them. Without it the resolve claims nothing, as any other change does. Refused on UpgradeUnit and MergeUnits Links, where the upstream keeps updating what it delivered and protecting that content would freeze the downstream one merge in.",
      "x-confighub-where": {
        "dataType": "bool"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "Slug": {
      "maxLength": 128,
      "pattern": "^[A-Za-z0-9]([\\-_.A-Za-z0-9]*[A-Za-z0-9])?$",
      "type": "string",
      "description": "Unique URL-safe identifier for the entity.",
      "x-confighub-where": {
        "dataType": "string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "SpaceID": {
      "type": "string",
      "description": "Unique identifier for a space.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Space",
        "expandable": true
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "SpaceSlug": {
      "type": "string",
      "description": "Slug of the Space this entity belongs to. (readonly)",
      "readOnly": true,
      "x-go-type-skip-optional-pointer": true
    },
    "Squash": {
      "type": "boolean",
      "description": "Merge this Link's range as one rebased diff in one Revision instead of walking it. By default a resolve replays the source's recorded function invocations against this Unit where they can be re-executed, and records each source Revision that has an effect as a Revision of its own. Only meaningful for UpgradeUnit and MergeUnits Links, which are the ones with a range to walk.",
      "x-confighub-where": {
        "dataType": "bool"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "Stale": {
      "type": "boolean",
      "description": "The upstream Unit has finished a change this Link has not taken: its head Revision is past UpstreamLastMergedRevisionNum and it is not partway through a ChangeSet, whose Revisions are a prefix of a change nobody can take yet. Most useful on a Link with AutoUpdate false, which is otherwise unchanged by anything its upstream does; on an AutoUpdate Link it is transient, and stays set when a resolve fails.",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "bool"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "ToSpaceID": {
      "type": "string",
      "description": "Unique identifier of the Space of the upstream Unit.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Space",
        "expandable": true
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "ToUnitID": {
      "type": "string",
      "description": "Unique identifier of the upstream (producer) Unit.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Unit",
        "expandable": true
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "TransformInvocationID": {
      "type": "string",
      "description": "Identifier of an Invocation whose function is executed on the upstream Unit's data before the result is inserted into or upserted into the downstream Unit. Only valid when UpdateType is Insert or Upsert. The Invocation's ToolchainType must match the upstream Unit's ToolchainType, the function must be non-mutating, and its OutputType must be YAML. For Upsert the output must also match the downstream Unit's toolchain, which currently limits it to Kubernetes/YAML.",
      "format": "uuid",
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Invocation",
        "expandable": true
      }
    },
    "UpdateType": {
      "type": "string",
      "description": "The ConfigHub operation performed using this Link. Valid values are NeedsProvides, MergeUnits, UpgradeUnit, None, Insert, Upsert, and TransformPaths. A create that omits it gets NeedsProvides with AutoUpdate set, which is what omitting it has always produced. UpgradeUnit is like MergeUnits but also keeps the downstream unit's UpstreamRevision fields in sync. Upsert pulls one or more resources produced by the upstream Unit (optionally through a TransformInvocation) and inserts or replaces them in the downstream Unit. TransformPaths reads values from the upstream Unit (UpstreamPaths) and writes expression-derived values to the downstream Unit (DownstreamPaths). Immutable.",
      "x-confighub-where": {
        "dataType": "string"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "UpdatedAt": {
      "type": "string",
      "description": "The timestamp when the entity was last updated in \"2023-01-01T12:00:00Z\" format.",
      "format": "date-time",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "time"
      },
      "x-go-type-skip-optional-pointer": true,
      "x-omitzero": true
    },
    "UpstreamGetters": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/NamedFunctionResult"
      },
      "description": "Getter function invocations whose first AttributeValue Value is exposed to DownstreamPaths expressions and DownstreamSetters argument templates by Name, alongside UpstreamPaths. Each function must be non-mutating and produce OutputTypeAttributeValueList. Worker functions are not supported. Only valid when UpdateType is TransformPaths.",
      "x-confighub-where": {
        "dataType": "JSON"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "UpstreamLastMergedRevisionNum": {
      "type": "integer",
      "description": "The RevisionNum of the last merged upstream revision.",
      "format": "int64",
      "x-confighub-where": {
        "dataType": "int"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "UpstreamLinkID": {
      "type": "string",
      "description": "Link ID of the link this link was cloned from (if any).",
      "format": "uuid",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Link"
      }
    },
    "UpstreamPaths": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/NamedPath"
      },
      "description": "Values to read from the upstream Unit when resolving a TransformPaths Link. Each NamedPath is read via get-paths and made available to DownstreamPaths expressions by its Name. Only valid when UpdateType is TransformPaths.",
      "x-confighub-where": {
        "dataType": "JSON"
      },
      "x-go-type-skip-optional-pointer": true
    },
    "UpstreamSpaceID": {
      "type": "string",
      "description": "Space ID of the link this link was cloned from (if any).",
      "format": "uuid",
      "readOnly": true,
      "x-confighub-where": {
        "dataType": "uuid",
        "references": "Space"
      }
    },
    "Version": {
      "type": "integer",
      "description": "An entity-specific sequence number used for optimistic concurrency control. The value read must be sent in calls to Update.",
      "format": "int64",
      "readOnly": false,
      "x-go-type-skip-optional-pointer": true
    },
    "WhereMutation": {
      "type": "string",
      "description": "Where expression selecting Mutations of the downstream Unit whose paths this Link's merges must not overwrite. Unioned with the Protected values stored on the downstream Unit's MutationSources, so it protects further paths and never re-opens one the Unit already claimed.",
      "x-go-type-skip-optional-pointer": true
    },
    "WhereResource": {
      "type": "string",
      "description": "Where expression used to select which resources of the upstream Unit should be eligible for propagation to the downstream Unit.",
      "x-go-type-skip-optional-pointer": true
    }
  },
  "x-confighub-where": {
    "Clearance": {
      "dataType": "JSON"
    }
  },
  "$defs": {
    "Binding": {
      "type": "object",
      "properties": {
        "AttributeName": {
          "type": "string",
          "description": "Shared attribute name that matched the need to the provide",
          "x-go-type-skip-optional-pointer": true
        },
        "DataType": {
          "type": "string",
          "description": "DataType of the bound value",
          "x-go-type-skip-optional-pointer": true
        },
        "Key": {
          "type": "string",
          "description": "Identifies a binding within its Link's ManualBindings, so that a merge of two versions of the Link matches bindings by Key rather than by position. Optional, and unique within the list when present. Letters, digits, '-' and '_', starting with a letter or digit; at most 128 characters.",
          "x-go-type-skip-optional-pointer": true
        },
        "NeededPath": {
          "type": "string",
          "description": "Resolved path within the needed resource",
          "x-go-type-skip-optional-pointer": true
        },
        "NeededResource": {
          "allOf": [
            {
              "$ref": "#/$defs/ResourceInfo"
            }
          ],
          "description": "Resource in the downstream unit that needs the value"
        },
        "ProvidedPath": {
          "type": "string",
          "description": "Resolved path within the provided resource",
          "x-go-type-skip-optional-pointer": true
        },
        "ProvidedResource": {
          "allOf": [
            {
              "$ref": "#/$defs/ResourceInfo"
            }
          ],
          "description": "Resource in the upstream unit that provides the value"
        }
      }
    },
    "BindingList": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/Binding"
      }
    },
    "Clearance": {
      "type": "array",
      "items": {
        "$ref": "#/$defs/ClearanceRequirement"
      }
    },
    "ClearanceRequirement": {
      "type": "object",
      "properties": {
        "Key": {
          "type": "string",
          "description": "The guard key this requirement is about",
          "x-go-type-skip-optional-pointer": true
        },
        "Operator": {
          "type": "string",
          "description": "Exists, In, NotIn, or DoesNotExist",
          "x-go-type-skip-optional-pointer": true
        },
        "Values": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The values In and NotIn compare against; unused by Exists and DoesNotExist",
          "x-go-type-skip-optional-pointer": true
        }
      }
    },
    "FunctionArgument": {
      "type": "object",
      "properties": {
        "Evaluator": {
          "type": "string"
        },
        "ParameterName": {
          "type": "string"
        },
        "Value": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "integer",
              "format": "int64"
            },
            {
              "type": "boolean"
            }
          ]
        }
      }
    },
    "FunctionInvocation": {
      "type": "object",
      "properties": {
        "Arguments": {
          "type": [
            "array",
            "null"
          ],
          "items": {
            "$ref": "#/$defs/FunctionArgument"
          },
          "description": "Function arguments",
          "x-go-type-skip-optional-pointer": true
        },
        "Clearance": {
          "allOf": [
            {
              "$ref": "#/$defs/Clearance"
            }
          ],
          "description": "Classes of guarded reason this invocation is cleared for; combined by union with the clearance of whatever drove the execution"
        },
        "FunctionName": {
          "type": "string",
          "description": "Function name",
          "x-go-type-skip-optional-pointer": true
        },
        "Guards": {
          "allOf": [
            {
              "$ref": "#/$defs/GuardStamp"
            }
          ],
          "description": "Guards to record on the paths this invocation writes, so a later operation must be cleared for them; combined with the guards of whatever drove the execution, later winning per key"
        },
        "Params": {
          "type": "object",
          "additionalProperties": {},
          "description": "Caller-supplied parameter values for expanding templated argument Values; transient, not persisted",
          "x-go-type-skip-optional-pointer": true
        },
        "WhereResource": {
          "type": "string",
          "description": "Per-invocation resource filter. AND-combined with the request-level WhereResource. Same path syntax as the request-level field (see ParseAndValidateWhereResource).",
          "x-go-type-skip-optional-pointer": true
        }
      }
    },
    "GuardStamp": {
      "type": "object",
      "additionalProperties": {
        "type": "string"
      }
    },
    "NamedFunctionResult": {
      "type": "object",
      "properties": {
        "FunctionInvocation": {
          "allOf": [
            {
              "$ref": "#/$defs/FunctionInvocation"
            }
          ],
          "description": "Non-mutating function invocation that produces OutputTypeAttributeValueList. The Value of the first returned AttributeValue is bound to Name. Worker functions are not supported."
        },
        "Name": {
          "type": "string",
          "description": "Identifier used to reference the value; must be a legal Go and CEL identifier and unique across UpstreamPaths and UpstreamGetters",
          "x-go-type-skip-optional-pointer": true
        }
      }
    },
    "NamedPath": {
      "type": "object",
      "properties": {
        "Name": {
          "type": "string",
          "description": "Identifier used to reference the value from a DownstreamPath Expression; must be a legal Go and CEL identifier",
          "x-go-type-skip-optional-pointer": true
        },
        "Path": {
          "type": "string",
          "description": "Resolved path within Resource to read via get-paths",
          "x-go-type-skip-optional-pointer": true
        },
        "Resource": {
          "allOf": [
            {
              "$ref": "#/$defs/ResourceInfo"
            }
          ],
          "description": "Resource in the upstream Unit that contains Path"
        }
      }
    },
    "ParameterizedFunction": {
      "type": "object",
      "properties": {
        "FunctionInvocation": {
          "allOf": [
            {
              "$ref": "#/$defs/FunctionInvocation"
            }
          ],
          "description": "Mutating function invocation to run on the downstream Unit. Worker functions are not supported."
        },
        "Key": {
          "type": "string",
          "description": "Identifies the entry within DownstreamSetters, so that a merge of two versions of the Link matches entries by Key rather than by position. Optional, and unique within the list when present. Letters, digits, '-' and '_', starting with a letter or digit; at most 128 characters.",
          "x-go-type-skip-optional-pointer": true
        },
        "Parameters": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Names of upstream values whose values are exposed to string-argument template expansion. Each entry must match a Name in UpstreamPaths or UpstreamGetters.",
          "x-go-type-skip-optional-pointer": true
        }
      }
    },
    "PathExpression": {
      "type": "object",
      "properties": {
        "DataType": {
          "type": "string",
          "description": "Data type of the resulting AttributeValue: string, int, or bool. The Expression result (a string) is coerced to this type.",
          "x-go-type-skip-optional-pointer": true
        },
        "Evaluator": {
          "type": "string",
          "description": "Expression evaluator: \"template\" for Go templates or \"cel\" for CEL",
          "x-go-type-skip-optional-pointer": true
        },
        "Expression": {
          "type": "string",
          "description": "Go template or CEL expression that evaluates to the value to write. Parameters and FunctionContext fields are in scope.",
          "x-go-type-skip-optional-pointer": true
        },
        "Key": {
          "type": "string",
          "description": "Identifies the entry within DownstreamPaths, so that a merge of two versions of the Link matches entries by Key rather than by position. Optional, and unique within the list when present. Letters, digits, '-' and '_', starting with a letter or digit; at most 128 characters.",
          "x-go-type-skip-optional-pointer": true
        },
        "Parameters": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Names of upstream values referenced by Expression. Each entry must be a legal identifier and must match a Name in UpstreamPaths or UpstreamGetters.",
          "x-go-type-skip-optional-pointer": true
        },
        "Path": {
          "type": "string",
          "description": "Unresolved path within Resource to write via set-attributes",
          "x-go-type-skip-optional-pointer": true
        },
        "Resource": {
          "allOf": [
            {
              "$ref": "#/$defs/ResourceInfo"
            }
          ],
          "description": "Resource in the downstream Unit that contains Path. Reserved as a pointer for a future optional/WhereResource form; required for now."
        }
      }
    },
    "Permissions": {
      "type": "object",
      "additionalProperties": {
        "$ref": "#/$defs/Subjects"
      }
    },
    "ResourceInfo": {
      "type": "object",
      "properties": {
        "ResourceCategory": {
          "type": "string",
          "description": "Category of configuration element represented in the configuration data; Kubernetes resources are of category Resource, and application configuration files are of category AppConfig",
          "x-go-type-skip-optional-pointer": true
        },
        "ResourceName": {
          "type": "string",
          "description": "Name of a resource in the system under management represented in the configuration data; Kubernetes resources are represented in the form <metadata.namespace>/<metadata.name>; not all ToolchainTypes necessarily use '/' as a separator between any scope(s) and name or other client-chosen ID",
          "x-go-type-skip-optional-pointer": true
        },
        "ResourceNameStableCore": {
          "type": "string",
          "description": "Name of a resource in the system under management represented in the configuration data with generated prefixes and suffixes stripped; empty if nothing to strip",
          "x-go-type-skip-optional-pointer": true
        },
        "ResourceNameWithoutScope": {
          "type": "string",
          "description": "Name of a resource in the system under management represented in the configuration data, without any uniquifying scope, such as Namespace, Project, Account, Region, etc.; Kubernetes resources are represented in the form <metadata.name>",
          "x-go-type-skip-optional-pointer": true
        },
        "ResourceType": {
          "type": "string",
          "description": "Type of a resource in the system under management represented in the configuration data; Kubernetes resources are represented in the form <apiVersion>/<kind> (aka group-version-kind)",
          "x-go-type-skip-optional-pointer": true
        }
      }
    },
    "Subjects": {
      "type": "object",
      "properties": {
        "GroupIDs": {
          "type": "object",
          "additionalProperties": {
            "type": "boolean"
          },
          "x-go-type-skip-optional-pointer": true
        },
        "UserIDs": {
          "type": "object",
          "additionalProperties": {
            "type": "boolean"
          },
          "x-go-type-skip-optional-pointer": true
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/confighub-link"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

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.

A second provider on the same verified email joins the account you already have.