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

Read one current project projection and only its selected evidence fields.

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]+)*$`.
- `projectSlug` (path, required) The public project slug. 0 to 63 characters, matching `^[a-z0-9]+(?:-[a-z0-9]+)*$`.

## Response 200

- `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.

## Example

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

```json
{
  "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"
      }
    }
  }
}
```

## 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/project
This document: https://seorak.app/docs/api/project.md
