---
title: "Browse the names of projects you are not on (org.project.discover)"
method: GET
path: "/projects/directory"
tags: ["projects"]
---

# Browse the names of projects you are not on (org.project.discover)

`GET /projects/directory`

## Request

- Base URL: `https://api.onplana.com/api`
- URL: `https://api.onplana.com/api/projects/directory`
- Auth: one of:
  - HTTP bearer
  - API key in header `Authorization`

Returns the NAME and OWNER of projects in this organization that the caller is not a member of, so they can request access to one they would otherwise have no way to find. Each row is exactly { id, name, owner: { id, name } }: never the description, status, progress, dates, budget, members or any contents. Requires the org to have granted org.project.discover. Guests never receive rows whatever the permission matrix says, and a caller who already holds org.project.view.all gets an empty page because the directory is the complement of what they can already open. Every refused case answers an EMPTY PAGE rather than a 403, so a caller cannot distinguish "not permitted" from "nothing to show". Projects whose owner set hideFromDirectory are excluded, and finished projects are hidden unless hideFinished=0.

## Query parameters

- `page` integer
- `limit` integer
- `search` string
- `hideFinished` '0' | '1'

## Headers

- `X-Organization-Id` string, required

## Response `200`

A page of name-only project rows: { data, total, page, limit, hasMore }

## Other responses

- `400`: Validation error
- `401`: Unauthorized - missing or invalid JWT

---

[API](https://skmtc.dev/onplana/apis/onplana-api.md) · [All operations](https://skmtc.dev/onplana/apis/onplana-api/llms.txt) · [OpenAPI document](https://skmtc.dev/onplana/apis/onplana-api/revisions/c3d6c89e9dc8?raw)
