Skip to main content
POST
/
api
/
signals
/
types
Create Signal Type
curl --request POST \
  --url https://app.puffle.ai/api/signals/types \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "label": "<string>",
  "description": "<string>",
  "keywords": [
    "<string>"
  ],
  "prompt": "<string>",
  "allowedSources": [
    "<string>"
  ],
  "sourceOverrides": [
    {
      "sourceId": "<string>",
      "enabled": true,
      "extraKeywords": [
        "<string>"
      ]
    }
  ]
}
'
{
  "type": {
    "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
    "label": "<string>",
    "description": "<string>",
    "builtIn": true,
    "enabled": true,
    "position": 4503599627370495,
    "color": "<string>",
    "keywords": [
      "<string>"
    ],
    "prompt": "<string>",
    "exampleSignals": [
      {
        "source": "<string>",
        "sourceHandle": "<string>",
        "headline": "<string>",
        "timeAgoLabel": "<string>",
        "score": 0
      }
    ],
    "structuredConfig": {},
    "allowedSources": [
      "<string>"
    ],
    "sourceOverrides": [
      {
        "sourceId": "<string>",
        "enabled": true,
        "extraKeywords": [
          "<string>"
        ]
      }
    ]
  }
}
CLI:
puffle signal type create --label <label>
puffle signal type create --label <label> --description <description> --keywords <keywords> --prompt <prompt> --allowed-sources <allowed-sources> --source-overrides <source-overrides>

Overview

Creates a new keyword signal type for the workspace. Color is auto-assigned. Every registered datasource is enabled for the new type by default so it starts participating in scans immediately. Use this when a user wants to track a custom intent pattern beyond the 6 built-ins — for example “talks about migrating off Salesforce” or “mentions hiring a fractional CFO”.

AI agent notes

Keyword types only. Structured types are built-in and not user-creatable. To customize a built-in’s behavior, use Update signal types on its existing row.Cap. A workspace can hold up to 20 signal types total. The endpoint returns 400 once the cap is reached.Uniqueness. label must be unique within the workspace. Duplicates return 409.Prompt vs keywords. keywords[] seeds the prefilter; prompt is the natural-language description the LLM uses during classification. Providing both gives the strongest signal.

Authorizations

Authorization
string
header
required

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

Body

application/json

Body for creating a new custom keyword signal type. Structured types are seeded built-in only and are not creatable via API.

label
string
required
Minimum string length: 1
description
string
keywords
string[]
prompt
string
Maximum string length: 4000
allowedSources
string[]
sourceOverrides
object[]

Response

Signal type created.

type
object
required

A user-defined signal type. Max 20 per user.