Create a new user-defined keyword signal type and seed its per-source override rows.
keyword-kind signal type for the caller. The handler:
positionsignal_type_sources row per registered datasource adapter (all disabled by default)GET /api/signals/types; this endpoint always produces kind: "keyword".
/api/v1/signals/types.Enable sources after creation. New types ship with every signal_type_sources row disabled. Loop PUT /api/signals/types/{id}/sources/{sourceId} to turn on the adapters the type should query.Populate prompts. scoring_prompt / search_prompt are left empty on creation. Either call updateSignalType directly or POST /api/signals/types/{id}/generate to let AI fill them in from onboarding context.Label collisions return 409. Retry with a suffix ("Pain Point (2)") if a label is already taken.Quota is 20 types per user. The handler returns 400 Maximum of 20 signal types per user once the cap is hit — delete an unused type first.Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Only keyword-kind types can be created through this endpoint. Structured types are the 4 built-ins seeded on first read of GET /api/signals/types.
Display name. Required. Unique per user — a collision returns 409.
1Accepted but ignored by the current handler — scoring_prompt / search_prompt are set via updateSignalType after creation.
Initial keyword list. Defaults to [].
Signal type created.
A user-defined signal type. Max 20 per user.