# Get a board

Read one board: tracked apps with stored evidence, saved ads, the weekly and monthly pulse, activity and similar advertisers.

## Endpoint: GET /v1/boards/{boardId}

- Method: `GET`
- Path: `/v1/boards/{boardId}`
- Authentication: Bearer API credential or OAuth access token
- Required scope: `context:read`
- MCP tool: `boards`
- MCP action: `get`

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `boardId` | path | uuid | yes | Board 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

Render saved ad creatives with `GET /v1/paid-ads?savedToBoardId=`. `trackedAppId` is the app in the tenancy ASO workstation; `stopsTrackingOnRemove` is true when no other board in the tenancy holds the app.

```
curl --get 'https://api.peekpanda.com/v1/boards/66666666-6666-4666-8666-666666666666' \
  --header "Authorization: Bearer $PEEKPANDA_TOKEN" \
  --header 'x-genviral-tenancy: personal'
```

## MCP request

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

```
{
  "name": "boards",
  "arguments": {
    "request": {
      "action": "get",
      "params": {
        "boardId": "<boardId>"
      }
    }
  }
}

```

## Response

`adsFreshness` is `never` until a collection has finished for the app and `stale` once `adsLastCollectedAt` is older than two days, so zero ads never means an app runs no ads. The pulse counts ads whose run started in each UTC week (Monday first, last 8) and month (last 6); the last bucket is the current one. `similarAdvertisers` lists up to 6 apps not on the board that are similar to its apps and have collected paid ads, most live ads first, each with the board app it is most similar to (`similarTo`) and when its paid counts were built. Counts are collected ads, never spend. The list is empty until similar apps have been computed for the board apps.

```
{
  "id": "66666666-6666-4666-8666-666666666666",
  "name": "Top food apps",
  "color": "#5cb427",
  "scope": "personal",
  "workspaceId": null,
  "ownerUserId": "99999999-9999-4999-8999-999999999999",
  "appCount": 1,
  "adCount": 1,
  "createdAt": "2026-09-06T00:00:00.000Z",
  "updatedAt": "2026-09-06T00:00:00.000Z",
  "apps": [
    {
      "id": "77777777-7777-4777-8777-777777777777",
      "kind": "app",
      "storeId": "0000000000",
      "name": "Example Recipe Planner",
      "iconUrl": null,
      "note": null,
      "addedByUserId": "99999999-9999-4999-8999-999999999999",
      "createdAt": "2026-09-06T00:00:00.000Z",
      "trackedAppId": "55555555-5555-4555-8555-555555555555",
      "stopsTrackingOnRemove": true,
      "evidence": {
        "liveAds": 4,
        "newAdsThisWeek": 1,
        "savedAdsOnBoard": 1,
        "inCatalogue": true,
        "adsLastCollectedAt": "2026-09-06T00:00:00.000Z",
        "adsFreshness": "fresh"
      }
    }
  ],
  "ads": [
    {
      "id": "88888888-8888-4888-8888-888888888888",
      "kind": "ad",
      "platform": "meta",
      "archiveId": "example-archive-id",
      "storeId": "0000000000",
      "advertiserName": "Example Labs",
      "note": "Hook: \"dinner in 10 minutes\"",
      "addedByUserId": "99999999-9999-4999-8999-999999999999",
      "createdAt": "2026-09-06T00:00:00.000Z"
    }
  ],
  "pulse": {
    "apps": 1,
    "savedAds": 1,
    "liveAds": 4,
    "newAdsThisWeek": 1,
    "newAdsByWeek": [
      {
        "weekStart": "2026-07-13",
        "newAds": 0
      },
      {
        "weekStart": "2026-07-20",
        "newAds": 0
      },
      {
        "weekStart": "2026-07-27",
        "newAds": 0
      },
      {
        "weekStart": "2026-08-03",
        "newAds": 0
      },
      {
        "weekStart": "2026-08-10",
        "newAds": 0
      },
      {
        "weekStart": "2026-08-17",
        "newAds": 0
      },
      {
        "weekStart": "2026-08-24",
        "newAds": 0
      },
      {
        "weekStart": "2026-08-31",
        "newAds": 1
      }
    ],
    "newAdsByMonth": [
      {
        "month": "2026-04",
        "newAds": 0
      },
      {
        "month": "2026-05",
        "newAds": 0
      },
      {
        "month": "2026-06",
        "newAds": 0
      },
      {
        "month": "2026-07",
        "newAds": 0
      },
      {
        "month": "2026-08",
        "newAds": 0
      },
      {
        "month": "2026-09",
        "newAds": 1
      }
    ]
  },
  "activity": [
    {
      "kind": "new_ads",
      "date": "2026-09-06",
      "storeId": "0000000000",
      "appName": "Example Recipe Planner",
      "count": 1
    },
    {
      "kind": "ad_saved",
      "at": "2026-09-06T00:00:00.000Z",
      "platform": "meta",
      "archiveId": "example-archive-id",
      "advertiserName": "Example Labs",
      "byUserId": "99999999-9999-4999-8999-999999999999"
    }
  ],
  "trackedAppAllowance": {
    "used": 1,
    "limit": 1,
    "plan": "peek"
  },
  "similarAdvertisers": [
    {
      "storeId": "1065397474",
      "name": "Example Meal Kit",
      "iconUrl": null,
      "matchReason": "shared_searches",
      "sharedSearches": 12,
      "similarTo": {
        "storeId": "0000000000",
        "name": "Example Recipe Planner"
      },
      "liveAds": 38,
      "totalAds": 120,
      "paidEvidenceBuiltAt": "2026-09-06T00:00:00.000Z"
    }
  ]
}

```

## Source

Boards are the caller's own organization, stored in PeekPanda. Apps carry the listing name and icon as added; evidence counts are stored paid-ad observations.

## Refresh

Board reads never call a provider or start collection. An app on any board in a space is tracked there, and tracking collects its paid ads, organic posts, keywords and chart position.
