---
title: "Competitive landscape for one of your own apps"
method: GET
path: "/api/v1/apps/{id}/competitor-landscape"
tags: ["Workspace"]
---

# Competitive landscape for one of your own apps

`GET /api/v1/apps/{id}/competitor-landscape`

## Request

- Base URL: `https://api.trysonar.app`
- URL: `https://api.trysonar.app/api/v1/apps/{id}/competitor-landscape`
- Auth: HTTP bearer

The live competitive keyword picture vs every tracked competitor: gap/winnable/threat/lead stats, the top gap (25), threat (10), and lead (10) rows with metrics, and the latest AI insight (or null). Empty landscape (zeroed stats, insight null) when no competitors are tracked. Requires the Indie plan.

## Path parameters

- `id` string, required

## Response `200`

Landscape: { app_id, stats: { competitors, keywords_compared, gaps, winnable, threats, leads }, gaps[], threats[], leads[], competitors[], insight, insight_cooldown: { in_cooldown, next_available_at } }

- object
  - `data` object, required: Result payload — full field reference at https://trysonar.app/docs/api

## Other responses

- `400`: Missing or invalid request parameters
- `401`: Missing or invalid API key
- `403`: Plan or scope insufficient (workspace endpoints need the Indie plan; writes also need a write-scope key)
- `404`: Resource not found or not tracked by your organization
- `429`: Rate limited — see `error.reason`: daily_limit (Indie plan: 1,000 requests/day, resets 00:00 UTC; see `reset_at`), anonymous_daily_limit / batch_too_large (keyless free tier), store_rate_limited or concurrency_limit (transient, honor `retry_after_seconds`)
- `500`: Unexpected server error

---

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