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

# Add Targets

> Add up to 500 targets to a monitor in one request. Each entry may be a company domain or website URL (acme.com, https://www.acme.com/about), a LinkedIn company URL (linkedin.com/company/acme), or a LinkedIn member profile URL (linkedin.com/in/jane-doe — monitors the company that person currently works at). Inputs are normalized (scheme, www., path, and case are stripped) and de-duplicated. The call is idempotent: targets already in the monitor are counted in skipped_existing, not added twice. Entries that are none of the three kinds are returned in invalid and do not fail the request; the request fails with 400 only when no entry is valid, or when it would exceed the team's 1,000-target limit (nothing is added in that case). Targets matched to a known company are resolved immediately; the rest are pending and researched automatically. Free (0 credits).



## OpenAPI

````yaml POST /monitors/{id}/targets
openapi: 3.1.0
info:
  title: Monitoring API
  description: >-
    Manage account monitoring over REST. A monitor is a named group of watch
    targets (company domains, LinkedIn company pages, or LinkedIn member
    profiles) with its own signal-type selection and an optional webhook
    endpoint. Create monitors, add and remove targets, change what a monitor
    listens for, pause it, and delete it. The dashboard Monitoring page calls
    the same code path, so monitors created in either place are fully manageable
    from the other.
  license:
    name: MIT
  version: 2.0.0
servers:
  - url: https://www.trysignalbase.com/api/v2
security:
  - bearerAuth: []
paths:
  /monitors/{id}/targets:
    post:
      summary: Add Targets
      description: >-
        Add up to 500 targets to a monitor in one request. Each entry may be a
        company domain or website URL (acme.com, https://www.acme.com/about), a
        LinkedIn company URL (linkedin.com/company/acme), or a LinkedIn member
        profile URL (linkedin.com/in/jane-doe — monitors the company that person
        currently works at). Inputs are normalized (scheme, www., path, and case
        are stripped) and de-duplicated. The call is idempotent: targets already
        in the monitor are counted in skipped_existing, not added twice. Entries
        that are none of the three kinds are returned in invalid and do not fail
        the request; the request fails with 400 only when no entry is valid, or
        when it would exceed the team's 1,000-target limit (nothing is added in
        that case). Targets matched to a known company are resolved immediately;
        the rest are pending and researched automatically. Free (0 credits).
      operationId: addMonitorTargets
      parameters:
        - $ref: '#/components/parameters/MonitorId'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TargetsAddRequest'
            example:
              targets:
                - acme.com
                - https://www.linkedin.com/company/initech/
                - https://www.linkedin.com/in/jane-doe/
                - not a domain
      responses:
        '200':
          description: Targets processed. added holds only the newly created targets.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TargetsAddResponse'
              example:
                success: true
                data:
                  added:
                    - id: 9530caa4-70c9-49a0-ae3a-dc7f3fe497c3
                      monitor_id: 29681a72-ed3d-41a8-b119-2c2942b34996
                      type: domain
                      value: acme.com
                      status: resolved
                      company:
                        id: 0b9f6f0e-2f0c-4a53-9a44-6d2b8a1c7e11
                        name: Acme
                        slug: acme
                        domain: acme.com
                        industry: Software
                        country: US
                      resolved_at: '2026-09-20T13:10:41.506Z'
                      last_signal_type: funding_round
                      last_signal_at: '2026-09-18T13:08:25.412Z'
                      created_at: '2026-09-20T13:10:41.507Z'
                    - id: f63a838c-4927-43c9-ba73-65fa46edd5c1
                      monitor_id: 29681a72-ed3d-41a8-b119-2c2942b34996
                      type: linkedin_company
                      value: linkedin.com/company/initech
                      status: pending
                      company: null
                      resolved_at: null
                      last_signal_type: null
                      last_signal_at: null
                      created_at: '2026-09-20T13:10:41.507Z'
                    - id: 0279e977-424d-410a-b249-59c74038c187
                      monitor_id: 29681a72-ed3d-41a8-b119-2c2942b34996
                      type: linkedin_profile
                      value: linkedin.com/in/jane-doe
                      status: pending
                      company: null
                      resolved_at: null
                      last_signal_type: null
                      last_signal_at: null
                      created_at: '2026-09-20T13:10:41.507Z'
                  skipped_existing: 0
                  invalid:
                    - not a domain
                  pending:
                    - linkedin.com/company/initech
                    - linkedin.com/in/jane-doe
                  resolved_companies: 1
                meta:
                  endpoint: monitors.targets.add
                  creditsUsed: 0
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/SubscriptionExpired'
        '404':
          $ref: '#/components/responses/MonitorNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '500':
          $ref: '#/components/responses/InternalError'
components:
  parameters:
    MonitorId:
      name: id
      in: path
      required: true
      description: The monitor ID.
      schema:
        type: string
  schemas:
    TargetsAddRequest:
      type: object
      required:
        - targets
      properties:
        targets:
          type: array
          minItems: 1
          maxItems: 500
          items:
            type: string
            minLength: 1
            maxLength: 500
          description: >-
            Company domains or website URLs, LinkedIn company URLs, and/or
            LinkedIn member profile URLs. Each entry ≤ 500 characters.
    TargetsAddResponse:
      type: object
      required:
        - success
        - data
        - meta
      properties:
        success:
          type: boolean
          const: true
        data:
          type: object
          required:
            - added
            - skipped_existing
            - invalid
            - pending
            - resolved_companies
          properties:
            added:
              type: array
              items:
                $ref: '#/components/schemas/Target'
              description: Targets created by this request.
            skipped_existing:
              type: integer
              minimum: 0
              description: Valid entries that were already in the monitor.
            invalid:
              type: array
              items:
                type: string
              description: >-
                Entries (as sent) that are not a domain, LinkedIn company URL,
                or LinkedIn profile URL.
            pending:
              type: array
              items:
                type: string
              description: >-
                Normalized values of the added targets that are not matched to a
                company yet.
            resolved_companies:
              type: integer
              minimum: 0
              description: Distinct resolved companies in the monitor after this request.
        meta:
          $ref: '#/components/schemas/ResponseMeta'
    Target:
      type: object
      required:
        - id
        - monitor_id
        - type
        - value
        - status
        - company
        - resolved_at
        - last_signal_type
        - last_signal_at
        - created_at
      properties:
        id:
          type: string
          description: Unique target ID (UUID).
        monitor_id:
          type: string
        type:
          $ref: '#/components/schemas/TargetType'
        value:
          type: string
          description: >-
            The normalized identifier: a bare domain (acme.com),
            linkedin.com/company/<slug>, or linkedin.com/in/<slug>.
        status:
          $ref: '#/components/schemas/TargetStatus'
        company:
          oneOf:
            - $ref: '#/components/schemas/TargetCompany'
            - type: 'null'
          description: Matched company; null while pending.
        resolved_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When the target was matched to its company; null while pending.
        last_signal_type:
          type:
            - string
            - 'null'
          description: >-
            Type of the company's most recent signal (any type, not only the
            monitor's signal_types), or null.
        last_signal_at:
          type:
            - string
            - 'null'
          format: date-time
          description: When that signal occurred, or null.
        created_at:
          type: string
          format: date-time
    ResponseMeta:
      type: object
      required:
        - endpoint
        - creditsUsed
      properties:
        endpoint:
          type: string
          description: Endpoint identifier (e.g. monitors.create).
        creditsUsed:
          type: integer
          minimum: 0
          description: >-
            API credits consumed by this request. Always 0 for the Monitoring
            API.
    ErrorResponse:
      type: object
      required:
        - success
        - error
        - code
      properties:
        success:
          type: boolean
          const: false
        error:
          type: string
          description: Human-readable error message.
        code:
          type: string
          enum:
            - bad_request
            - invalid_api_key
            - subscription_expired
            - not_found
            - rate_limited
            - internal_server_error
            - internal_error
        retryAfter:
          type: integer
          description: >-
            Seconds until a retry is recommended. Present on rate-limit (429)
            responses.
    TargetType:
      type: string
      enum:
        - domain
        - linkedin_company
        - linkedin_profile
      description: How the target was identified when it was added.
    TargetStatus:
      type: string
      enum:
        - resolved
        - pending
      description: >-
        resolved = matched to a company in the Signalbase database; its signals
        are delivered. pending = not matched yet; it is researched automatically
        and re-checked nightly, and delivers nothing until it resolves.
    TargetCompany:
      type: object
      required:
        - id
        - name
        - slug
        - domain
        - industry
        - country
      description: The company a resolved target was matched to.
      properties:
        id:
          type: string
          description: Signalbase company ID.
        name:
          type:
            - string
            - 'null'
        slug:
          type:
            - string
            - 'null'
        domain:
          type:
            - string
            - 'null'
        industry:
          type:
            - string
            - 'null'
        country:
          type:
            - string
            - 'null'
          description: Headquarters country code.
  responses:
    BadRequest:
      description: >-
        Invalid JSON or field values, an unknown signal type, a non-public
        webhook URL, no valid target in the request, or a team limit was reached
        (20 monitors, 1,000 targets).
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error: >-
              signal_types must be a non-empty array of: funding_round,
              acquisition, job_change, hiring
            code: bad_request
    Unauthorized:
      description: Missing or invalid API key.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error: Invalid API key. No key found.
            code: invalid_api_key
    SubscriptionExpired:
      description: The API key belongs to a team without an active subscription.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error: >-
              Subscription expired. Please upgrade your subscription:
              https://www.trysignalbase.com/#pricing
            code: subscription_expired
    MonitorNotFound:
      description: No monitor with that ID exists for the authenticated team.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error: Monitor not found
            code: not_found
    RateLimited:
      description: >-
        Rate limit exceeded for this team and endpoint. The response also sets
        Retry-After, X-RateLimit-Limit, X-RateLimit-Remaining, and
        X-RateLimit-Reset headers.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error: Too many requests. Please upgrade your plan or slow down.
            code: rate_limited
            retryAfter: 60
    InternalError:
      description: Unexpected server error.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorResponse'
          example:
            success: false
            error: An unknown error occurred
            code: internal_error
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: API key
      description: >-
        Signalbase API key. Include as a Bearer token in the Authorization
        header.

````