# Search apps for onboarding

Find stored iOS catalogue apps by name or App Store identity.

## Contract status

Preview contract: these routes and tools are implemented in the shared contract, but the public host, customer API access and OAuth flow have not been deployment verified.

## Endpoint: GET /v1/starter-boards/search

- Method: `GET`
- Path: `/v1/starter-boards/search`
- Authentication: Bearer API credential or OAuth access token
- Required scope: `context:read`
- MCP tool: `starter_boards`
- MCP action: `search`

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `query` | query | string | yes | At least 2 and at most 200 characters: app name, App Store URL, or store ID. |

## Known errors

- 400 invalid_request for an invalid filter, identity or limit.
- 401 authentication_required for a missing or invalid credential.
- 402 subscription_required when access is not entitled.
- 403 authorization_required for a missing scope or unavailable preview access.
- 403 workspace_not_accessible when x-genviral-tenancy names a workspace the credential cannot reach.
- 404 not_found when the record is outside the accessible catalogue.
- 429 rate_limited; honor Retry-After when present.
- 429 daily_call_limit; the plan's daily API and MCP calls are used until 00:00 UTC.

## Request

Send one query parameter. The response contains at most eight app summaries.

```
curl --get 'https://api.peekpanda.com/v1/starter-boards/search?query=Acorn' \
  --header "Authorization: Bearer $PEEKPANDA_TOKEN" \
  --header 'x-genviral-tenancy: personal'
```

## MCP request

Call starter_boards with action search. Path fields go in params, filters in query, and a write body in body.

```
{
  "name": "starter_boards",
  "arguments": {
    "request": {
      "action": "search",
      "query": {
        "query": "<query>"
      }
    }
  }
}

```

## Response

Matching stored iOS listings with their App Store IDs, current display names, developers, categories, icons and observed rating counts. This lookup reads the stored catalogue; it does not call providers, enqueue enrichment or write visit records.

```
{
  "data": [
    {
      "storeId": "1234567890",
      "name": "Acorn",
      "iconUrl": null,
      "developer": null,
      "category": null,
      "rating": null,
      "ratingCount": null,
      "listingObservedAt": null,
      "liveAds": null,
      "totalAds": null,
      "paidObservedAt": null
    }
  ]
}

```

## Source

Curated PeekPanda starter-board catalogue and public competitor evidence. No private customer board content is returned.

## Refresh

Reads stored listing, paid-ad, keyword and organic observations only. These requests never start provider collection. Each observed stream carries its observation date; missing evidence remains null or an empty list.

## Rate limits and daily budget

Authenticated API and MCP calls share the plan holder’s daily allowance: Peek 30 or Panda 1,000 calls, reset at 00:00 UTC. The standard per-minute rate limit also applies; honor Retry-After and daily-call reset headers on 429 responses.
