{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/lensmor/json-schema/lensmor-contact-item-schema.json",
  "title": "ContactItem",
  "description": "Public personnel/contact record with identity, access state, and optional unlocked values.",
  "x-generated": "2026-11-02",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/lensmor-openapi.json#/components/schemas/ContactItem",
  "type": "object",
  "required": [
    "id",
    "fullName",
    "contactUnlockStatus"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "Personnel identifier to pass to profile, event, email-unlock, phone-unlock, and outreach workflows."
    },
    "fullName": {
      "type": [
        "string",
        "null"
      ],
      "description": "Person's display name when available."
    },
    "title": {
      "type": [
        "string",
        "null"
      ],
      "description": "Current job title when available."
    },
    "department": {
      "type": [
        "string",
        "null"
      ],
      "description": "Normalized department label when available."
    },
    "seniorityLevel": {
      "type": [
        "string",
        "null"
      ],
      "description": "Normalized seniority label when available."
    },
    "linkedinUrl": {
      "type": [
        "string",
        "null"
      ],
      "description": "LinkedIn profile URL when available."
    },
    "companyName": {
      "type": [
        "string",
        "null"
      ],
      "description": "Company associated with the person when available."
    },
    "sourceType": {
      "type": "array",
      "description": "Lensmor source/business labels for this person. Source labels are not mutually exclusive. Product mapping: Exhibitor is exhibitor, Social Signals is social, and Visitor is visitors. Visitor represents registered attendees obtained through organizer or data-provider partnerships; Social Signals is not proof of official registration. Event personnel lists return event-scoped labels, while personnel profile and contact search can aggregate labels across associated events.",
      "items": {
        "type": "string",
        "enum": [
          "exhibitor",
          "social",
          "visitors"
        ]
      }
    },
    "email": {
      "type": [
        "string",
        "null"
      ],
      "description": "Email address when already accessible to the caller; otherwise `null`. Search endpoints do not unlock it."
    },
    "phone": {
      "type": [
        "string",
        "null"
      ],
      "description": "Phone number when already accessible to the caller; otherwise `null`. Search endpoints do not unlock it."
    },
    "contactUnlockStatus": {
      "type": "string",
      "description": "Current email/contact access state for the authenticated API key owner."
    },
    "phoneUnlockStatus": {
      "type": [
        "string",
        "null"
      ],
      "enum": [
        "ready",
        "processing",
        "failed",
        null
      ],
      "description": "Phone unlock state: `ready`, `processing`, `failed`, or `null` when no phone-unlock state is available."
    },
    "linkedinActivity": {
      "type": [
        "object",
        "null"
      ],
      "description": "LinkedIn activity summary when populated by the endpoint; otherwise `null`.",
      "properties": {
        "activityLevel": {
          "type": "string",
          "description": "Normalized LinkedIn activity level."
        },
        "isActive": {
          "type": "boolean",
          "description": "Whether recent LinkedIn activity indicates that the person is active."
        },
        "latestPostAt": {
          "type": [
            "string",
            "null"
          ],
          "description": "Timestamp of the latest known LinkedIn post when available."
        }
      }
    },
    "linkedinActivityStatus": {
      "type": [
        "string",
        "null"
      ],
      "description": "LinkedIn activity analysis state when populated by the endpoint; otherwise `null`."
    },
    "eventCount": {
      "type": [
        "integer",
        "null"
      ],
      "description": "Number of Lensmor events associated with the person when available."
    },
    "outreachMessageStatus": {
      "type": [
        "string",
        "null"
      ],
      "description": "Current outreach generation state when this endpoint includes outreach metadata."
    },
    "outreachMessageChannels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Generated or requested outreach channels when outreach metadata is present."
    }
  }
}