---
title: "Get a single source (404 if not yours)"
method: GET
path: "/api/me/sources/{id}"
tags: ["me"]
---

# Get a single source (404 if not yours)

`GET /api/me/sources/{id}`

## Request

- Base URL: `https://api.signalraven.ai`
- URL: `https://api.signalraven.ai/api/me/sources/{id}`
- Auth: none declared

## Path parameters

- `id` string, uuid, required

## Response `200`

Source detail with score distribution

- SourceWithStats
  - `id` string, uuid, required: Source ID
  - `customerId` string, uuid, required
  - `sourceType` 'own_company' | 'competitor_company' | 'competitor_company_broad' | 'competitor_employee' | 'keyword_search' | 'industry_search' | 'mention_tracking' | 'hashtag_search' | 'target_person' | 'event_search' | 'poster_search', required: Source type classification
  - `linkedinUrl` string, required
  - `displayName` string, nullable, required
  - `priority` integer, required
  - `isActive` boolean, required
  - `metadata` object, nullable, required
  - `topicFilter` string, nullable, required
  - `searchQuery` string, nullable, required
  - `industryCodes` string, nullable, required
  - `lastSeenPostId` string, nullable, required: Most recent post ID seen during discovery
  - `lastDiscoveryAt` string, date-time, nullable, required
  - `createdAt` string, date-time, required
  - `event` object, nullable
    - `name` string, required
    - `startDate` string, required
    - `endDate` string, required
    - `phase` 'dormant' | 'pre' | 'live' | 'wrap' | 'ended', required
    - `completedAt` string, nullable, required
  - `poster` object, nullable
    - `kind` 'partner_launch' | 'product_launch' | 'funding' | 'opening' | 'topic' | 'custom', required
    - `kindDescription` string, nullable, required
    - `subjectScope` 'any' | 'subject_company', required
    - `seniorLeadership` boolean, required
    - `maxReposts` integer, required
    - `aliases` string[], required
  - `countsTowardCap` boolean
  - `inactiveReason` string, nullable
  - `lastCheckedAt` string, date-time, nullable: target_person only: when the weekly check last ran (every 30 days after a scraper-error streak). lastDiscoveryAt moves on every daily poll, including days no check was due. null for other source types and until the first check completes.
  - `status` 'producing' | 'watching' | 'slow' | 'paused' | 'error': Computed source health badge — derived portal-side
  - `strengthScore` number: Relevance rate 0-1, shown as "Relevance rate" on the Sources page: the share of the source's posts in the window that passed the relevance check (qualified, harvesting, or closed after max harvests or expiry), archived posts excluded. Not a signal measure.
  - `sparkline` integer[]: 30 daily counts of signals attributed to this source (oldest → newest)
  - `totalPosts` integer: Watched posts in window
  - `qualifiedPosts` integer: Posts in qualified or harvesting lifecycle
  - `avgRelevanceScore` number, nullable: Avg watched_posts.relevance_score (1-5; lower = more relevant)
  - `totalLikes` integer
  - `totalComments` integer
  - `signalCount` integer: Signals attributed to this source within the window
  - `credits` number: Credits this source spent within the window (credit_transactions.source_id, numeric to scale 4). GET /api/me/sources only.
  - `scoreDistribution` object: Counts of watched_posts grouped by relevance_score (1=Strong … 5=Irrelevant) within the window
    - `1` integer, required
    - `2` integer, required
    - `3` integer, required
    - `4` integer, required
    - `5` integer, required

## Other responses

- `404`: Source not found or not owned by customer

---

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