Skip to main content
PUT
/
api
/
signals
/
types
/
{id}
/
sources
/
{sourceId}
Update a per-source setting on a signal type
curl --request PUT \
  --url https://app.puffle.ai/api/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": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "signal_type_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "source_id": "<string>",
    "enabled": true,
    "keywords_extra": [
      "<string>"
    ],
    "prompt_override": "<string>",
    "created_at": "2023-11-07T05:31:56Z",
    "updated_at": "2023-11-07T05:31:56Z"
  }
}

Overview

Upserts one signal_type_sources row for (id, sourceId). If the row exists it’s updated with the fields provided; otherwise a new row is inserted. Fields not mentioned in the body are left untouched. Use this to:
  • Enable or disable a specific datasource for a signal type (without affecting other types)
  • Append extra keywords that only apply to this (type, source) pair
  • Override the classification prompt per source — useful when a source speaks a different vernacular than the signal’s default prompt assumes

AI agent notes

This is the internal UI-facing endpoint. Third-party integrations should prefer the v1 public API under /api/v1/signals/types/{id}/sources/{sourceId}.Override precedence. signal_type_sources.prompt_override takes priority over signal_types.scoring_prompt / search_prompt during classification. Pass null or an empty string to clear an override.keywords_extra merges, not replaces. The pipeline unions the signal’s base keywords with keywords_extra (case-insensitive dedup) when fetching from this source.Account-level toggle. To flip a source on or off across all signal types at once, use PUT /api/signals/sources/config instead — it cascades to every matching signal_type_sources row.

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
string
required

Datasource adapter ID — one of linkedin_posts, reddit, news, linkedin_jobs, hiring_cafe, web_mentions, sec_filings, g2_capterra, bluesky, hacker_news, x_twitter.

Body

application/json

All fields are optional. Only keys present in the body are written. prompt_override: "" is stored as null.

enabled
boolean

Whether this source is queried for this signal type. Cascades separately from the user-level signal_source_configs.enabled toggle.

keywords_extra
string[]

Extra keywords merged with the signal-level keywords (case-insensitive dedup) when fetching from this source.

prompt_override
string | null

If set, overrides the signal's top-level scoring_prompt / search_prompt when classifying results from this source. Pass null or an empty string to clear.

Response

Row upserted. Returns the current state of the row.

source
object
required