---
title: "Bulk-add monitored people (Person Activity Monitoring; best-effort per-row). Prefer /api/me/intelligence/monitoring."
method: POST
path: "/api/me/sources/bulk"
tags: ["me"]
---

# Bulk-add monitored people (Person Activity Monitoring; best-effort per-row). Prefer /api/me/intelligence/monitoring.

`POST /api/me/sources/bulk`

## Request

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

Per-row best-effort batch create. 100-input cap. Each input is normalized via the LinkedIn profile URL helper before in-batch dedup and existing-URL check. Returns 200 with both created[] and skipped[] populated — caller checks `created.length` to know what happened. Skipped reasons: invalid_format | duplicate | already_active. Monitored people are not counted against the plan source cap (2026-10-06), so cap_exceeded is no longer produced.

## Request body

- object
  - `sourceType` 'target_person', required
  - `inputs` string[], required
  - `displayName` string

## Response `200`

Per-row results

- object
  - `created` object[], required
    - `id` string, uuid, required
    - `linkedinUrl` string, required
    - `displayName` string, required
  - `skipped` object[], required
    - `input` string, required
    - `normalized` string
    - `reason` 'duplicate' | 'cap_exceeded' | 'invalid_format' | 'already_active', required

## Other responses

- `400`: Validation error or too_many_inputs (>1,000)
- `401`: Not authenticated
- `403`: Insufficient role (requires admin or manager)

---

[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)
