# GET /v1/search

Search profiles and projects that enabled both public search and API disclosure.

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

## Parameters

- `q` (query, required) Search text, 2 to 80 characters. 2 to 80 characters.
- `limit` (query, optional) Page size from 1 to 20. Defaults to 10. 1 to 20.
- `cursor` (query, optional) Opaque nextCursor from the same search surface and query. 1 to 512 characters.

## Response 200

- `apiVersion` (string) Always v1 on this surface.
- `items` (object[]) Matches in rank order. An empty array is a successful answer, not an error.
  - `kind` (string) Which projection the entry carries. One of: profile, project.
  - `profile` (object, optional) Present when kind is 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) The public profile slug.
    - `fields` (object) Only the values this surface's allowlist selected. An absent key was not granted.
      - `displayName` (string, optional) Public display name.
      - `headline` (string, optional) One-line self description.
      - `bio` (string, optional) Longer self description.
      - `location` (string, optional) Free-text location.
      - `avatarUrl` (string, optional) HTTPS avatar image.
      - `contactUrl` (string, optional) HTTPS contact destination.
  - `project` (object, optional) Present when kind is project.
    - `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/search?q=harbor&limit=10'
```

```json
{
  "apiVersion": "v1",
  "items": [
    {
      "kind": "profile",
      "profile": {
        "apiVersion": "v1",
        "publicationVersion": 7,
        "publishedAt": "2026-06-14T09:00:00.000Z",
        "updatedAt": "2026-07-30T16:20:00.000Z",
        "revokedAt": null,
        "surface": "api",
        "profileSlug": "ada",
        "fields": {
          "displayName": "Ada Sorenson",
          "headline": "Systems and tooling.",
          "location": "Oslo"
        }
      }
    },
    {
      "kind": "project",
      "project": {
        "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": "c2VvcmFrOnYxOnNlYXJjaDo4"
}
```

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