> ## Documentation Index
> Fetch the complete documentation index at: https://docs.api.tamtam.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a page follower signal

> Each sweep reads the people who follow a LinkedIn company page and collects them. The page can be anyone's: your own, a competitor's, a partner's, an event or association page. Following a competitor's page is a buying signal in itself.

The signal has no persona or keyword filter of its own: it collects the followers, and deciding which of them are leads (persona fit, lead score, AI QA) is the lead generation program's job. Four filters are applied by the provider during the scrape, so they decide who is read and paid for; read their vocabularies at [List page follower filter values](/api-reference/signals/list-page-follower-filter-values) first, because anything else is refused.

Cost when it runs: up to `max_followers_per_sweep` followers read per sweep, and the read is paid.

**Creating a signal starts nothing and bills nothing.** A signal runs only when a lead generation program picks it: [Start a lead generation run](/api-reference/signals/start-lead-generation-run) sweeps it now and records a program you can put on a schedule under Settings > Signals > Lead generation. [List signals](/api-reference/signals/list-signals) reports `used_by_program_count` per signal; zero means it is defined and never runs. List first, so you do not create a second signal over a question you already ask: duplicates bill twice and split the leads across two names.



## OpenAPI

````yaml /reference/openapi.yaml post /v2/page-follower-signals
openapi: 3.1.0
info:
  title: Tamtam Public API
  version: 2.0.0
servers:
  - url: https://api.tamtam.ai/api
security: []
paths:
  /v2/page-follower-signals:
    post:
      tags:
        - Signals
      summary: Create a page follower signal
      description: >-
        Each sweep reads the people who follow a LinkedIn company page and
        collects them. The page can be anyone's: your own, a competitor's, a
        partner's, an event or association page. Following a competitor's page
        is a buying signal in itself.


        The signal has no persona or keyword filter of its own: it collects the
        followers, and deciding which of them are leads (persona fit, lead
        score, AI QA) is the lead generation program's job. Four filters are
        applied by the provider during the scrape, so they decide who is read
        and paid for; read their vocabularies at [List page follower filter
        values](/api-reference/signals/list-page-follower-filter-values) first,
        because anything else is refused.


        Cost when it runs: up to `max_followers_per_sweep` followers read per
        sweep, and the read is paid.


        **Creating a signal starts nothing and bills nothing.** A signal runs
        only when a lead generation program picks it: [Start a lead generation
        run](/api-reference/signals/start-lead-generation-run) sweeps it now and
        records a program you can put on a schedule under Settings > Signals >
        Lead generation. [List signals](/api-reference/signals/list-signals)
        reports `used_by_program_count` per signal; zero means it is defined and
        never runs. List first, so you do not create a second signal over a
        question you already ask: duplicates bill twice and split the leads
        across two names.
      operationId: create-page-follower-signal
      parameters:
        - description: >-
            Target account UUID. Required for staff callers; ignored for
            customer API keys.
          explode: false
          in: query
          name: account_id
          schema:
            description: >-
              Target account UUID. Required for staff callers; ignored for
              customer API keys.
            type: string
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PageFollowerSignalBody'
        required: true
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SignalCreatedDto'
          description: OK
        default:
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ErrorModel'
          description: Error
      security:
        - apikeyAuth: []
        - bearerAuth: []
components:
  schemas:
    PageFollowerSignalBody:
      additionalProperties: false
      properties:
        countries:
          description: >-
            Provider-side country filter, country NAMES from List page follower
            filter values. Applied during the scrape, so it lowers what each
            sweep costs.
          items:
            type: string
          type:
            - array
            - 'null'
        departments:
          description: >-
            Provider-side department filter, from List page follower filter
            values. Applied during the scrape.
          items:
            type: string
          type:
            - array
            - 'null'
        is_enabled:
          description: Defaults to true.
          type: boolean
        job_titles:
          description: >-
            Provider-side job-title filter, from List page follower filter
            values. Applied during the scrape.
          items:
            type: string
          type:
            - array
            - 'null'
        linkedin_company_url:
          description: >-
            The page to watch: a linkedin.com /company/, /school/ or /showcase/
            URL. Anyone's page, not only your own.
          minLength: 1
          type: string
        max_followers_per_sweep:
          description: >-
            Followers read per sweep. Defaults to 250. The cost dial: reading a
            follower is paid.
          format: int32
          maximum: 1000
          minimum: 1
          type: integer
        name:
          description: >-
            Short label, unique in the account. Name it after the page, e.g.
            'Acme page followers'.
          minLength: 1
          type: string
        seniority_levels:
          description: >-
            Provider-side seniority filter, from List page follower filter
            values. Applied during the scrape.
          items:
            type: string
          type:
            - array
            - 'null'
      required:
        - name
        - linkedin_company_url
      type: object
    SignalCreatedDto:
      additionalProperties: false
      properties:
        id:
          type: string
        is_enabled:
          type: boolean
        kind:
          description: >-
            The kind, as List signals reports it and as a lead generation run
            takes it.
          type: string
        name:
          type: string
        used_by_program_count:
          description: >-
            Always 0 on creation: a signal runs only when a lead generation
            program picks it.
          format: int64
          type: integer
      required:
        - kind
        - id
        - name
        - is_enabled
        - used_by_program_count
      type: object
    ErrorModel:
      additionalProperties: false
      properties:
        detail:
          description: >-
            A human-readable explanation specific to this occurrence of the
            problem.
          examples:
            - Property foo is required but is missing.
          type: string
        errors:
          description: Optional list of individual error details
          items:
            $ref: '#/components/schemas/ErrorDetail'
          type:
            - array
            - 'null'
        instance:
          description: >-
            A URI reference that identifies the specific occurrence of the
            problem.
          examples:
            - https://example.com/error-log/abc123
          format: uri
          type: string
        status:
          description: HTTP status code
          examples:
            - 400
          format: int64
          type: integer
        title:
          description: >-
            A short, human-readable summary of the problem type. This value
            should not change between occurrences of the error.
          examples:
            - Bad Request
          type: string
        type:
          default: about:blank
          description: A URI reference to human-readable documentation for the error.
          examples:
            - https://example.com/errors/example
          format: uri
          type: string
      type: object
    ErrorDetail:
      additionalProperties: false
      properties:
        location:
          description: >-
            Where the error occurred, e.g. 'body.items[3].tags' or
            'path.thing-id'
          type: string
        message:
          description: Error message text
          type: string
        value:
          description: The value at the given location
      type: object
  securitySchemes:
    apikeyAuth:
      description: Account API key passed in the Authorization header
      in: header
      name: Authorization
      type: apiKey
    bearerAuth:
      description: Bearer JWT obtained via the OAuth 2.1 authorization flow
      scheme: bearer
      type: http

````