## CircleCI Schema ```mermaid graph LR O(Organization) -- RESOURCE --> C(Context) O -- RESOURCE --> CEV(ContextEnvVar) C -- HAS_ENV_VAR --> CEV O -- RESOURCE --> OIDC(OidcConfig) O -- RESOURCE --> G(Group) O -- RESOURCE --> POL(Policy) O -- RESOURCE --> ENV(Environment) O -- RESOURCE --> CMP(Component) O -- RESOURCE --> P(Project) P -- HAS_COMPONENT --> CMP P -- RESOURCE --> PEV(ProjectEnvVar) P -- RESOURCE --> CK(CheckoutKey) P -- RESOURCE --> W(Webhook) P -- RESOURCE --> PL(Pipeline) P -- RESOURCE --> TR(Trigger) P -- RESOURCE --> POIDC(ProjectOidcConfig) PL -- HAS_TRIGGER --> TR C -- RESTRICTED_TO --> P O -. ASSOCIATED_WITH .-> GHO(GitHubOrganization) P -. BUILDS .-> GHR(GitHubRepository / GitLabProject) ``` Dotted edges are best-effort cross-module links (created only when the GitHub/GitLab node already exists in the graph). Project-scoped nodes (Project and everything below it) are synced for projects discovered from each org's pipeline feed, plus any extra slugs passed via `--circleci-project-slugs` (CircleCI API v2 cannot enumerate an organization's projects directly). ### CircleCIOrganization Represents a CircleCI organization (a VCS org the token owner collaborates with), from `GET /me/collaborations`. > **Ontology Mapping**: This node has the extra label `Tenant` to enable cross-platform queries for organizational tenants across different systems (e.g., OktaOrganization, AzureTenant, GCPOrganization). #### Relationships - A GitHub-backed org is associated with its GitHubOrganization (best-effort, joined on login). ``` (:CircleCIOrganization)-[:ASSOCIATED_WITH]->(:GitHubOrganization) ``` | Field | Description | |-------|-------------| | **id** | Organization ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | name | Organization display name. | | **slug** | Organization slug (e.g. `gh/my-org`). | | vcs_type | Version control system (`github`, `bitbucket`, ...). | | avatar_url | URL of the organization avatar. | ### CircleCIContext Represents a CircleCI context, a named bundle of shared environment variables/secrets available to projects in the organization. | Field | Description | |-------|-------------| | **id** | Context ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Context name. | | created_at | Context creation timestamp. | #### Relationships - A context belongs to an organization. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIContext) ``` ### CircleCIContextEnvVar Represents an environment variable defined within a context. Only the variable **name** and metadata are stored; CircleCI never exposes the value. | Field | Description | |-------|-------------| | **id** | Synthesized id, `{context_id}:{variable}`. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **variable** | Environment variable name. | | context_id | ID of the owning context. | | created_at | Variable creation timestamp. | | updated_at | Variable last-update timestamp. | #### Relationships - A context environment variable belongs to an organization and to a context. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIContextEnvVar) (:CircleCIContext)-[:HAS_ENV_VAR]->(:CircleCIContextEnvVar) ``` ### CircleCIOidcConfig Represents an organization's OIDC custom-claims configuration (`GET /org/{orgID}/oidc-custom-claims`). The `audience` list shows which cloud audiences trust CircleCI's OIDC tokens. | Field | Description | |-------|-------------| | **id** | The organization ID (one org-level config per org). | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | scope | `organization` (project-level claims are not yet synced). | | audience | List of trusted OIDC audiences. | | audience_updated_at | When the audience was last changed. | | ttl | Token time-to-live. | | ttl_updated_at | When the TTL was last changed. | | org_id | Owning organization ID. | | project_id | Owning project ID (null for org-level). | #### Relationships - An OIDC config belongs to an organization. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIOidcConfig) ``` ### CircleCIGroup Represents an organization group (`GET /organizations/{org_id}/groups`). > **Ontology Mapping**: This node has the extra label `UserGroup` for cross-platform group queries (e.g. GitLabGroup, EntraGroup, GoogleWorkspaceGroup). | Field | Description | |-------|-------------| | **id** | Group ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Group name. | | description | Group description. | #### Relationships - A group belongs to an organization. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIGroup) ``` ### CircleCIPolicy Represents a config policy in the organization's policy bundle (`GET /owner/{orgID}/context/config/policy-bundle`). Only the `config` policy context is queried. | Field | Description | |-------|-------------| | **id** | Synthesized id, `{org_id}:{context}:{name}`. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Policy name. | | context | Policy context (`config`). | | content | Policy source (Rego). | | created_at | Policy creation timestamp. | | created_by | Who created the policy. | | decision_enabled | Whether policy decisions are enabled for this context (from the decision settings). | #### Relationships - A policy belongs to an organization. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIPolicy) ``` ### CircleCIEnvironment Represents a deploy environment (`GET /deploy/environments`). | Field | Description | |-------|-------------| | **id** | Environment ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Environment name. | | description | Environment description. | | labels | List of labels. | | created_at | Creation timestamp. | | updated_at | Last-update timestamp. | #### Relationships - An environment belongs to an organization. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIEnvironment) ``` ### CircleCIComponent Represents a deploy component (`GET /deploy/components`). | Field | Description | |-------|-------------| | **id** | Component ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Component name. | | project_id | ID of the associated project. | | labels | List of labels. | | release_count | Number of releases. | | created_at | Creation timestamp. | | updated_at | Last-update timestamp. | #### Relationships - A component belongs to an organization and (when known) to a project. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIComponent) (:CircleCIProject)-[:HAS_COMPONENT]->(:CircleCIComponent) ``` ### CircleCIProject Represents a CircleCI project (`GET /project/{project-slug}`). Synced for projects discovered from each org's pipeline feed plus any extra slugs passed via `--circleci-project-slugs`. Upserted only, never auto-deleted (see config docs). | Field | Description | |-------|-------------| | **id** | Opaque project ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **slug** | Project slug (e.g. `gh/acme/web`). | | name | Project (repository) name. | | organization_name | Owning organization name. | | organization_slug | Owning organization slug. | | organization_id | Owning organization ID. | | vcs_url | Repository URL. | | vcs_provider | VCS provider (e.g. `GitHub`). | | default_branch | Default branch name. | #### Relationships - A project belongs to an organization. ``` (:CircleCIOrganization)-[:RESOURCE]->(:CircleCIProject) ``` - A project builds a VCS repository (best-effort cross-module link, joined on the repo URL). ``` (:CircleCIProject)-[:BUILDS]->(:GitHubRepository) (:CircleCIProject)-[:BUILDS]->(:GitLabProject) ``` - A context can be restricted to specific projects (from context restrictions). ``` (:CircleCIContext)-[:RESTRICTED_TO]->(:CircleCIProject) ``` ### CircleCIProjectEnvVar Represents a project-level environment variable. Only the **name** is stored; CircleCI returns a masked value. | Field | Description | |-------|-------------| | **id** | Synthesized id, `{project_slug}:{name}`. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Environment variable name. | | project_slug | Slug of the owning project. | | value | Masked value (`xxxx` + last 4 chars); the real secret is never exposed by the API. | #### Relationships - A project environment variable belongs to a project. ``` (:CircleCIProject)-[:RESOURCE]->(:CircleCIProjectEnvVar) ``` ### CircleCICheckoutKey Represents a project checkout/deploy key (`GET /project/{slug}/checkout-key`). Only the public key is stored. | Field | Description | |-------|-------------| | **id** | Synthesized id, `{project_slug}:{fingerprint}`. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **fingerprint** | Key fingerprint. | | type | Key type (`deploy-key`, `github-user-key`, ...). | | preferred | Whether this is the preferred key. | | public_key | The SSH public key. | | created_at | Key creation timestamp. | | project_slug | Slug of the owning project. | #### Relationships - A checkout key belongs to a project. ``` (:CircleCIProject)-[:RESOURCE]->(:CircleCICheckoutKey) ``` ### CircleCIWebhook Represents an outbound webhook scoped to a project (`GET /webhook`). | Field | Description | |-------|-------------| | **id** | Webhook ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Webhook name. | | url | Destination URL. | | verify_tls | Whether TLS verification is enabled. | | has_signing_secret | Whether a signing secret is configured (the value itself is never stored). | | events | List of subscribed event types. | #### Relationships - A webhook belongs to a project. ``` (:CircleCIProject)-[:RESOURCE]->(:CircleCIWebhook) ``` ### CircleCIPipeline Represents a pipeline: the config/source binding (`GET /projects/{project_id}/pipeline-definitions`). Pipeline **runs** (executions) are intentionally not ingested - they are high-volume, ephemeral telemetry rather than inventory. > **Ontology Mapping**: This node has the extra label `CICDPipeline` for cross-platform CI/CD queries alongside GitHubWorkflow, GitLab CI, AWS CodeBuild, and Spacelift stacks. | Field | Description | |-------|-------------| | **id** | Pipeline ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **name** | Pipeline name. | | description | Pipeline description. | | created_at | Creation timestamp. | | config_source_provider | Provider of the config source (e.g. `github_app`). | | config_source_repo_full_name | Full name of the repository holding the config. | | config_source_repo_external_id | VCS external id of the config repository. | | config_source_file_path | Path to the config file. | | checkout_source_provider | Provider of the checkout source. | | checkout_source_repo_full_name | Full name of the repository checked out. | | checkout_source_repo_external_id | VCS external id of the checkout repository. | #### Relationships - A pipeline belongs to a project. ``` (:CircleCIProject)-[:RESOURCE]->(:CircleCIPipeline) ``` ### CircleCITrigger Represents a trigger attached to a pipeline (`GET /projects/{id}/pipeline-definitions/{pipeline_id}/triggers`). | Field | Description | |-------|-------------| | **id** | Trigger ID. | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | **event_name** | Event the trigger fires on (e.g. `push`). | | description | Trigger description. | | event_preset | Event preset. | | event_source_provider | Provider of the event source (`github_app`, `schedule`, ...). | | cron_expression | Cron schedule when the trigger is a scheduled trigger (`provider == schedule`); this is how scheduled pipeline runs are modelled. | | checkout_ref | Ref to check out. | | config_ref | Ref to read config from. | | disabled | Whether the trigger is disabled. | | pipeline_id | ID of the owning pipeline. | #### Relationships - A trigger belongs to a project and to a pipeline. ``` (:CircleCIProject)-[:RESOURCE]->(:CircleCITrigger) (:CircleCIPipeline)-[:HAS_TRIGGER]->(:CircleCITrigger) ``` ### CircleCIProjectOidcConfig Represents a project's OIDC custom-claims configuration (`GET /org/{orgID}/project/{projectID}/oidc-custom-claims`). Same shape as the org-level config, scoped to a project. | Field | Description | |-------|-------------| | **id** | The project ID (one project-level config per project). | | firstseen | Timestamp of when a sync job first created this node. | | lastupdated | Timestamp of the last time the node was updated. | | scope | `project`. | | audience | List of trusted OIDC audiences. | | audience_updated_at | When the audience was last changed. | | ttl | Token time-to-live. | | ttl_updated_at | When the TTL was last changed. | | org_id | Owning organization ID. | | project_id | Owning project ID. | #### Relationships - A project OIDC config belongs to a project. ``` (:CircleCIProject)-[:RESOURCE]->(:CircleCIProjectOidcConfig) ```