# List Projects associated with a Topic

`GET /v3/topics/{topicId}/projects`

The authoritative Topic→Project association collection. An
association is observational: canonical Project-attributed posts that
are members of the Topic at the shared cutoff in the sustained-attention
cohort. It never implies
partnership, endorsement, taxonomy, causality, or a primary Project.
Coverage is a statement about source completeness, separate from
association eligibility.

## Authentication

None. This endpoint is public.

## Parameters

```json
[
  {
    "name": "topicId",
    "in": "path",
    "required": true,
    "schema": {
      "type": "string",
      "pattern": "^topic_[a-f0-9]{20}$"
    }
  },
  {
    "name": "ranking",
    "in": "query",
    "description": "Topic ranking cohort used to resolve the association snapshot.",
    "schema": {
      "type": "string",
      "enum": [
        "trend"
      ],
      "default": "trend"
    }
  },
  {
    "$ref": "#/components/parameters/Cursor"
  },
  {
    "$ref": "#/components/parameters/Limit"
  }
]
```

## Request body

None.

## Responses

```json
{
  "200": {
    "description": "Association page.",
    "content": {
      "application/json": {
        "schema": {
          "type": "object",
          "required": [
            "data",
            "meta"
          ],
          "properties": {
            "data": {
              "type": "array",
              "items": {
                "$ref": "#/components/schemas/TopicProjectAssociation"
              }
            },
            "meta": {
              "$ref": "#/components/schemas/AssociationMeta"
            }
          }
        },
        "examples": {
          "success": {
            "summary": "Associations at the current window",
            "value": {
              "data": [
                {
                  "project": {
                    "id": "665f0a2b1c9d440000a1b2c3",
                    "slug": "examplechain",
                    "name": "ExampleChain"
                  },
                  "observedPosts": 96,
                  "distinctAuthors": 44,
                  "shareOfTopicPosts": 0.23,
                  "firstObservedAt": "2026-08-04T06:10:00Z",
                  "lastObservedAt": "2026-08-05T04:41:00Z",
                  "sentiment": {
                    "populated": 61,
                    "coverage": 0.64
                  }
                }
              ],
              "meta": {
                "nextCursor": null,
                "window": {
                  "from": "2026-08-04T04:55:00Z",
                  "to": "2026-08-05T04:55:00Z"
                },
                "versions": {
                  "resolver": "project-resolver-v4",
                  "membership": "topic-membership-v2"
                }
              }
            }
          },
          "empty": {
            "summary": "No qualifying associations",
            "value": {
              "data": [],
              "meta": {
                "nextCursor": null,
                "window": {
                  "from": "2026-08-04T04:55:00Z",
                  "to": "2026-08-05T04:55:00Z"
                }
              }
            }
          }
        }
      }
    }
  },
  "400": {
    "$ref": "#/components/responses/BadRequest"
  },
  "401": {
    "$ref": "#/components/responses/Unauthorized"
  },
  "403": {
    "$ref": "#/components/responses/Forbidden"
  },
  "404": {
    "$ref": "#/components/responses/SubjectMiss"
  },
  "429": {
    "$ref": "#/components/responses/RateLimited"
  },
  "500": {
    "$ref": "#/components/responses/Internal"
  }
}
```

## Referenced schemas

```json
{
  "TopicProjectAssociation": {
    "allOf": [
      {
        "type": "object",
        "required": [
          "project"
        ],
        "properties": {
          "project": {
            "$ref": "#/components/schemas/ProjectRef"
          }
        }
      },
      {
        "$ref": "#/components/schemas/TopicAssociationFacts"
      }
    ]
  },
  "ProjectRef": {
    "type": "object",
    "required": [
      "id",
      "slug",
      "name"
    ],
    "properties": {
      "id": {
        "type": "string"
      },
      "slug": {
        "type": "string",
        "pattern": "^[a-z0-9]+(-[a-z0-9]+)*$",
        "maxLength": 64
      },
      "name": {
        "type": "string"
      }
    }
  },
  "TopicAssociationFacts": {
    "type": "object",
    "required": [
      "observedPosts",
      "distinctAuthors",
      "shareOfTopicPosts",
      "firstObservedAt",
      "lastObservedAt"
    ],
    "properties": {
      "observedPosts": {
        "type": "integer"
      },
      "distinctAuthors": {
        "type": "integer"
      },
      "shareOfTopicPosts": {
        "type": "number",
        "minimum": 0,
        "maximum": 1
      },
      "firstObservedAt": {
        "type": "string",
        "format": "date-time"
      },
      "lastObservedAt": {
        "type": "string",
        "format": "date-time"
      },
      "sentiment": {
        "type": "object",
        "properties": {
          "populated": {
            "type": "integer"
          },
          "coverage": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        }
      }
    }
  },
  "AssociationMeta": {
    "allOf": [
      {
        "$ref": "#/components/schemas/CollectionMeta"
      },
      {
        "type": "object",
        "required": [
          "window"
        ],
        "properties": {
          "window": {
            "type": "object",
            "required": [
              "from",
              "to"
            ],
            "properties": {
              "from": {
                "type": "string",
                "format": "date-time"
              },
              "to": {
                "type": "string",
                "format": "date-time"
              }
            }
          }
        }
      }
    ]
  },
  "CollectionMeta": {
    "allOf": [
      {
        "$ref": "#/components/schemas/Meta"
      },
      {
        "type": "object",
        "required": [
          "nextCursor"
        ],
        "properties": {
          "nextCursor": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ],
            "description": "Cursor for the next page; `null` on the last page."
          }
        }
      }
    ]
  },
  "Meta": {
    "type": "object",
    "description": "Response metadata. Empty when nothing applies.",
    "properties": {
      "history": {
        "$ref": "#/components/schemas/HistoryMeta"
      },
      "versions": {
        "type": "object",
        "additionalProperties": {
          "type": "string"
        },
        "description": "Named component versions that shaped this response."
      }
    }
  },
  "HistoryMeta": {
    "type": "object",
    "description": "The history window applied to this response. Both fields are null when the account has no history limit.",
    "required": [
      "lookbackDays",
      "earliestAvailableAt"
    ],
    "properties": {
      "lookbackDays": {
        "oneOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "earliestAvailableAt": {
        "oneOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      }
    }
  }
}
```

Schema references resolve against the [canonical OpenAPI specification](https://api.aixbt.tech/v3/openapi.yaml).