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

# Create Contact Radar

> Create a contact radar for person-level tracking.



## OpenAPI

````yaml /api_specs.yaml POST /v1/radars/contacts
openapi: 3.0.0
info:
  title: TAMradar API
  version: '1.0'
  description: Canonical OpenAPI spec for TAMradar customer-facing APIs.
servers:
  - url: https://api.tamradar.com
    description: Production API server
security: []
paths:
  /v1/radars/contacts:
    post:
      tags:
        - Radars
      summary: Create a contact radar
      description: >-
        Creates a new contact-based radar for tracking activities of specific
        individuals. Supports tracking job changes at companies or social media
        engagements on posts. Requirements vary by radar type.
      operationId: createContactRadar
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
                - radar_type
              properties:
                radar_type:
                  type: string
                  description: >-
                    The type of contact activity to track. Choose based on your
                    tracking needs:


                    • **contact_job_changes**: Track when someone leaves, gets
                    promoted, or changes roles at a company. Requires domain and
                    at least one identifier (email, profile_url, or full_name).


                    • **contact_social_engagements**: Track when people engage
                    (react, comment, repost) with a specific person's social
                    media posts. Requires profile_url.


                    • **contact_social_posts**: Track social media posts FROM a
                    specific person. Monitors when the contact themselves posts
                    content on social platforms. Requires profile_url.
                  enum:
                    - contact_job_changes
                    - contact_social_engagements
                    - contact_social_posts
                webhook_url:
                  type: string
                  format: uri
                  description: >-
                    URL where we'll send radar findings. Optional — if omitted,
                    the radar is poll-only and updates are available via GET
                    /v1/updates.
                  example: https://webhook.site/your-webhook-id
                profile_url:
                  type: string
                  format: uri
                  description: >-
                    LinkedIn profile URL of the person to track.


                    • For **contact_job_changes**: Optional LinkedIn profile
                    (used alongside other identifiers)

                    • For **contact_social_engagements**: Required LinkedIn
                    profile (this is whose engagement activity we'll track)

                    • For **contact_social_posts**: Required LinkedIn profile
                    (this is whose posts we'll track)


                    Protocol (https://) is automatically added if missing.
                  example: https://www.linkedin.com/in/johndoe
                domain:
                  type: string
                  description: >-
                    Company domain where the contact works.


                    • **Required** for contact_job_changes (the company you're
                    tracking them at)

                    • **Optional** for contact_social_engagements (not needed
                    for social tracking)

                    • **Optional** for contact_social_posts (can be used to
                    associate the contact with a company)


                    Automatically normalized - strips protocol, www, paths.
                  example: stripe.com
                email:
                  type: string
                  format: email
                  description: >-
                    Contact's email address. Used for contact_job_changes only.
                    At least one identifier (email, profile_url, or full_name)
                    required for job change tracking.
                  example: john.doe@stripe.com
                full_name:
                  type: string
                  description: >-
                    Contact's full name. Used for contact_job_changes only. At
                    least one identifier (email, profile_url, or full_name)
                    required for job change tracking.
                  example: John Doe
                custom_fields:
                  type: object
                  description: >-
                    Optional metadata to attach to this radar. Values must be
                    strings only. Use for internal tracking like account_id,
                    customer_id, or deal_stage. Returned with every webhook.
                  additionalProperties: true
                  example:
                    account_id: acc_123
                    customer_id: cust_456
                    deal_stage: negotiation
            examples:
              contact_job_changes:
                value:
                  domain: stripe.com
                  radar_type: contact_job_changes
                  webhook_url: https://webhook.site/your-webhook-id
                  email: john.doe@stripe.com
                  profile_url: https://example.social/profile/johndoe
                  full_name: John Doe
                  custom_fields:
                    account_id: acc_123
                    customer_id: cust_456
                    deal_stage: negotiation
              contact_social_engagements:
                value:
                  radar_type: contact_social_engagements
                  webhook_url: https://webhook.site/your-webhook-id
                  profile_url: https://example.social/profile/johndoe
                  custom_fields:
                    account_id: acc_123
                    priority: high
              contact_social_posts:
                value:
                  radar_type: contact_social_posts
                  webhook_url: https://webhook.site/your-webhook-id
                  profile_url: https://example.social/profile/sarahjohnson
                  domain: stripe.com
                  custom_fields:
                    account_id: acc_789
                    contact_tier: key-executive
      responses:
        '201':
          description: Radar created successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    enum:
                      - success
                  code:
                    type: integer
                    enum:
                      - 201
                  message:
                    type: string
                  data:
                    type: object
                    properties:
                      radar_id:
                        type: string
                        format: uuid
                      radar_type:
                        type: string
                      domain:
                        type: string
                        nullable: true
                        description: >-
                          Domain where contact works. Null for
                          contact_social_engagements when no domain provided.
                      webhook_url:
                        type: string
                        format: uri
                      radar_status:
                        type: string
                        enum:
                          - active
                        default: active
                      created_at:
                        type: string
                        format: date-time
                      deactivated_at:
                        type: string
                        format: date-time
                        nullable: true
                      next_charge_at:
                        type: string
                        format: date-time
                        nullable: true
                      custom_fields:
                        type: object
                      email:
                        type: string
                        format: email
                        nullable: true
                        description: Contact's email address if provided
                      profile_url:
                        type: string
                        format: uri
                        nullable: true
                        description: LinkedIn profile URL of the contact if provided
                      full_name:
                        type: string
                        nullable: true
                        description: Contact's full name if provided
                  timestamp:
                    type: string
                    format: date-time
              examples:
                contact_job_changes_response:
                  value:
                    status: success
                    code: 201
                    timestamp: '2024-03-20T10:15:30.000Z'
                    message: Radar created successfully
                    data:
                      radar_id: 12f96f87-4ce9-49fa-bf09-ca08b23015a6
                      radar_type: contact_job_changes
                      domain: stripe.com
                      webhook_url: https://webhook.site/your-webhook-id
                      radar_status: active
                      created_at: '2024-03-20T10:15:30.000Z'
                      deactivated_at: null
                      next_charge_at: '2024-04-20T10:15:30.000Z'
                      custom_fields:
                        account_manager: sarah.smith
                        deal_value: '50000'
                        tags: key-account, enterprise
                      email: john.doe@stripe.com
                      profile_url: https://example.social/profile/johndoe
                      full_name: John Doe
                contact_social_engagements_response:
                  value:
                    status: success
                    code: 201
                    timestamp: '2024-03-20T10:15:30.000Z'
                    message: Radar created successfully
                    data:
                      radar_id: 05c4db36-3d28-4475-a4e8-52e0fcf58477
                      radar_type: contact_social_engagements
                      domain: null
                      webhook_url: https://webhook.site/your-webhook-id
                      radar_status: active
                      created_at: '2024-03-20T10:15:30.000Z'
                      deactivated_at: null
                      next_charge_at: '2024-04-20T10:15:30.000Z'
                      custom_fields:
                        account_manager: sarah.smith
                        priority: high
                      profile_url: https://example.social/profile/johndoe
                contact_social_posts_response:
                  value:
                    status: success
                    code: 201
                    timestamp: '2024-03-20T10:15:30.000Z'
                    message: Radar created successfully
                    data:
                      radar_id: 8a2f5b12-9c4e-4d8a-b3f6-7e9a1c2d3456
                      radar_type: contact_social_posts
                      domain: stripe.com
                      webhook_url: https://webhook.site/your-webhook-id
                      radar_status: active
                      created_at: '2024-03-20T10:15:30.000Z'
                      deactivated_at: null
                      next_charge_at: '2024-04-20T10:15:30.000Z'
                      custom_fields:
                        account_id: acc_789
                        contact_tier: key-executive
                      profile_url: https://example.social/profile/sarahjohnson
        '400':
          description: Invalid request data
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                missing_identifiers:
                  summary: Missing required fields for radar type
                  value:
                    status: error
                    code: 400
                    message: Invalid request body
                    errors:
                      - field: radar_configuration
                        reason: >-
                          Invalid radar configuration - check required fields
                          for your radar type
                    timestamp: '2026-04-23T17:05:26.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
                invalid_email:
                  summary: Invalid email format
                  value:
                    status: error
                    code: 400
                    message: Invalid request body
                    errors:
                      - field: email
                        reason: Invalid email
                    timestamp: '2026-04-23T17:05:26.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
                invalid_profile_url:
                  summary: Invalid profile URL
                  value:
                    status: error
                    code: 400
                    message: Invalid request body
                    errors:
                      - field: profile_url
                        reason: Expected URL, received string
                    timestamp: '2026-04-23T17:05:26.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
        '401':
          description: Authentication required - Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                missing_api_key:
                  summary: Missing API key
                  value:
                    status: error
                    code: 401
                    message: Missing API key
                    errors:
                      - field: x-api-key
                        reason: API key is required
                    timestamp: '2024-03-20T10:15:30.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
                invalid_api_key:
                  summary: Invalid API key format
                  value:
                    status: error
                    code: 401
                    message: Invalid API key format
                    errors:
                      - field: x-api-key
                        reason: Invalid API key format
                    timestamp: '2024-03-20T10:15:30.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
        '402':
          description: Payment Required - Insufficient balance
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                insufficient_balance:
                  summary: Insufficient balance
                  value:
                    status: error
                    code: 402
                    message: Insufficient balance
                    errors:
                      - field: balance
                        reason: You do not have enough balance to create this radar.
                    timestamp: '2024-03-20T10:15:30.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
        '403':
          description: Forbidden - Valid API key but insufficient permissions
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                insufficient_permissions:
                  summary: Insufficient permissions
                  value:
                    status: error
                    code: 403
                    message: Insufficient permissions
                    errors:
                      - field: permission
                        reason: Your API key does not have permission to create radars
                    timestamp: '2024-03-20T10:15:30.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
        '409':
          description: Conflict - contact already being tracked
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                duplicate_contact:
                  summary: Contact already being tracked
                  value:
                    status: error
                    code: 409
                    message: 'Conflict: Radar already exists'
                    errors:
                      - field: domain
                        reason: >-
                          A radar for this person at this company already
                          exists. Conflicting radar_id:
                          2f5fb18f-f9cf-4411-bbef-10f5ef73324f. You can view it
                          using GET /v1/radars/{radar_id}
                    timestamp: '2024-03-20T10:15:30.000Z'
                    error_id: 09e05bd1-398d-4aa9-be52-95dbaaf7adc1
        '429':
          description: >-
            Rate limit exceeded — no operation was performed. Check
            `Retry-After` to know when to retry, or `X-RateLimit-Remaining` to
            know your current budget.
          headers:
            Retry-After:
              schema:
                type: integer
              description: Seconds until your budget is restored
            X-RateLimit-Limit:
              schema:
                type: integer
              description: Your per-minute budget for this endpoint
            X-RateLimit-Remaining:
              schema:
                type: integer
              description: Tokens remaining right now
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                minute_limit:
                  summary: Per-minute budget exhausted
                  value:
                    status: error
                    code: 429
                    message: Per-minute rate limit exceeded. Retry after 45 seconds.
                    errors:
                      - field: rate_limit
                        reason: minute
                    timestamp: '2026-04-23T17:05:26.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
                burst_limit:
                  summary: Per-second burst limit hit
                  value:
                    status: error
                    code: 429
                    message: Per-second burst limit exceeded. Retry after 1 second.
                    errors:
                      - field: rate_limit
                        reason: burst
                    timestamp: '2026-04-23T17:05:26.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
        '500':
          description: Internal Server Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                server_error:
                  summary: Internal server error
                  value:
                    status: error
                    code: 500
                    message: An internal server error occurred.
                    errors: []
                    timestamp: '2024-03-20T10:15:30.000Z'
                    error_id: f72ac8d3-4bca-4f4c-b14a-30af90e3eac2
      security:
        - ApiKeyAuth: []
components:
  schemas:
    ErrorResponse:
      type: object
      required:
        - status
        - code
        - message
        - errors
        - timestamp
        - error_id
      properties:
        status:
          type: string
          enum:
            - error
        code:
          type: integer
          enum:
            - 400
            - 401
            - 402
            - 403
            - 404
            - 409
            - 429
            - 500
            - 503
        message:
          type: string
        errors:
          type: array
          items:
            type: object
            required:
              - field
              - reason
            properties:
              field:
                type: string
              reason:
                type: string
        timestamp:
          type: string
          format: date-time
        error_id:
          type: string
          format: uuid
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key

````