# Get competitor

Read one stored iOS competitor-catalogue listing.

## Endpoint: GET /v1/competitors/{platform}/{storeId}

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

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `platform` | path | ios | yes | The preview supports iOS only. |
| `storeId` | path | numeric string | yes | Apple App Store identifier. |

## 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

Identify the listing with platform ios and a numeric Apple store ID.

```
curl --get 'https://api.peekpanda.com/v1/competitors/ios/0000000000' \
  --header "Authorization: Bearer $PEEKPANDA_TOKEN" \
  --header 'x-genviral-tenancy: personal'
```

## MCP request

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

```
{
  "name": "get_app",
  "arguments": {
    "request": {
      "action": "get",
      "params": {
        "platform": "<platform>",
        "storeId": "<storeId>"
      }
    }
  }
}

```

## Response

Returns one listing object. Show currentFacts: each value names its provenance, observed from an App Store storefront or the catalogue snapshot, and its own asOf date. The top-level appName, rating, totalRatings and price keep the dated snapshot values. When collected, storeInAppPurchases contains dated Apple purchase names and prices for the US store. A missing field means not checked. An empty items array means the checked public page showed no purchases. Apple shows at most 10 items; this is not a full product catalogue or proof of subscription billing.

```
{
  "platform": "ios",
  "storeId": "0000000000",
  "appName": "Example Calorie Tracker",
  "category": "Health & Fitness",
  "developerId": "example-developer",
  "price": 0,
  "adSupported": null,
  "inAppPurchases": true,
  "totalRatings": 12450,
  "rating": 4.7,
  "installs": {
    "kind": "ratings_proxy",
    "value": 622500
  },
  "releaseDate": "2024-05-01",
  "storeUpdatedAt": "2026-09-06",
  "sourceUpdatedAt": "2026-09-06",
  "descriptionUpdatedAt": null,
  "description": null,
  "shortDescription": null,
  "source": "itunes",
  "snapshotDate": "2026-03-01",
  "currentFacts": {
    "appName": {
      "provenance": "observed",
      "value": "Example Calorie Tracker",
      "asOf": "2026-09-06T00:00:00.000Z",
      "country": "us"
    },
    "rating": {
      "provenance": "observed",
      "value": 4.8,
      "asOf": "2026-09-06T00:00:00.000Z",
      "country": "us"
    },
    "totalRatings": {
      "provenance": "observed",
      "value": 13210,
      "asOf": "2026-09-06T00:00:00.000Z",
      "country": "us"
    },
    "price": {
      "provenance": "snapshot",
      "value": 0,
      "asOf": "2026-09-06"
    }
  },
  "storeInAppPurchases": {
    "appleId": "0000000000",
    "country": "us",
    "fetchedAt": "2026-09-06T00:00:00.000Z",
    "total": 1,
    "source": "app_store_product_page",
    "items": [
      {
        "name": "Premium",
        "price": "$9.99",
        "amount": 9.99,
        "currency": "USD",
        "kind": "unknown"
      }
    ]
  }
}

```

## Source

Dated public App Store listing observations. Installs, when present, are directional estimates rather than store-reported downloads.

## Refresh

Reads return stored observations. When newer listing data is requested, collection continues asynchronously.
