{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/getoneprofile-ai/json-schema/getoneprofile-ai-account-person-read-schema-schema.json",
  "title": "AccountPersonReadSchema",
  "description": "One person at the account, once however many rows name them.",
  "x-generated": "2026-11-10",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/getoneprofile-ai-accounts-api-openapi.yml#/components/schemas/AccountPersonReadSchema",
  "properties": {
    "data_at": {
      "description": "How old what is shown is: when their title last changed.",
      "format": "date-time",
      "title": "Data At",
      "type": "string"
    },
    "department": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountDepartment"
        },
        {
          "type": "null"
        }
      ],
      "description": "The department their title names, read off its words; null if none."
    },
    "email": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Email"
    },
    "email_status": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountEmailStatus"
        },
        {
          "type": "null"
        }
      ],
      "description": "What is known of their address: the verdict of the Verify email column over it, or `bounced`; null when nothing checked it."
    },
    "enrolments": {
      "items": {
        "$ref": "#/$defs/AccountPersonEnrolmentReadSchema"
      },
      "title": "Enrolments",
      "type": "array"
    },
    "id": {
      "description": "The person's id: what a URL or an edit names them by.",
      "format": "uuid",
      "title": "Id",
      "type": "string"
    },
    "key": {
      "description": "The person's key: their LinkedIn profile, else their address.",
      "title": "Key",
      "type": "string"
    },
    "last_contacted_at": {
      "anyOf": [
        {
          "format": "date-time",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Last Contacted At"
    },
    "linkedin_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Linkedin Url"
    },
    "matched_on": {
      "$ref": "#/$defs/AccountKeyKind",
      "description": "What put them on this account: their company's website, its LinkedIn page, or their work address."
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Name"
    },
    "namesake_count": {
      "description": "How many others at the account go by the same name, all of them.",
      "title": "Namesake Count",
      "type": "integer"
    },
    "namesakes": {
      "description": "The others at the account going by the same name, likely the same first, at most 10; their address or profile tells them apart.",
      "items": {
        "$ref": "#/$defs/AccountNamesakeReadSchema"
      },
      "title": "Namesakes",
      "type": "array"
    },
    "replied_at": {
      "anyOf": [
        {
          "format": "date-time",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Replied At"
    },
    "role": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountPersonRole"
        },
        {
          "type": "null"
        }
      ],
      "description": "The part a rep says they play in a deal, set on the org chart."
    },
    "seniority": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountSeniority"
        },
        {
          "type": "null"
        }
      ],
      "description": "How senior their title says they are, read off its words; null with no title. `other` is a title with no rank word."
    },
    "sources": {
      "items": {
        "$ref": "#/$defs/AccountPersonSourceReadSchema"
      },
      "title": "Sources",
      "type": "array"
    },
    "title": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Title"
    }
  },
  "required": [
    "id",
    "key",
    "name",
    "title",
    "email",
    "linkedin_url",
    "matched_on",
    "data_at",
    "last_contacted_at",
    "replied_at",
    "sources",
    "enrolments",
    "seniority",
    "department",
    "email_status",
    "role",
    "namesakes",
    "namesake_count"
  ],
  "type": "object",
  "$defs": {
    "AccountDepartment": {
      "description": "The part of a company a person's title names (review AC-12). None: it names none.\n\nRead off the title's words by a fixed rule (``org_chart.title_department``).",
      "enum": [
        "sales",
        "marketing",
        "customer_success",
        "product",
        "design",
        "engineering",
        "data",
        "it",
        "security",
        "finance",
        "people",
        "operations",
        "legal"
      ],
      "title": "AccountDepartment",
      "type": "string"
    },
    "AccountEmailStatus": {
      "description": "What is known of a person's address (review AC-12). None: nothing checked it.\n\nThe verdict of the Verify email column over the address on their row, the\nwords that column writes; BOUNCED when an email to them bounced, whatever\na check said.",
      "enum": [
        "valid",
        "catch_all",
        "risky",
        "unknown",
        "invalid",
        "disposable",
        "bounced"
      ],
      "title": "AccountEmailStatus",
      "type": "string"
    },
    "AccountKeyKind": {
      "description": "Which value of a row named its account.",
      "enum": [
        "website",
        "company_page",
        "email_domain"
      ],
      "title": "AccountKeyKind",
      "type": "string"
    },
    "AccountNamesake": {
      "description": "What another person at the account going by the same name is to someone (review AC-19).\n\nNames match as their words, case, accents and punctuation gone. LIKELY_SAME:\na full name (two words or more, none a lone letter) and nothing tells them\napart (at most one of them has a LinkedIn profile), so they are likely one\nperson found twice, as a merge leaves them. SAME_NAME: each has a LinkedIn\nprofile of their own, so they are two people, or the name is short of a\nfull one, which says too little. A placeholder (\"LinkedIn Member\") is no\nname, and names no namesakes.",
      "enum": [
        "likely_same",
        "same_name"
      ],
      "title": "AccountNamesake",
      "type": "string"
    },
    "AccountNamesakeReadSchema": {
      "description": "Another person at the account going by the same name (review AC-19).",
      "properties": {
        "email": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Email"
        },
        "id": {
          "description": "Their person id.",
          "format": "uuid",
          "title": "Id",
          "type": "string"
        },
        "kind": {
          "$ref": "#/$defs/AccountNamesake",
          "description": "`likely_same`: nothing tells the two apart, so they are likely one person found twice (a merge often leaves them). `same_name`: each has a LinkedIn profile of their own, or the name is short of a full one (one word, or a lone letter)."
        },
        "linkedin_url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Linkedin Url"
        }
      },
      "required": [
        "id",
        "email",
        "linkedin_url",
        "kind"
      ],
      "title": "AccountNamesakeReadSchema",
      "type": "object"
    },
    "AccountPersonEnrolmentReadSchema": {
      "properties": {
        "bounced": {
          "description": "Whether an email to the person bounced.",
          "title": "Bounced",
          "type": "boolean"
        },
        "enrolment_id": {
          "format": "uuid",
          "title": "Enrolment Id",
          "type": "string"
        },
        "failure_code": {
          "anyOf": [
            {
              "$ref": "#/$defs/EnrolmentFailureCode"
            },
            {
              "type": "null"
            }
          ],
          "description": "What failed, on a failed enrolment only."
        },
        "last_sent_at": {
          "anyOf": [
            {
              "format": "date-time",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Last Sent At"
        },
        "replied_at": {
          "anyOf": [
            {
              "format": "date-time",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "title": "Replied At"
        },
        "sequence_id": {
          "format": "uuid",
          "title": "Sequence Id",
          "type": "string"
        },
        "sequence_name": {
          "title": "Sequence Name",
          "type": "string"
        },
        "status": {
          "$ref": "#/$defs/EnrolmentStatus"
        },
        "stop_reason": {
          "anyOf": [
            {
              "$ref": "#/$defs/StopReason"
            },
            {
              "type": "null"
            }
          ],
          "description": "Why a stopped enrolment stopped, such as a reply; null otherwise."
        }
      },
      "required": [
        "enrolment_id",
        "sequence_id",
        "sequence_name",
        "status",
        "last_sent_at",
        "replied_at",
        "stop_reason",
        "bounced",
        "failure_code"
      ],
      "title": "AccountPersonEnrolmentReadSchema",
      "type": "object"
    },
    "AccountPersonRole": {
      "description": "The part a rep says a person plays in a deal. None: not known.",
      "enum": [
        "champion",
        "budget_holder",
        "decision_maker",
        "influencer",
        "user",
        "blocker"
      ],
      "title": "AccountPersonRole",
      "type": "string"
    },
    "AccountPersonSourceReadSchema": {
      "properties": {
        "record_id": {
          "format": "uuid",
          "title": "Record Id",
          "type": "string"
        },
        "table_id": {
          "format": "uuid",
          "title": "Table Id",
          "type": "string"
        },
        "table_name": {
          "title": "Table Name",
          "type": "string"
        }
      },
      "required": [
        "table_id",
        "table_name",
        "record_id"
      ],
      "title": "AccountPersonSourceReadSchema",
      "type": "object"
    },
    "AccountSeniority": {
      "description": "How senior a person's title says they are (review AC-12). None: no title.\n\nRead off the title's words by a fixed rule (``org_chart.title_seniority``):\na title with no rank word in it is OTHER, never guessed at.",
      "enum": [
        "executive",
        "vp",
        "head",
        "director",
        "manager",
        "senior",
        "other"
      ],
      "title": "AccountSeniority",
      "type": "string"
    },
    "EnrolmentFailureCode": {
      "description": "Which kind of failure stopped a FAILED contact, where the product treats one differently.\n\nStored beside ``failure_reason`` and cleared with it. Most failures carry\nno code: Retry runs the step that broke again. ``CONNECTED_BEFORE_WITHDRAW``\nis a Withdraw that found the person already connected: there is nothing\nto withdraw and nothing to retry, so no Retry offers it.\n``INVITE_LOOK_UNREADABLE`` is the profile look a connection request queued\nto learn its answer, which could not read the relationship: Retry queues\na fresh look rather than sending the request again. ``MISSING_VALUES`` is a\nBrowser use step the contact lacked a value for.",
      "enum": [
        "connected_before_withdraw",
        "invite_look_unreadable",
        "missing_values"
      ],
      "title": "EnrolmentFailureCode",
      "type": "string"
    },
    "EnrolmentStatus": {
      "description": "Where one contact stands in one sequence.\n\nACTIVE rows carry a ``due_at`` and are what the tick claims; CLAIMED is the\nin-flight guard between claim and outcome. PAUSED is a deliberate\nper-contact hold: unclaimable because the tick claims strictly on ACTIVE,\nyet still LIVE. It keeps its step and its one-live-sequence slot, and a\ncompliance stop (reply, unsubscribe) reaches it. Everything else is\nsettled: COMPLETED walked off the end; STOPPED was halted (reply,\nunsubscribe, bounce, manual, company pause); FAILED is terminal;\nSUPPRESSED was on the do-not-contact list;\nSKIPPED_DUPLICATE lost the one-live-sequence-per-contact rule, with the\nreason visible in the grid.\n\nA contact the workspace's recontact rule refuses is STOPPED with\n``StopReason.COOLDOWN``. There is deliberately no held state: a cooldown\nsettles a contact rather than parking them, so nothing here waits on a date\nand nothing lets itself out later.\n\nAWAITING_ACTION is a contact parked behind a task that needs a\nperson or a channel, modelled on PAUSED: live, keeps its step and its\none-live-sequence slot, unclaimable because the tick claims strictly on\nACTIVE, and a compliance stop reaches it. Unlike PAUSED nobody wakes it by\nhand: only the outreach-task sweep does, once the task it waits on is\ndecided or delivered. Deliberately not \"awaiting approval\": an AUTO-mode\nLinkedIn park is waiting for a browser rather than for anyone's approval,\nand this value is the word the Contacts tab shows for both.\n\nPENDING is a draft's roster: in, standing on a step, and NOT live. Binding\nan audience enrols on the spot so the Contacts tab can show who is in, but\na sequence nobody has launched must not hold anybody's one-live-sequence\nslot, or a second sequence written for the same people skips them all.\n``uq_sequence_enrolment_one_live`` leaves PENDING out, the tick never\nclaims it, and launch turns each row ACTIVE, settling the ones another\nsequence took meanwhile as SKIPPED_DUPLICATE.",
      "enum": [
        "pending",
        "active",
        "claimed",
        "paused",
        "awaiting_action",
        "completed",
        "stopped",
        "failed",
        "suppressed",
        "skipped_duplicate"
      ],
      "title": "EnrolmentStatus",
      "type": "string"
    },
    "StopReason": {
      "enum": [
        "reply",
        "unsubscribe",
        "do_not_contact",
        "bounce",
        "manual",
        "company_reply",
        "row_left_audience",
        "row_left_paused",
        "step_removed",
        "removed",
        "cooldown",
        "rejected",
        "mailbox_removed",
        "unread_reply",
        "declined",
        "trashed",
        "trashed_paused"
      ],
      "title": "StopReason",
      "type": "string"
    }
  }
}