Skip to main content
PATCH
/
api
/
v1
/
signals
/
types
/
{id}
/
sources
/
{sourceId}
Update per-source settings for a signal type
curl --request PATCH \
  --url https://app.puffle.ai/api/v1/signals/types/{id}/sources/{sourceId} \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "enabled": true,
  "keywords_extra": [
    "<string>"
  ],
  "prompt_override": "<string>"
}
'
{
  "source_id": "news",
  "enabled": true,
  "keywords_extra": [
    "<string>"
  ],
  "prompt_override": "<string>"
}

Overview

Upserts the per-source config row for a single source under a signal type. Use this to tune a single data source without cloning the whole type or touching other sources. Three fields, all optional:
  • enabled — is this source active for this signal type?
  • keywords_extra — additional keywords applied only when searching this source. Max 50 entries.
  • prompt_override — custom classification prompt that replaces the type’s default for this source. Pass null to clear and fall back to the default.
sourceId must be one of the registered source IDs. Invalid values return 400 with the full list in the error message.

AI agent notes

Partial updates only. Omitted fields are preserved. null on prompt_override is meaningful — it clears the override. null on enabled or keywords_extra would be rejected by the schema; just omit them.Per-source surgery. Prefer this over PATCH /api/v1/signals/types/{id} with a new sources array when you only want to toggle one source. Bulk sources updates re-sync every row.At least one field required. Calling PATCH with {} returns 400 No fields to update.This is the public partner API — rate-limited at 100 req/min. Use this rather than the internal /api/signals/types/{id}/sources/{sourceId} endpoint.

Authorizations

Authorization
string
header
required

Bearer authentication header of the form Bearer <token>, where <token> is your auth token.

Path Parameters

id
string<uuid>
required

Signal type UUID.

Pattern: ^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$
sourceId
enum<string>
required

Source identifier — one of the registered source IDs (news, reddit, hacker_news, x_twitter, linkedin_posts, linkedin_jobs, g2_capterra). Note: not a UUID.

Available options:
news,
reddit,
hacker_news,
x_twitter,
linkedin_posts,
linkedin_jobs,
g2_capterra

Body

application/json

At least one field must be supplied. Omitted fields are preserved; null on prompt_override explicitly clears it.

enabled
boolean

Whether this source feeds into the signal type.

keywords_extra
string[]

Additional keywords used ONLY when searching this source. Max 50 entries.

Maximum array length: 50
prompt_override
string | null

Custom classification prompt that replaces the type's default prompt for this source. Set to null to clear and fall back to the default.

Response

Source config updated. Returns the upserted row.

Per-source configuration for a signal type. Lets the user narrow or override behavior on a single source without cloning the whole type.

source_id
enum<string>
required

External data source that feeds signals. A signal type can be scoped to any subset of sources; the scanner fans out across the enabled set and classifies each hit.

Available options:
news,
reddit,
hacker_news,
x_twitter,
linkedin_posts,
linkedin_jobs,
g2_capterra
enabled
boolean
required
keywords_extra
string[]
required

Extra keywords applied ONLY when searching this source (in addition to the type-level keywords).

prompt_override
string | null
required

Custom classification prompt that replaces the type's default prompt when this source fires. Null = use the type's default.