# GET /v1/profiles/{profileSlug}/projects

List API-enabled projects under one current profile. Search permission is not required.

Base URL: https://seorak-public-directory.glendonchin.workers.dev. No key, no account, and no headers.

## Parameters

- `profileSlug` (path, required) The public profile slug. 0 to 63 characters, matching `^[a-z0-9]+(?:-[a-z0-9]+)*$`.
- `limit` (query, optional) Page size from 1 to 20. Defaults to 10. 1 to 20.
- `cursor` (query, optional) Opaque nextCursor from this profile's project listing. 1 to 512 characters.

## Response 200

- `apiVersion` (string) Always v1 on this surface.
- `profileSlug` (string) The profile whose projects were listed.
- `items` (object[]) Project projections under this profile.
  - `apiVersion` (string) Always v1 on this surface.
  - `publicationVersion` (integer) Monotonic version of the publication behind this projection.
  - `publishedAt` (string) When the publication first became public.
  - `updatedAt` (string) When the current projection was written.
  - `revokedAt` (string | null) Always null on a public read; a revoked item is not served.
  - `surface` (string) Which grant produced this projection. Each surface is a separate decision. One of: web, api, mcp.
  - `profileSlug` (string) Slug of the profile that owns the project.
  - `projectSlug` (string) The public project slug.
  - `fields` (object) Only the values this surface's allowlist selected.
    - `name` (string, optional) Public project name.
    - `summary` (string, optional) What the project is.
    - `role` (string, optional) The publisher's role on it.
    - `startedOn` (string, optional) Calendar date the period opens.
    - `endedOn` (string | null, optional) Calendar date the period closes, or null while ongoing.
    - `projectUrl` (string, optional) HTTPS destination for the project itself.
    - `sourceUrl` (string, optional) HTTPS destination for its source.
    - `technologies` (string[], optional) Declared technologies, as a string array.
  - `evidence` (object) Only the measurements this surface's allowlist selected, each in a full envelope.
    - `sessionCount` (object, optional) Distinct agent sessions attributed to the project.
      - `value` (number | null) Null when the measurement could not be supported. Read availability before this.
      - `unit` (string) How to render the value. One of: count, percent.
      - `availability` (object) Whether the claim could be supported, and why not when it could not.
        - `state` (string) Whether the source could support the claim at all. One of: available, partial, unavailable.
        - `reason` (string | null) Null when fully available; otherwise a stable capability gap. Never treat a gap as a zero. One of: not-captured, not-retained, not-yet-computed, outside-credential-restriction, temporarily-unavailable, result-limit.
      - `sampleSize` (integer) Denominator behind a rate, or the counted population behind a count.
      - `coverage` (object) The window the measurement describes, and whether that window is whole.
        - `period` (object) Measured window.
          - `from` (string) First day in range, as a calendar date.
          - `through` (string) Last day in range, inclusive.
        - `complete` (boolean) False means the window has gaps, so the value is a floor rather than a total.
      - `generatedAt` (string) When this measurement was frozen.
      - `freshness` (object) Age of the frozen claim.
        - `state` (string) Freshness travels with the frozen claim rather than being inferred by the reader. One of: fresh, stale, revalidating.
        - `generatedAt` (string) When this projection was derived.
        - `dataThrough` (string | null) Latest source observation included, or null for an honest-empty result.
        - `staleAt` (string) Boundary after which a caller must describe the projection as stale.
    - `toolCallCount` (object, optional) Tool calls attributed to the project.
      - `value` (number | null) Null when the measurement could not be supported. Read availability before this.
      - `unit` (string) How to render the value. One of: count, percent.
      - `availability` (object) Whether the claim could be supported, and why not when it could not.
        - `state` (string) Whether the source could support the claim at all. One of: available, partial, unavailable.
        - `reason` (string | null) Null when fully available; otherwise a stable capability gap. Never treat a gap as a zero. One of: not-captured, not-retained, not-yet-computed, outside-credential-restriction, temporarily-unavailable, result-limit.
      - `sampleSize` (integer) Denominator behind a rate, or the counted population behind a count.
      - `coverage` (object) The window the measurement describes, and whether that window is whole.
        - `period` (object) Measured window.
          - `from` (string) First day in range, as a calendar date.
          - `through` (string) Last day in range, inclusive.
        - `complete` (boolean) False means the window has gaps, so the value is a floor rather than a total.
      - `generatedAt` (string) When this measurement was frozen.
      - `freshness` (object) Age of the frozen claim.
        - `state` (string) Freshness travels with the frozen claim rather than being inferred by the reader. One of: fresh, stale, revalidating.
        - `generatedAt` (string) When this projection was derived.
        - `dataThrough` (string | null) Latest source observation included, or null for an honest-empty result.
        - `staleAt` (string) Boundary after which a caller must describe the projection as stale.
    - `shippedChangeRate` (object, optional) Share of changes that reached the branch.
      - `value` (number | null) Null when the measurement could not be supported. Read availability before this.
      - `unit` (string) How to render the value. One of: count, percent.
      - `availability` (object) Whether the claim could be supported, and why not when it could not.
        - `state` (string) Whether the source could support the claim at all. One of: available, partial, unavailable.
        - `reason` (string | null) Null when fully available; otherwise a stable capability gap. Never treat a gap as a zero. One of: not-captured, not-retained, not-yet-computed, outside-credential-restriction, temporarily-unavailable, result-limit.
      - `sampleSize` (integer) Denominator behind a rate, or the counted population behind a count.
      - `coverage` (object) The window the measurement describes, and whether that window is whole.
        - `period` (object) Measured window.
          - `from` (string) First day in range, as a calendar date.
          - `through` (string) Last day in range, inclusive.
        - `complete` (boolean) False means the window has gaps, so the value is a floor rather than a total.
      - `generatedAt` (string) When this measurement was frozen.
      - `freshness` (object) Age of the frozen claim.
        - `state` (string) Freshness travels with the frozen claim rather than being inferred by the reader. One of: fresh, stale, revalidating.
        - `generatedAt` (string) When this projection was derived.
        - `dataThrough` (string | null) Latest source observation included, or null for an honest-empty result.
        - `staleAt` (string) Boundary after which a caller must describe the projection as stale.
    - `lineSurvivalRate` (object, optional) Share of changed lines still on the branch later.
      - `value` (number | null) Null when the measurement could not be supported. Read availability before this.
      - `unit` (string) How to render the value. One of: count, percent.
      - `availability` (object) Whether the claim could be supported, and why not when it could not.
        - `state` (string) Whether the source could support the claim at all. One of: available, partial, unavailable.
        - `reason` (string | null) Null when fully available; otherwise a stable capability gap. Never treat a gap as a zero. One of: not-captured, not-retained, not-yet-computed, outside-credential-restriction, temporarily-unavailable, result-limit.
      - `sampleSize` (integer) Denominator behind a rate, or the counted population behind a count.
      - `coverage` (object) The window the measurement describes, and whether that window is whole.
        - `period` (object) Measured window.
          - `from` (string) First day in range, as a calendar date.
          - `through` (string) Last day in range, inclusive.
        - `complete` (boolean) False means the window has gaps, so the value is a floor rather than a total.
      - `generatedAt` (string) When this measurement was frozen.
      - `freshness` (object) Age of the frozen claim.
        - `state` (string) Freshness travels with the frozen claim rather than being inferred by the reader. One of: fresh, stale, revalidating.
        - `generatedAt` (string) When this projection was derived.
        - `dataThrough` (string | null) Latest source observation included, or null for an honest-empty result.
        - `staleAt` (string) Boundary after which a caller must describe the projection as stale.
- `nextCursor` (string | null) Opaque cursor for the next page, or null on the last page.

## Example

```sh
curl -sS 'https://seorak-public-directory.glendonchin.workers.dev/v1/profiles/ada/projects?limit=10'
```

```json
{
  "apiVersion": "v1",
  "profileSlug": "ada",
  "items": [
    {
      "apiVersion": "v1",
      "publicationVersion": 7,
      "publishedAt": "2026-06-14T09:00:00.000Z",
      "updatedAt": "2026-07-30T16:20:00.000Z",
      "revokedAt": null,
      "surface": "api",
      "profileSlug": "ada",
      "projectSlug": "harbor",
      "fields": {
        "name": "Harbor",
        "summary": "A local-first queue for long agent runs.",
        "role": "Sole author",
        "technologies": [
          "Rust",
          "SQLite"
        ]
      },
      "evidence": {
        "shippedChangeRate": {
          "value": 0.625,
          "unit": "percent",
          "availability": {
            "state": "partial",
            "reason": "not-captured"
          },
          "sampleSize": 88,
          "coverage": {
            "period": {
              "from": "2026-05-03",
              "through": "2026-08-01"
            },
            "complete": false
          },
          "generatedAt": "2026-08-01T06:00:00.000Z",
          "freshness": {
            "state": "fresh",
            "generatedAt": "2026-08-01T06:00:00.000Z",
            "dataThrough": "2026-08-01T00:00:00.000Z",
            "staleAt": "2026-08-08T06:00:00.000Z"
          }
        }
      }
    }
  ],
  "nextCursor": null
}
```

## More

- Surface overview: https://seorak.app/docs/api.md
- Whole reference in one document: https://seorak.app/llms-full.txt
- Machine-readable HTTP schema: https://seorak.app/openapi.json

---

Source: https://seorak.app/docs/api/projects
This document: https://seorak.app/docs/api/projects.md
