---
title: "Update a project's owned-media profiles"
method: PATCH
path: "/projects/{id}/owned_media"
tags: ["Owned Media & Communities"]
---

# Update a project's owned-media profiles

`PATCH /projects/{id}/owned_media`

## Request

- Base URL: `https://api.llmpulse.ai/api/v1`
- URL: `https://api.llmpulse.ai/api/v1/projects/{id}/owned_media`
- Auth: API key in header `Authorization`

Sets the profiles whose citations count as yours, like Project Settings > Owned Media. Send only the fields to change: a URL field takes a URL, or an empty string or null to clear it, and every list REPLACES the stored one ([] clears it). URLs are normalized like the app (a profile URL is stored in its canonical form, a Google Play package name becomes its listing URL), and anything the app would refuse (a URL from another platform, an extra profile equal to the main one, more than 10 extra profiles, a malformed subreddit) is rejected with ERR_INVALID_PARAM and nothing is applied. A new main or extra profile is scraped in the background for its name and avatar, listed in profile_scrapes_queued. The response is the GET payload after the change. A team member needs the Owned Media create permission, YouTube Intelligence create to change the YouTube channel, and Projects update to change the extra profile or Reddit lists. Requires the Growth plan or above and a `read_write` scope API key.

## Path parameters

- `id` integer, required

## Request body

- object
  - `youtube_channel_url` string, nullable: The main YouTube channel URL (@handle, /channel/UC..., /c/... or /user/...). An empty string or null clears it
  - `app_store_url` string, nullable: The App Store app URL, with its id number. An empty string or null clears it
  - `google_play_url` string, nullable: The Google Play app URL, or its package name (com.acme.app). An empty string or null clears it
  - `instagram_profile_url` string, nullable: The main Instagram profile URL. An empty string or null clears it
  - `facebook_page_url` string, nullable: The main Facebook Page URL. An empty string or null clears it
  - `tiktok_profile_url` string, nullable: The main TikTok profile URL. An empty string or null clears it
  - `linkedin_company_url` string, nullable: The main LinkedIn page URL: a company (/company/...), school (/school/...) or showcase (/showcase/...) page. An empty string or null clears it
  - `youtube_extra_profile_urls` string[]: FULL replacement list of extra YouTube channel URLs (at most 10); [] clears it
  - `mobile_apps_extra_profile_urls` string[]: FULL replacement list of extra App Store or Google Play app URLs (at most 10); [] clears it
  - `instagram_extra_profile_urls` string[]: FULL replacement list of extra Instagram profile URLs (at most 10); [] clears it
  - `facebook_extra_profile_urls` string[]: FULL replacement list of extra Facebook Page URLs (at most 10); [] clears it
  - `tiktok_extra_profile_urls` string[]: FULL replacement list of extra TikTok profile URLs (at most 10); [] clears it
  - `linkedin_extra_profile_urls` string[]: FULL replacement list of extra LinkedIn company, school or showcase page URLs (at most 10); [] clears it
  - `reddit_subreddits` string[]: FULL replacement list (at most 10) of subreddit names the brand owns, without r/; [] clears it
  - `reddit_usernames` string[]: FULL replacement list (at most 25) of Reddit usernames the brand owns, without u/; [] clears it

## Response `200`

The profiles after the change

- OwnedMediaProfilesUpdateResponse
  - `project_id` integer
  - `platforms` OwnedMediaPlatformProfiles[]
    - `platform` 'youtube' | 'mobile_apps' | 'instagram' | 'facebook' | 'tiktok' | 'linkedin' | 'reddit'
    - `connected` boolean
    - `max_extra_profiles` integer, nullable: How many extra profiles the platform accepts; null where it takes none
    - `profiles` OwnedMediaProfile[]
      - `url` string
      - `handle` string, nullable: The handle, page id, store app id, subreddit or username
      - `kind` 'profile' | 'app' | 'subreddit' | 'username'
      - `main` boolean: True for the main profile of its platform (or store), false for an extra one
      - `store` string, nullable: google_play or app_store for an app; null elsewhere
      - `name` string, nullable
      - `avatar_url` string, nullable
      - `scrape_status` string, nullable: State of the profile scrape that reads its name and avatar: pending, running, ready, failed or skipped; null when none has started or the platform has none
  - `settings` OwnedMediaProfileSettings: The current value of every field PATCH /projects/{id}/owned_media accepts
    - `youtube_channel_url` string, nullable
    - `app_store_url` string, nullable
    - `google_play_url` string, nullable
    - `instagram_profile_url` string, nullable
    - `facebook_page_url` string, nullable
    - `tiktok_profile_url` string, nullable
    - `linkedin_company_url` string, nullable
    - `youtube_extra_profile_urls` string[]
    - `mobile_apps_extra_profile_urls` string[]
    - `instagram_extra_profile_urls` string[]
    - `facebook_extra_profile_urls` string[]
    - `tiktok_extra_profile_urls` string[]
    - `linkedin_extra_profile_urls` string[]
    - `reddit_subreddits` string[]
    - `reddit_usernames` string[]
  - `request_id` string
  - `updated_fields` string[]: The fields this request set
  - `profile_scrapes_queued` string[]: Platforms whose new profile is being scraped in the background for its name and avatar

## Other responses

- `403`: A plan below Growth answers ERR_PLAN_REQUIRED, a read-only key ERR_INSUFFICIENT_SCOPE, and a team member without the Owned Media create permission (or YouTube Intelligence create for the YouTube channel) ERR_INSUFFICIENT_PERMISSION, with the same status
- `404`: Resource not found
- `422`: Invalid parameters

## Changes

- **2026-10-16** `dd090b1e1154`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/llmpulse/apis/llm-pulse-api/changes/projects/:id/owned_media/patch.md)

---

[API](https://skmtc.dev/llmpulse/apis/llm-pulse-api.md) - [All operations](https://skmtc.dev/llmpulse/apis/llm-pulse-api/llms.txt) - [OpenAPI document](https://skmtc.dev/llmpulse/apis/llm-pulse-api/revisions/38a31f123641?raw)
