Projects

Update a project profile (Brand Book)

Changed on

Updates the project name and profile, the same fields as Project Settings: name, brand_name, description, industry, business_model (plus business_model_other when it is OTHER), target_audience, brand_voice, goals, primary_products, matching_names, and the additional owned domains (additional_owned_domains). Send only the fields to change; unknown fields are rejected, and a request is applied whole or not at all. All seven Brand Book fields feed every GEO Writer task and prompt suggestions; only industry, description, and target_audience help Recommendations. A matching_names change re-runs mention/citation matching over the project history in the background, and an additional_owned_domains change reprocesses the past answers that cite an added or removed domain (rematching=true); further edits are rejected while that runs. Only the account owner can send additional_owned_domains: a team member key gets ERR_INSUFFICIENT_PERMISSION and nothing is applied. prompt_limit sets or (null) removes the project's own prompt cap, as in Account Settings > Prompt Limits. Only the account owner or a co-owner whose permissions grant Projects update can send it (Account Settings > Prompt Limits lets any co-owner change it; here a co-owner, like every team member, also needs Projects update): any other team member gets ERR_INSUFFICIENT_PERMISSION, and a key limited to some projects ERR_KEY_PROJECT_SCOPED, with nothing applied. A request that sends only prompt_limit is applied even while a rematch runs. pitch false, sent on its own, converts a pitch project into a tracked project, like Convert in the app: it keeps its answers and metrics, is no longer deleted, takes a project slot, and its prompts count against the prompt quota and run on the account's schedule from the next run. It cannot be undone and does not give back the month's pitch project. Converting needs the Projects update and create permissions (ERR_INSUFFICIENT_PERMISSION) and a key for the whole account (ERR_KEY_PROJECT_SCOPED); ERR_LIMIT_REACHED, with error.meta.limit, when the account has no project slot or prompts left or the project has more prompts or competitors than the plan allows per project, and ERR_INVALID_PARAM when the project is not a live pitch project. A pitch project's website, brand name, matching names, country, language and prompt limit (and name while it has no brand name) are fixed from creation: changing one returns ERR_INVALID_PARAM, so convert it with pitch false first. Requires a read_write scope API key.

patch/projects/{id}

Request

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

Path parameters

idinteger required

Request body

namestring

Project name shown in the app. A label: it does not change mention detection unless brand_name is empty. Cannot be blank

brand_namestring

Brand name used to detect mentions. Applies to future runs; it does not rewrite history

descriptionstring

What the brand does. Context for Recommendations and GEO Writer (Brand Book)

industrystring

Single industry key (e.g. SAAS), stored as sent; an array of keys is also accepted and stored as an array, like the in-app multi-select. Unknown keys are rejected with the valid keys listed

business_modelstring

Business model key (e.g. B2B_SAAS); unknown keys are rejected

business_model_otherstring

Free-text business model, only accepted when business_model is OTHER; rejected against any other key

target_audiencestring

Who the brand sells to (Brand Book)

brand_voicestring

Tone of voice guidance for generated content (Brand Book)

goalsstring

What the brand wants to achieve. Context for GEO Writer and prompt suggestions

primary_productsstring[]

Full replacement list of the main products or services

matching_namesstring[]

FULL replacement list of the brand-name variants used to detect mentions; send every variant to keep. At most 50 names of up to 100 characters each; a longer list or name is refused with ERR_INVALID_PARAM (422) and nothing in the request is applied

additional_owned_domainsstring[]

FULL replacement list (at most 10) of other domains the brand owns, such as a blog or a country site; [] clears it. Citations from them count as owned, like the project website. Each entry is a website's own domain and covers its subdomains; a pasted URL is stored as its domain (https://www.acme.co.uk/x becomes acme.co.uk). A list the domain editor would refuse (a subdomain such as blog.acme.com, a platform many companies share such as youtube.com, amazon.com or wordpress.com, the project website, a tracked competitor domain, a duplicate or an entry that is not a domain) is rejected with ERR_INVALID_PARAM and the reason. Order does not matter, and an unchanged list starts nothing. Account owner only, on every plan

prompt_limitinteger nullable

The most prompts this project can hold, a JSON integer from 1 to 2147483647; null removes the project's limit. A string, a decimal, 0 or a negative number is rejected with ERR_INVALID_PARAM. The account's plan allowance still applies, so the lower of the two wins (GET /dimensions/projects/{id} returns prompt_limit and stats.prompts_available). A limit below the current count keeps every prompt and refuses new ones until the project is under it; note says what the project can now hold. Account owner or a co-owner with Projects update permission only; a key limited to some projects answers ERR_KEY_PROJECT_SCOPED. The Swift, Kotlin, Dart and R clients leave a null field out of the request body, so they can set a limit but not remove one: remove it with a plain HTTP request that sends prompt_limit as null

pitchboolean

false converts a pitch project into a tracked project. Send it on its own, without other fields; true is rejected

Response

Updated

updated_fieldsstring[] required

The fields the request sent

rematchingboolean required

True when a matching_names or additional_owned_domains change started a background recalculation of past answers; further edits are rejected until it finishes

notestring required

What the change does to mention detection, citation ownership and historical numbers, and, when prompt_limit was sent, how many prompts the project holds and how many more can be added; after pitch false, what the converted project now uses

request_idstring required

Changes