{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/getoneprofile-ai/json-schema/getoneprofile-ai-account-chart-person-read-schema-schema.json",
  "title": "AccountChartPersonReadSchema",
  "description": "One person on the chart, the line drawn for them, and what reps set.",
  "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/AccountChartPersonReadSchema",
  "properties": {
    "edited_at": {
      "anyOf": [
        {
          "format": "date-time",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Edited At"
    },
    "edited_by_user_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "title": "Edited By User Id"
    },
    "hidden": {
      "description": "Whether a rep hid them from the chart.",
      "title": "Hidden",
      "type": "boolean"
    },
    "hidden_reason": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountHiddenReason"
        },
        {
          "type": "null"
        }
      ],
      "description": "With hidden: why. left: they left the company; wrong_person: the row is not someone at this company; not_relevant: here, but not part of the deal. Null when shown, or when no reason was given."
    },
    "line": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountChartLineReadSchema"
        },
        {
          "type": "null"
        }
      ],
      "description": "The line drawn; None when no source gives one."
    },
    "other_lines": {
      "description": "What weaker sources say, where they name a different manager.",
      "items": {
        "$ref": "#/$defs/AccountChartLineReadSchema"
      },
      "title": "Other Lines",
      "type": "array"
    },
    "person": {
      "$ref": "#/$defs/AccountPersonReadSchema"
    },
    "role": {
      "anyOf": [
        {
          "$ref": "#/$defs/AccountPersonRole"
        },
        {
          "type": "null"
        }
      ],
      "description": "Their part in a deal, as a rep set it."
    },
    "role_set_at": {
      "anyOf": [
        {
          "format": "date-time",
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "When the role was set.",
      "title": "Role Set At"
    },
    "role_set_by_user_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ],
      "description": "Who set the role, when one is set.",
      "title": "Role Set By User Id"
    }
  },
  "required": [
    "person",
    "line",
    "other_lines",
    "role",
    "hidden",
    "edited_by_user_id",
    "edited_at",
    "role_set_by_user_id",
    "role_set_at"
  ],
  "type": "object",
  "$defs": {
    "AccountChartLineReadSchema": {
      "description": "One reporting line, and where it came from.",
      "properties": {
        "column_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The column that states it, for a table's line.",
          "title": "Column Id"
        },
        "confidence": {
          "$ref": "#/$defs/AccountLineConfidence",
          "description": "Confirmed when a source states it; likely when the draft guessed it."
        },
        "loops": {
          "default": false,
          "description": "On a line not drawn: drawing it would close a loop, so the chart leaves it out. The chart's loops name each one a person has not decided.",
          "title": "Loops",
          "type": "boolean"
        },
        "manager_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The manager's person id; None at the top of the chart, or for a manager not on this account.",
          "title": "Manager Id"
        },
        "manager_name": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "A manager not on this account, as the source wrote them.",
          "title": "Manager Name"
        },
        "reason": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The draft's reason, for a likely line.",
          "title": "Reason"
        },
        "set_at": {
          "anyOf": [
            {
              "format": "date-time",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "With a rep's line: when it was set.",
          "title": "Set At"
        },
        "set_by_user_id": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "With a rep's line: who set it.",
          "title": "Set By User Id"
        },
        "source": {
          "$ref": "#/$defs/AccountLineSource",
          "description": "Who gave it: a rep, a table's manager column, the Person researcher, or the free draft."
        },
        "table_id": {
          "anyOf": [
            {
              "format": "uuid",
              "type": "string"
            },
            {
              "type": "null"
            }
          ],
          "description": "The table that states it, for a table's line.",
          "title": "Table Id"
        }
      },
      "required": [
        "source",
        "confidence",
        "manager_id",
        "manager_name",
        "reason",
        "table_id",
        "column_id",
        "set_by_user_id",
        "set_at"
      ],
      "title": "AccountChartLineReadSchema",
      "type": "object"
    },
    "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"
    },
    "AccountHiddenReason": {
      "description": "Why a rep hid a person from the chart (review AC-33). None: not said.",
      "enum": [
        "left",
        "wrong_person",
        "not_relevant"
      ],
      "title": "AccountHiddenReason",
      "type": "string"
    },
    "AccountKeyKind": {
      "description": "Which value of a row named its account.",
      "enum": [
        "website",
        "company_page",
        "email_domain"
      ],
      "title": "AccountKeyKind",
      "type": "string"
    },
    "AccountLineConfidence": {
      "description": "How sure a line is: stated somewhere (confirmed), or the draft's guess (likely).",
      "enum": [
        "confirmed",
        "likely"
      ],
      "title": "AccountLineConfidence",
      "type": "string"
    },
    "AccountLineSource": {
      "description": "Where a reporting line came from.",
      "enum": [
        "rep",
        "table",
        "research",
        "draft"
      ],
      "title": "AccountLineSource",
      "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"
    },
    "AccountPersonReadSchema": {
      "description": "One person at the account, once however many rows name them.",
      "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"
      ],
      "title": "AccountPersonReadSchema",
      "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"
    }
  }
}